Почему этот недавно созданный Oracle Text Index не работает, пока не будет перестроен?

Недавно нам пришлось исправить ошибку с помощью наших контекстных индексов, которые неправильно индексировали содержимое любого из форматов файлов 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 разве это не заставляет это работать?

Всякий раз, когда кто-то спрашивает, почему мы делаем восстановление сразу после создания, все, что мы можем ответить в данный момент, это "потому что это не работает, если мы не делаем", что не очень удовлетворительный ответ, чтобы услышать (или дать в этом отношении)...


У нас есть фоновое задание, которое запускается раз в минуту и ​​вызывает хранимую процедуру, которая вызывает:

CTX_DDL.SYNC_INDEX('ATTACHMENT_OBJECT_IDX');

Сама процедура просто включает в себя некоторый код обработки исключений и этот единственный вызов - ничего, что должно повлиять на это.

Мы перевели работу в автономный режим, в то время как индекс был удален и воссоздан, а затем выкупили его обратно в онлайн после его завершения. Затем мы оставили это задание на несколько минут, чтобы убедиться, что оно не сработало (чего не было), и загрузили наш файл.docx в базу данных. Мы снова подождали, пока задание не запустилось, и проверили, что оно не вышло из строя (опять же, все в порядке), затем попытались найти содержимое этого загруженного файла, которое всегда не давало результатов.

Если мы тогда сделаем REBUILD по этому индексу файл индексируется, и все новые файлы с этого момента также индексируются правильно. Если мы этого не сделаем, это никогда не сработает (примечание: мы также пытались оставить работу онлайн, пока индекс был удален и пересоздан, но не ожидали, что это сработает - и это не сработало).

0 ответов

Другие вопросы по тегам