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