10

我们想使用ctxsys.context索引类型进行全文搜索。但我很惊讶,这种类型的索引不会自动更新。我们有 300 万份文档,每天约有 10k 次更新/插入/删除。

您对同步和优化 Oracle Text 索引有什么建议?

4

3 回答 3

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 的建议,也许 serverfault 更好?

于 2009-12-16T18:13:23.090 回答
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_* 包可用。

于 2009-12-16T18:50:00.783 回答
2

将其放在这里作为 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 模式下设置索引。它很甜。

于 2016-12-05T23:31:05.517 回答