我们最近不得不修复我们的上下文索引的错误,而不正确索引我们上传到数据库的任何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
,则会对该文件编制索引,并且从那时起所有新文件也会正确编入索引。如果我们不这样做,它似乎永远不会起作用(注意:我们也尝试将这项工作留在网上,而索引被删除并重新创建,但是没有期望这样做 - 而且它没有)。