Oracle Text. Как организовать контекстный, регистронезависимый поиск в ORACLE DB?

На помощь придет Oracle Text.  Это штатный компонент для организации поиска по текстовым документам. Ссылка на официальную документацию в источниках.

Почему для контекстного регистронезависимого поиска плохо подходит оператор LIKE '%подстрока%' в паре с оператором UPPER/LOWER?  Возникает проблема подхватывания индекса по фильтруемому полю. Получаем фулскам таблицы.

Чтобы начать использовать возможности Oracle Text по полю по которому будет отбор записей надо построить контекстный индекс. Рассмотрим  примитивный пример

  1. -- создаем таблицу
  2. CREATE TABLE tz_docs ( doc_id NUMBER ( 010 ), text_doc VARCHAR2 ( 04000 CHAR) );
  3. -- наполняем тестовыми данными
  4. INSERT INTO tz_docs VALUES ( 01,#ff0000;">'В 2021 году была организована компания "РОГА И КОПЫТА"' );
  5. INSERT INTO tz_docs VALUES ( 02,#ff0000;">'Рог и копыто изображено на гербе нашего города' );
  6. INSERT INTO tz_docs VALUES ( 03,#ff0000;">'Совершенно отвлеченный текст 01' );
  7. INSERT INTO tz_docs VALUES ( 04,#ff0000;">'Совершенно отвлеченный текст 02' );
  8. -- создаем контекстный индекс
  9. CREATE INDEX idx_docs_01 ON tz_docs (text_doc) INDEXTYPE IS ctxsys.context;
  10. -- делаем запрос
  11. SELECT * FROM tz_docs WHERE CONTAINS ( text_doc, #ff0000;">'рог%&и%&копыт%');

После добавления/изменения записей в таблице контекстный индекс ctxsys.context надо перестраивать. Эту операцию можно повесить на джоб

Источники
https://docs.oracle.com/database/121/CCREF/cqoper.htm
20:33
2.28K
Нет комментариев. Ваш будет первым!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.