Почему этот недавно созданный 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
по этому индексу файл индексируется, и все новые файлы с этого момента также индексируются правильно. Если мы этого не сделаем, это никогда не сработает (примечание: мы также пытались оставить работу онлайн, пока индекс был удален и пересоздан, но не ожидали, что это сработает - и это не сработало).