2

我们最近不得不修复一个错误,即我们的上下文索引无法正确索引我们上传到数据库的任何 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,则索引不会拾取我们上传的任何附件的内容。

我不明白为什么会这样(尽管我会第一个承认我在这方面的知识并不好)。什么REBUILDCREATE不导致它起作用?

每当有人问我们为什么要在创建后立即进行重建时,我们现在只能回答“因为如果我们不这样做就行不通”,这不是一个非常令人满意的答案(或给这件事)...


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

CTX_DDL.SYNC_INDEX('ATTACHMENT_OBJECT_IDX');

该过程本身只包含一些异常处理代码和这个调用 - 不会对此产生任何影响。

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

如果我们然后REBUILD对该索引执行 a ,则该文件被索引,并且从那时起所有新文件也被正确索引。如果我们不这样做,它似乎永远不会工作(注意:我们也尝试在删除并重新创建索引时将工作留在网上,但没想到会奏效 - 它没有)。

4

0 回答 0