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 (официальная документация)