CTX_DDL в PL/SQL — полное руководство с 50 примерами

🟢 CTX_DDL в PL/SQL. Введение

Пакет CTX_DDL — основной инструмент DDL для Oracle Text.
С его помощью создаются и настраиваются преференсы (LEXER, WORDLIST, STOPLIST, STORAGE, DATASTORE, FILTER), секционные группы, а также выполняются операции обслуживания индексов CONTEXT:
SYNC_INDEX, OPTIMIZE_INDEX и т.д.

Введение

В статье — 50 практических примеров, охватывающих создание преференсов, настройку атрибутов,
секций, стоп-слов, и обслуживание индекса. Во всех PL/SQL-блоках нет строки / после END;.

Подготовка тестовых данных

CREATE TABLE docs (
  id   NUMBER PRIMARY KEY,
  text CLOB
);

INSERT INTO docs (id, text) VALUES (1, 'Oracle Text позволяет полнотекстовый поиск по документам.');
INSERT INTO docs (id, text) VALUES (2, 'CTX_DDL используется для создания и настройки преференсов.');
COMMIT;

50 примеров использования CTX_DDL

1. Создание BASIC_LEXER

BEGIN
  CTX_DDL.CREATE_PREFERENCE('lex_basic','BASIC_LEXER');
END;

2. Включение BASE_LETTER для BASIC_LEXER

BEGIN
  CTX_DDL.SET_ATTRIBUTE('lex_basic','BASE_LETTER','YES');
END;

3. Создание BASIC_STOPLIST

BEGIN
  CTX_DDL.CREATE_PREFERENCE('stop_basic','BASIC_STOPLIST');
END;

4. Добавление стоп-слова в стоплист

BEGIN
  CTX_DDL.ADD_STOPWORD('stop_basic','oracle');
END;

5. Удаление стоп-слова из стоплиста

BEGIN
  CTX_DDL.DROP_STOPWORD('stop_basic','oracle');
END;

6. Создание BASIC_WORDLIST

BEGIN
  CTX_DDL.CREATE_PREFERENCE('wl_basic','BASIC_WORDLIST');
END;

7. Включение префиксного индекса в WORDLIST

BEGIN
  CTX_DDL.SET_ATTRIBUTE('wl_basic','PREFIX_INDEX','TRUE');
  CTX_DDL.SET_ATTRIBUTE('wl_basic','PREFIX_MIN_LENGTH','2');
  CTX_DDL.SET_ATTRIBUTE('wl_basic','PREFIX_MAX_LENGTH','5');
END;

8. Настройка стеммера WORDLIST

BEGIN
  CTX_DDL.SET_ATTRIBUTE('wl_basic','STEMMER','RUSSIAN');
END;

9. Создание DIRECT_DATASTORE

BEGIN
  CTX_DDL.CREATE_PREFERENCE('ds_direct','DIRECT_DATASTORE');
END;

10. Создание FILE_DATASTORE (директория UTL_DIR)

BEGIN
  CTX_DDL.CREATE_PREFERENCE('ds_file','FILE_DATASTORE');
  CTX_DDL.SET_ATTRIBUTE('ds_file','DIRECTORY','DOCS_DIR');
END;

11. Создание URL_DATASTORE

BEGIN
  CTX_DDL.CREATE_PREFERENCE('ds_url','URL_DATASTORE');
  CTX_DDL.SET_ATTRIBUTE('ds_url','TIMEOUT','30');
END;

12. Создание USER_DATASTORE (процедура получения текста)

BEGIN
  CTX_DDL.CREATE_PREFERENCE('ds_user','USER_DATASTORE');
  CTX_DDL.SET_ATTRIBUTE('ds_user','PROCEDURE','my_user_datastore_proc');
END;

13. Создание AUTO_FILTER

BEGIN
  CTX_DDL.CREATE_PREFERENCE('flt_auto','AUTO_FILTER');
END;

14. Создание BASIC_STORAGE

BEGIN
  CTX_DDL.CREATE_PREFERENCE('st_basic','BASIC_STORAGE');
END;

15. Настройка STORAGE (например, параметров I_TABLE)

BEGIN
  CTX_DDL.SET_ATTRIBUTE('st_basic','I_TABLE_CLAUSE','PCTFREE 10 INITRANS 4');
END;

16. Смена атрибута лексера: обработка регистров

BEGIN
  CTX_DDL.SET_ATTRIBUTE('lex_basic','MIXED_CASE','YES');
END;

17. Создание HTML_SECTION_GROUP

BEGIN
  CTX_DDL.CREATE_SECTION_GROUP('sg_html','HTML_SECTION_GROUP');
END;

18. Добавление FIELD-секции (TITLE)

BEGIN
  CTX_DDL.ADD_FIELD_SECTION('sg_html','title','TITLE',TRUE);
END;

19. Добавление ZONE-секции (H1)

BEGIN
  CTX_DDL.ADD_ZONE_SECTION('sg_html','h1','H1');
END;

20. Создание XML_SECTION_GROUP

BEGIN
  CTX_DDL.CREATE_SECTION_GROUP('sg_xml','XML_SECTION_GROUP');
END;

21. Добавление ZONE-секции (xml:abstract)

BEGIN
  CTX_DDL.ADD_ZONE_SECTION('sg_xml','abstract','ABSTRACT');
END;

22. Создание BASIC_SECTION_GROUP

BEGIN
  CTX_DDL.CREATE_SECTION_GROUP('sg_basic','BASIC_SECTION_GROUP');
END;

23. Удаление секции из группы

BEGIN
  CTX_DDL.DROP_SECTION('sg_html','title');
END;

24. Удаление секционной группы

BEGIN
  CTX_DDL.DROP_SECTION_GROUP('sg_basic');
END;

25. Удаление преференсов, если не нужны

BEGIN
  CTX_DDL.DROP_PREFERENCE('ds_url');
END;

26. Создание CONTEXT индекса с преференсами

CREATE INDEX idx_docs ON docs(text)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS (
  'LEXER lex_basic STOPLIST stop_basic WORDLIST wl_basic DATASTORE ds_direct STORAGE st_basic SECTION GROUP sg_html'
);

27. Синхронизация индекса после DML

BEGIN
  CTX_DDL.SYNC_INDEX('IDX_DOCS');
END;

28. Синхронизация с указанием памяти

BEGIN
  CTX_DDL.SYNC_INDEX('IDX_DOCS','2M');
END;

29. Оптимизация индекса (FAST)

BEGIN
  CTX_DDL.OPTIMIZE_INDEX('IDX_DOCS','FAST');
END;

30. Оптимизация индекса (FULL)

BEGIN
  CTX_DDL.OPTIMIZE_INDEX('IDX_DOCS','FULL');
END;

31. Оптимизация PHRASE (фразовые данные)

BEGIN
  CTX_DDL.OPTIMIZE_INDEX('IDX_DOCS','PHRASE');
END;

32. Переиндексация после смены атрибутов преференсов

ALTER INDEX idx_docs REBUILD;

33. Поиск по секции (TITLE)

SELECT * FROM docs WHERE CONTAINS(text, 'within title (Oracle)') > 0;

34. Поиск с префиксами

SELECT * FROM docs WHERE CONTAINS(text, 'CTX*') > 0;

35. Добавление стоп-слова и синхронизация

BEGIN
  CTX_DDL.ADD_STOPWORD('stop_basic','и');
END;

BEGIN
  CTX_DDL.SYNC_INDEX('IDX_DOCS');
END;

36. Удаление стоп-слова и синхронизация

BEGIN
  CTX_DDL.DROP_STOPWORD('stop_basic','и');
END;

BEGIN
  CTX_DDL.SYNC_INDEX('IDX_DOCS');
END;

37. Включение SUBSTRING_INDEX

BEGIN
  CTX_DDL.SET_ATTRIBUTE('wl_basic','SUBSTRING_INDEX','TRUE');
END;

38. Ограничение WILDCARD_MAXTERMS

BEGIN
  CTX_DDL.SET_ATTRIBUTE('wl_basic','WILDCARD_MAXTERMS','5000');
END;

39. Настройка FILE_DATASTORE на подкаталог

BEGIN
  CTX_DDL.SET_ATTRIBUTE('ds_file','PATH','/docs/incoming');
END;

40. Переключение индекса на FILE_DATASTORE

DROP INDEX idx_docs;

CREATE INDEX idx_docs ON docs(text)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS (
  'LEXER lex_basic STOPLIST stop_basic WORDLIST wl_basic DATASTORE ds_file STORAGE st_basic SECTION GROUP sg_html'
);

41. Обновление лексера: BASE_LETTER=NO

BEGIN
  CTX_DDL.SET_ATTRIBUTE('lex_basic','BASE_LETTER','NO');
END;

42. Создание AUTO_SECTION_GROUP

BEGIN
  CTX_DDL.CREATE_SECTION_GROUP('sg_auto','AUTO_SECTION_GROUP');
END;

43. XML секция: <doc>

BEGIN
  CTX_DDL.ADD_ZONE_SECTION('sg_xml','doc','DOC');
END;

44. Переключение индекса на новую секционную группу

ALTER INDEX idx_docs REBUILD PARAMETERS ('SECTION GROUP sg_xml');

45. USER_DATASTORE: процедура

CREATE OR REPLACE PROCEDURE my_user_datastore_proc(rid IN ROWID, tlob IN OUT NOCOPY CLOB) AS
BEGIN
  SELECT text INTO tlob FROM docs WHERE ROWID = rid;
END;

46. Переключение индекса на USER_DATASTORE

DROP INDEX idx_docs;

CREATE INDEX idx_docs ON docs(text)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS (
  'LEXER lex_basic STOPLIST stop_basic WORDLIST wl_basic DATASTORE ds_user STORAGE st_basic SECTION GROUP sg_html'
);

47. Быстрая оптимизация после массовых загрузок

BEGIN
  CTX_DDL.OPTIMIZE_INDEX('IDX_DOCS','FAST');
END;

48. Полная оптимизация для компактности

BEGIN
  CTX_DDL.OPTIMIZE_INDEX('IDX_DOCS','FULL');
END;

49. Очистка: удаление ненужных преференсов

BEGIN
  CTX_DDL.DROP_PREFERENCE('ds_file');
  CTX_DDL.DROP_PREFERENCE('flt_auto');
END;

50. Очистка: удаление секций и группы

BEGIN
  CTX_DDL.DROP_SECTION('sg_html','h1');
  CTX_DDL.DROP_SECTION_GROUP('sg_html');
END;

Заключение

Пакет CTX_DDL закрывает цикл DDL-операций Oracle Text: от создания преференсов и секций
до обслуживания индекса (SYNC/OPTIMIZE). Примеры можно комбинировать под ваши задачи.

Полезные ссылки

  • Представления CTX_% для диагностики (например, CTX_PARAMETERS, CTX_USER_INDEXES)

Ссылка на вендора
Oracle — CTX_DDL Package (официальная документация)


 

Понравилась статья? Поделиться с друзьями: