我们想使用ctxsys.context
索引类型进行全文搜索。但我很惊讶,这种类型的索引不会自动更新。我们有 300 万份文档,每天约有 10k 次更新/插入/删除。
您对同步和优化 Oracle Text 索引有什么建议?
我们想使用ctxsys.context
索引类型进行全文搜索。但我很惊讶,这种类型的索引不会自动更新。我们有 300 万份文档,每天约有 10k 次更新/插入/删除。
您对同步和优化 Oracle Text 索引有什么建议?
“不自动更新”是什么意思?
索引可以在提交时同步或定期同步。
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)')
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")')
我不需要实时搜索准确性,我们的 DBA 建议定期同步索引,比如每 2 分钟一次。如果你有能力在一夜之间做到这一点,那就更好了。什么是最好的取决于您的负载和文档的大小。
这些链接可能会为您提供更多信息:
对于 DBA 的建议,也许 serverfault 更好?
我认为 'SYNC EVERY' 选项,如先前答案中所述,仅在 Oracle 10g 或更高版本中可用。如果您使用的是旧版本的 Oracle,则必须定期运行同步操作。例如,您可以创建以下存储过程:
CREATE OR REPLACE
Procedure sync_ctx_indexes
IS
CURSOR sql1 is select distinct(pnd_index_owner||'.'||pnd_index_name) as index_name from ctx_pending;
BEGIN
FOR rec1 IN sql1 LOOP
ctx_ddl.sync_index(rec1.index_name);
END LOOP;
END;
然后安排它通过 DBMS_JOB 运行:
DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720');
至于索引优化,可以使用以下命令(也可以使用 DBMS_JOB 或通过 cron 进行调度):
alter index my_index rebuild online parameters('optimize full maxtime 60');
还有具有类似功能的 CTX_* 包可用。
将其放在这里作为 Oracle 12C 用户的更新。如果您在实时模式下使用索引,那么它将项目保存在内存中,并定期推送到主表,从而减少碎片并启用对流内容的 NRT 搜索。这是设置方法
exec ctx_ddl.drop_preference ( 'your_tablespace' );
exec ctx_ddl.create_preference( 'your_tablespace', 'BASIC_STORAGE' );
exec ctx_ddl.set_attribute ( 'your_tablespace', 'STAGE_ITAB', 'true' );
create index some_text_idx on your_table(text_col) indextype is ctxsys.context PARAMETERS ('storage your_tablespace sync (on commit)')
这将在 NRT 模式下设置索引。它很甜。