
Теперь Manticore Search поддерживает прямое указание настроек токенизации непосредственно в команде CREATE TABLE. Таким образом, исчезает необходимость создавать внешние файлы при настройке стоп-слов, исключений, словоформ и слов без позиций, что делает создание таблиц проще и удобнее.
Новые возможности
RT режим теперь поддерживает четыре новых параметра конфигурации:
stopwords_list— задаёт список стоп-слов прямо в определении таблицы.exceptions_list— позволяет определять исключения токенизации.wordforms_list— добавляет словоформы.hitless_words_list— слова без позиций.
Все перечисленные опции используют точку с запятой (;) в качестве разделителя записей, благодаря чему легко интегрируются с интерфейсами SQL и HTTP JSON.
Какие проблемы это решает
Ранее настройка словарей токенизации предполагала использование внешних файлов, которые читались движком Manticore при создании индексов. Этот подход имеет ряд недостатков:
Проблемы прав доступа к файлам
При работе веб-приложений под учетными записями с ограничениям по правам часто возникали трудности с созданием файлов в каталогах, которые одновременно:
доступны для записи процессом веб-сервера,
доступны дл�� чтения процессом демона Manticore.
Особенно остро эта проблема проявлялась в виртуальных хостинговых средах, где приложения работают под ограниченными пользователями (например, в Virtualmin), а домашние директории пользователей обычно доступны только владельцу, тогда как системные папки имеют строгие права доступа.
Неправильная очистка временных файлов
Использование /tmp/ создаёт дополнительную проблему: наличие стики-бита препятствует правильной очистке файлов со стоп-словами. При частых перестроениях индекса накапливаются ненужные файлы, которые занимают пространство на диске и усложняют обслуживание системы.
Управление жизненным циклом файла
При частом создании и удалении таблиц управление сопутствующими файлами становится неудобным. Разработчикам приходится вручную:
Создавать файл перед созданием таблицы.
Следить, чтобы файл был читаем для демона Manticore.
Не забывать удалять файл при удалении таблицы, если требуется.
Этот ручной процесс подвержен ошибкам.
Как работают новые настройки?
Новые параметры позволяют указывать настройки прямо в инструкции CREATE TABLE. Ранее команда SHOW CREATE TABLE показывала пути к внешним файлам, а сами словари хранились отдельно. Теперь словарь хранится прямо в описании таблицы (хотя внутренне всё равно сохраняется в файлах каталога таблицы, аналогично внешнему способу).Команда SHOW CREATE TABLE показывает полный перечень настроек словаря (например, stopwords_list='a; the; an'), что упрощает работу с версиями и обмен конфигурациями. Таблица сама по себе переносима между разными окружениями.
Примеры использованияСтоп-слова
Вместо старого способа, подразумевающего внешний файл:
CREATE TABLE products(title text, price float) stopwords = '/usr/local/manticore/data/stopwords.txt'
Можно задать стоп-слова прямо в таблице:
CREATE TABLE products(title text, price float) stopwords_list = 'a; the; an; and; or; but'
Исключения
Исключения (синонимы) можно определить прямо в команде:
CREATE TABLE products(title TEXT, price FLOAT) exceptions_list='AT&T => ATT; MS Windows => ms windows; C++ => cplusplus';
Словоформы
Отображение форм слов можно указать сразу же:
CREATE TABLE products(title TEXT, price FLOAT) wordforms_list='walks > walk; walked > walk; walking > walk';
Слова без позиции
Слова без позиции тоже конфигурируются прямо в CREATE TABLE:
CREATE TABLE products(title TEXT, price FLOAT) hitless_words_list='hello; world; test';
Комбинированное использование
Вы можете объединить все эти опции в одной команде CREATE TABLE:
CREATE TABLE products(title TEXT, price FLOAT) stopwords_list='a; the; an' exceptions_list='AT&T => ATT' wordforms_list='walks > walk; walked > walk' hitless_words_list='hello; world';
Когда удобно использовать встроенную конфигурацию?
Встроенная конфигурация особенно удобна в случаях:
Списков небольшого размера (обычно менее сотни элементов). Для больших словарей объёмные файлы остаются предпочтительнее.
Динамического создания таблиц: ваше приложение автоматически создаёт и удаляет таблицы с разными настройками токенизации, что затрудняет ручное управление файлами.
Ограниченного доступа к файловой системе: система работает в среде с ограниченными правами доступа (общий хостинг, контейнеры и т.п.).
Упрощённого развёртывания: вы хотите избежать управления дополнительными файлами в процессе развёртывания приложения.
Когда лучше оставить внешние файлы?
Несмотря на удобство встроенной конфигурации, внешние файлы остаются лучшим решением в следующих ситуациях:
Большие словари: тысячи записей сложно поддерживать в командной строке
CREATE TABLE.Совместно используемые словари: если тот же словарь используется несколькими таблицами, единый внешний файл позволит применять одну версию словаря многократно, сокращая дублирование.
Контроль версий: внешние файлы легко отслеживаются системами контроля версий, облегчая проверку изменений и ведение истории.
Динамические обновления: обновление словарей без перезагрузки таблиц возможно путём изменения внешнего файла и последующего выполнения команды
ALTER TABLE <таблица_имя> RECONFIGURE.Сложное форматирование: очень сложные правила словоформ или исключений легче редактировать в отдельных файлах с комментариями.
Наследуемость: если у вас уже настроены хорошо поддерживаемые внешние файлы словарей, миграция необязательна, пока вы не столкнетесь с проблемами, которые решает новый режим работы.
Формат строк и особенности синтаксиса
Разделители
Во всех опциях типа _list используется точка с запятой (;) для разделения записей. Пробелы вокруг точки с запятой игнорируются, поэтому строки вида word1; word2 и word1 ; word2 эквивалентны.
Экранирование
Если вам нужно включить точку с запятой как часть значения (а не разделитель), экранируйте её обратным слешем (\;):
exceptions_list='test\;value => testvalue; another => mapping'
Это создаст два исключения:
test;value→testvalueanother→mapping
Защищённая точка с запятой (\;) воспринимается буквально как символ, а не как разделитель.
Словоформы
Словоформы поддерживают два варианта разделителей: знак больше (>) и стрелочку (=>):
wordforms_list='word1 > form1; word2 => form2'
Исключения
Правила исключений используют стрелочку (=>) для отделения исходной формы от целевой:
exceptions_list='исходная форма => целевая форма'
Практический пример: cтоп-слова, словоформы и исключения вместе
Вот простой пример использования встроенных стоп-слов, словоформ и исключений в одной таблице. Словоформы нормализуют разные варианты написания ("learning" → "learn"), а исключения сопоставляют сокращения с полными формами ("JS" → "JavaScript").
CREATE TABLE articles(id bigint, title text) stopwords_list = 'a; the; an; and; or; but; in; on; at; to; for; of; with' wordforms_list = 'learning > learn; programming > program; reference > refer; introduction > intro; complete > complet; basics > basic' exceptions_list = 'JS => javascript; ML => machine learning'; INSERT INTO articles VALUES (1, 'The Quick Guide to Python Programming'), (2, 'A Complete Reference for JavaScript'), (3, 'An Introduction to Machine Learning'), (4, 'Python Programming Basics'), (5, 'Getting Started with JS');
Результаты запросов
Стоп-слова: запросы с и без стоп-слов возвращают одинаковые результаты.
SELECT * FROM articles WHERE MATCH('python');
id | title |
|---|---|
1 | The Quick Guide to Python Programming |
4 | Python Programming Basics |
SELECT * FROM articles WHERE MATCH('the python');
id | title |
|---|---|
1 | The Quick Guide to Python Programming |
4 | Python Programming Basics |
Словоформы: "learn" соответствует форме "Learning":
SELECT * FROM articles WHERE MATCH('learn');
id | title |
|---|---|
3 | An Introduction to Machine Learning |
Исключения: правило JS => javascript преобразует "JS" в "javascript", позволяя обоим вариантам запроса выдавать одинаковый результат:
SELECT * FROM articles WHERE MATCH('JavaScript');
id | title |
|---|---|
2 | A Complete Reference for JavaScript |
5 | Getting Started with JS |
SELECT * FROM articles WHERE MATCH('JS');
id | title |
|---|---|
2 | A Complete Reference for JavaScript |
5 | Getting Started with JS |
Краткое описание преимуществ нового режима:
Итак, подведём итоги. Какие преимущества даёт новый режим:
Нет проблем с управлением файлами: устранение необходимости управлять и очищать внешние файлы.
Упрощённый деплоймент: вся конфигурация содержится в самом определении таблицы, что облегчает развёртывание.
Независимость от разрешений: отсутствуют проблемы с правами доступа к файловой системе между веб-сервером и процессом Manticore.
Удобнее автоматизировать: проще писать скрипты и автоматизировать процессы создания таблиц.
Самодостаточность и документация: полное определение таблицы доступно прямо в инструкции
CREATE TABLE,и командуSHOW CREATE TABLEможно использовать для просмотра полного содержания словаря, что упрощает совместную работу и контроль версий без необходимости отслеживать отдельные файлы словарей.
Алгоритм миграции
Если вы используете внешние файлы, переход на встроенный способ прост:
Прочитайте существующий файл.
Переформатируйте его, заменив разделители на точки с запятыми.
Используйте соответствующие параметры (
_*list) в вашем оператореCREATE TABLE.
Например, если у вас есть файл stopwords.txt, содержащий:
a the an and
Его можно преобразовать в:
stopwords_list='a; the; an; and'
Заключение
Новый механизм встроенной настройки словарей токенизации (stopwords_list, exceptions_list, wordforms_list, hitless_words_list) обеспечивает чистый и удобный способ управления настройками токенизации. Особенно полезен этот подход там, где управление файлами затруднено либо вы стремитесь упростить автоматическое развёртывание. Хотя поддержка внешних файлов остаётся актуальной для крупных словарей, встроенное решение даёт удобную альтернативу для большинства ситуаций.
