⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.
blog-post

Встроенные стоп-слова, исключения и формы слов

Manticore Search теперь поддерживает встроенную спецификацию настроек словаря токенизации непосредственно в операторе CREATE TABLE. Это улучшение устраняет необходимость во внешних файлах при настройке стоп-слов, исключений, форм слов и слов без попаданий, что делает создание таблиц более упрощенным и удобным для развертывания.

Новые функции

Четыре новых параметра конфигурации теперь доступны в режиме RT :

  • stopwords_list - Укажите стоп-слова непосредственно в определении таблицы
  • exceptions_list - Определите исключения токенизации встроенно
  • wordforms_list - Настройте сопоставления форм слов без внешних файлов
  • hitless_words_list - Установите слова без попаданий как часть создания таблицы

Все эти параметры используют точку с запятой (;) в качестве разделителя между записями, что делает их удобными для использования в SQL и HTTP JSON интерфейсах.

Проблема, которую они решают

Традиционно настройка словарей токенизации требовала создания внешних файлов, которые Manticore считывал во время создания таблицы. Хотя этот подход хорошо работает во многих сценариях, он представляет собой несколько проблем:

Проблемы с правами на файлы

Веб-приложения, работающие под ограниченными учетными записями пользователей, часто сталкиваются с трудностями при создании файлов в каталогах, которые одновременно:

  • Доступны для записи процессу веб-сервера
  • Доступны для чтения процессу демона Manticore

Это особенно проблематично в средах общего хостинга, где веб-приложения работают под ограниченными учетными записями пользователей (например, в Virtualmin или аналогичных панелях управления), где домашние каталоги пользователей обычно доступны только для чтения владельцем, в то время как системные каталоги могут иметь ограниченные права.

Проблемы с временными каталогами

Использование системных временных каталогов (например, /tmp) вводит еще одну проблему: бит "липкости" в этих каталогах может помешать правильной очистке файлов стоп-слов. Когда индексы часто пересоздаются, могут накапливаться "сиротские" файлы, потребляя дисковое пространство и создавая проблемы с обслуживанием.

Управление жизненным циклом файлов

Когда таблицы часто создаются и уничтожаются, управление связанными файлами словаря токенизации становится обременительным. Разработчики должны:

  1. Создать файл перед созданием таблицы
  2. Убедиться, что файл доступен для чтения Manticore
  3. Не забыть очистить файл, когда таблица удаляется

Этот ручной процесс подвержен ошибкам и может привести к захламлению файловой системы.

Новые параметры

Новые параметры *_list позволяют вам указывать настройки словаря токенизации непосредственно в операторе CREATE TABLE. С внешними файлами SHOW CREATE TABLE показывает пути к файлам, и вы поддерживаете содержимое словаря в отдельных файлах; с встроенными параметрами вы никогда не создаете или ссылаетесь на внешние пути. Содержимое словаря живет в DDL (внутренне оно все равно оказывается в виде файлов в каталоге таблицы, так же как и с путями к файлам). SHOW CREATE TABLE показывает полные настройки словаря встроенно (например, stopwords_list = 'a; the; an'), так что определение таблицы является самодостаточным в одном операторе, что упрощает контроль версий и копирование или обмен. Определение таблицы переносимо между различными средами.

Примеры использования

Стоп-слова

Вместо создания файла стоп-слов:

-- Old way (requires external file)
CREATE TABLE products(title text, price float) 
stopwords = '/usr/local/manticore/data/stopwords.txt'

Теперь вы можете указывать стоп-слова встроенно:

-- New way (no external file needed)
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 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'

Когда использовать встроенную конфигурацию

Встроенная конфигурация идеальна, когда:

  1. Небольшие и средние списки: Списки имеют разумный размер (обычно менее нескольких сотен записей). Для очень больших словарей внешние файлы могут быть более практичными.
  2. Динамическое создание таблиц: Ваше приложение программно создает и уничтожает таблицы, что делает управление файлами обременительным.
  3. Ограниченный доступ к файловой системе: Вы работаете в среде с ограниченными правами на файловую систему (общий хостинг, контейнеры и т. д.).
  4. Упрощенное развертывание: Вы хотите избежать управления дополнительными файлами как частью вашего процесса развертывания.
  5. Частое пересоздание индексов: Таблицы часто пересоздаются, что делает очистку файлов обременительной для обслуживания.

Когда внешние файлы лучше

Хотя встроенная конфигурация удобна, внешние файлы остаются лучшим выбором в этих сценариях:

  1. Большие словари: Когда у вас есть тысячи записей, внешние файлы более управляемы и не раздувают ваши операторы CREATE TABLE.
  2. Общие словари: Если один и тот же словарь используется в нескольких таблицах, внешний файл позволяет вам определить его один раз и ссылаться на него из нескольких таблиц, уменьшая дублирование.
  3. Контроль версий: Внешние файлы можно легко отслеживать в системах контроля версий, что упрощает просмотр изменений и поддержание истории.
  4. Динамические обновления: Если вам нужно обновить словари без пересоздания таблиц, внешние файлы можно изменить, а затем использовать ALTER TABLE <table_name> RECONFIGURE, чтобы применить изменения. Для таблиц RT это позволяет новым настройкам токенизации вступить в силу для новых документов (существующие документы остаются неизменными). Для обычных таблиц требуется ротация, чтобы учесть изменения из измененных файлов словаря.
  5. Сложное форматирование: Очень сложные правила форм слов или исключений могут быть легче редактировать в отдельном файле с правильным форматированием и комментариями.
  6. Наследственные системы: Если у вас уже есть хорошо поддерживаемые внешние файлы словаря, нет необходимости в миграции, если вы не сталкиваетесь с конкретными проблемами, которые решает встроенная конфигурация.

Подробности формата

Разделитель

Все параметры *_list используют точку с запятой (;) для разделения записей. Пробелы вокруг точек с запятой нормализуются, поэтому 'word1; word2' и 'word1 ; word2' эквивалентны.

Экранирование

Если вам нужно использовать точку с запятой как часть самого значения (а не как разделитель), экранируйте её обратным слешем: \;. Например, если вы хотите сопоставить исходную форму, содержащую точку с запятой:

exceptions_list = 'test\;value => testvalue; another => mapping'

Это создаёт два сопоставления:

  • test;value (с точкой с запятой) → testvalue
  • anothermapping

Экранированная точка с запятой (\;) рассматривается как буквальный символ точки с запятой, а не как разделитель между записями.

Формат Wordforms

Wordforms поддерживают как >, так и => в качестве разделителей:

wordforms_list = 'word1 > form1; word2 => form2'

Формат Exceptions

Exceptions используют => в качестве разделителя между исходной и целевой формами:

exceptions_list = 'source form => destination form'

Note: При использовании exceptions_list вы можете увидеть предупреждения в журнале searchd о mapping token (=>) not found во временных файлах исключений. Эти предупреждения безвредны и их можно безопасно игнорировать — исключения работают корректно, несмотря на эти сообщения. Предупреждения возникают во время внутренней обработки файлов и не влияют на фактическое поведение сопоставления исключений.

Пример: Stopwords, Wordforms и Exceptions вместе

Вот практический пример использования встроенных стоп-слов, wordforms и исключений в одной таблице. Wordforms нормализуют варианты до единой формы (например, «learning» → «learn»); исключения сопоставляют сокращения с нормализованной формой (например, «JS» → «javascript»), так что и «JS», и «JavaScript» совпадают с теми же документами. Используйте строчные буквы в целевой форме исключения, чтобы они соответствовали токену, генерируемому charset_table.

-- Create a table with inline stopwords, wordforms, and exceptions
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 test data
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');

Stopwords: запросы с стоп-словами и без них возвращают одни и те же документы.

SELECT * FROM articles WHERE MATCH('python');
idtitle
1The Quick Guide to Python Programming
4Python Programming Basics
SELECT * FROM articles WHERE MATCH('the python');
idtitle
1The Quick Guide to Python Programming
4Python Programming Basics

Phrase search: стоп-слова пропускаются при совпадении, но всё равно влияют на позиции (настраивается с помощью stopword_step ).

SELECT * FROM articles WHERE MATCH('"the quick"');
idtitle
1The Quick Guide to Python Programming

Wordforms: «learn» совпадает с «Learning» через wordform.

SELECT * FROM articles WHERE MATCH('learn');
idtitle
3An Introduction to Machine Learning

Exceptions: сопоставление JS => javascript нормализует «JS» до «javascript», когда оно встречается в тексте или запросе. Поскольку целевая форма записана строчными буквами, она совпадает с токеном, который charset_table генерирует для «JavaScript», поэтому как MATCH('JavaScript'), так и MATCH('JS') возвращают одинаковые строки.

SELECT * FROM articles WHERE MATCH('JavaScript');
idtitle
2A Complete Reference for JavaScript
5Getting Started with JS
SELECT * FROM articles WHERE MATCH('JS');
idtitle
2A Complete Reference for JavaScript
5Getting Started with JS

Сводка преимуществ

  1. No File Management: Устраняет необходимость создавать, управлять и удалять внешние файлы
  2. Simplified Deployment: Конфигурация является частью определения таблицы, что делает развертывание более простым
  3. Permission Independence: Нет проблем с правами доступа к файловой системе между веб‑сервером и процессами Manticore
  4. Better for Automation: Проще писать скрипты и автоматизировать создание таблиц
  5. Self-Contained and Self-Documenting: Конфигурация таблицы полностью указана в операторе CREATE TABLE, а SHOW CREATE TABLE отображает всё содержимое словаря встроенно, поэтому определения легко делиться и контролировать версии без управления отдельными файлами словарей

Путь миграции

Если вы в настоящее время используете внешние файлы, вы можете легко перейти к встроенной конфигурации:

  1. Прочитайте содержимое вашего текущего файла
  2. Преобразуйте формат, используя точки с запятой в качестве разделителей
  3. Замените путь к файлу опцией *_list в вашем операторе CREATE TABLE

Например, если у вас есть файл stopwords.txt, содержащий:

a
the
an
and

Вы можете преобразовать его в:

stopwords_list = 'a; the; an; and'

Заключение

Новые параметры конфигурации встроенного словаря токенизации (stopwords_list, exceptions_list, wordforms_list и hitless_words_list) предоставляют более чистый и удобный способ настройки параметров токенизации. Они особенно полезны в средах, где управление файлами затруднено, или когда вы хотите упростить процесс развертывания и сохранить определения таблиц автономными. Хотя внешние файлы по‑прежнему поддерживаются для больших словарей, встроенная конфигурация предлагает удобную альтернативу для большинства сценариев использования.

Установить Manticore Search

Установить Manticore Search