为什么这个新创建的Oracle Text Index在重建之前不能正常工作?

时间:2014-06-19 15:25:46

标签: sql oracle indexing oracle-text

我们最近不得不修复我们的上下文索引的错误,而不正确索引我们上传到数据库的任何Office Open XML文件格式的内容。我们最终得到的SQL类似于:

BEGIN
  CTX_DDL.CREATE_PREFERENCE('"CX_OBJECT_DST"', 'MULTI_COLUMN_DATASTORE');
  -- DESCRIPTION and FILENAME are both VARCHAR2, OBJECT is a BLOB
  CTX_DDL.SET_ATTRIBUTE('"CX_OBJECT_DST"', 'COLUMNS', 'DESCRIPTION,FILENAME,OBJECT');
  CTX_DDL.SET_ATTRIBUTE('"CX_OBJECT_DST"', 'FILTER', 'N,N,Y');
END;
/

DROP INDEX SCHEMA_NAME.ATTACHMENT_OBJECT_IDX;

CREATE INDEX SCHEMA_NAME.ATTACHMENT_OBJECT_IDX
    ON SCHEMA_NAME.ATTACHMENT (OBJECT)
    INDEXTYPE IS CTXSYS.CONTEXT
    PARAMETERS('datastore CX_OBJECT_DST')
    NOPARALLEL;

ALTER INDEX SCHEMA_NAME.ATTACHMENT_OBJECT_IDX REBUILD;

这是在Oracle 11.2.0.4数据库上。

乍一看,在创建索引之后立即重建索引似乎违反直觉。但我们发现,如果我们省略REBUILD,则索引不会获取我们上传的任何附件的内容。

我不明白为什么会这样(虽然我会第一个承认我在这方面的知识并不好)。 REBUILD CREATE做了什么导致这种情况无效?

每当有人问我们为什么会在创建后立即进行重建时,我们现在只能回复的是#34; ,因为如果我们不这样做,它就无法工作",听到(或为此事提供)并不是非常令人满意的答案......


我们有一个后台作业,每分钟运行一次,调用一个调用的存储过程:

CTX_DDL.SYNC_INDEX('ATTACHMENT_OBJECT_IDX');

程序本身只包含一些异常处理代码和这一个调用 - 没有任何可能对此产生影响。

当索引被删除并重新创建时,我们将作业脱机,然后在完成后将其重新购买。然后,我们将该作业运行了几分钟以确保它没有失败(它不是),然后将我们的.docx文件上传到数据库。我们再次等到作业运行并验证它没有失败(再次,它没问题),然后尝试搜索上传文件的内容,该文件始终没有返回结果。

如果我们对该索引执行REBUILD,则会对该文件编制索引,并且从那时起所有新文件也会正确编入索引。如果我们不这样做,它似乎永远不会起作用(注意:我们也尝试将这项工作留在网上,而索引被删除并重新创建,但是没有期望这样做 - 而且它没有)。

0 个答案:

没有答案