我们希望使用ctxsys.context
索引类型进行全文搜索。但我很惊讶,这种类型的索引不会自动更新。我们有300万份文件,每天更新/插入/删除约10万次。
您对同步和优化Oracle Text索引的建议是什么?
答案 0 :(得分:16)
“不自动更新”是什么意思?
索引可以在提交时定期或定期同步。
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建议,也许服务器故障更好?
答案 1 :(得分:3)
我认为'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_ *包具有类似的功能。
答案 2 :(得分:1)
将此作为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模式下设置索引。它很可爱。