Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Синонимы и словари в полнотекстовом поиске

Синонимы в поиске: словари, фильтры и влияние на выдачу

Настройка синонимов в поисковом индексе: форматы словарей, expand и contract, время применения фильтра и проверка влияния на выдачу.

Прямой ответ

Синонимы расширяют запрос терминами с близким значением, чтобы запрос «ноутбук» находил документы со словом «лэптоп». Настройка выполняется фильтром анализатора, который заменяет либо дополняет токен при разборе текста.

Фильтр объявляется в настройках индекса:

{
  "settings": {
    "analysis": {
      "filter": {
        "ru_synonyms": {
          "type": "synonym_graph",
          "synonyms": [
            "ноутбук, лэптоп",
            "телефон, смартфон, мобильник",
            "монитор => дисплей"
          ]
        },
        "ru_text": {
          "tokenizer": "standard",
          "filter": ["lowercase", "ru_synonyms", "russian_stemmer"]
        }
      }
    }
  }
}

Два формата записи задают разное поведение.

Запись Поведение
ноутбук, лэптоп Эквивалентность: каждый термин заменяется всеми
монитор => дисплей Однонаправленная замена: «монитор» → «дисплей», обратно нет
телефон, смартфон => мобильное устройство Группа заменяется одним термином

Эквивалентность удобна для взаимозаменяемых названий, однонаправленная замена — для случаев, когда разговорный термин должен приводиться к принятому в каталоге.

Порядок фильтров определяет результат. Синонимы применяются после приведения к нижнему регистра и до стеммера, поэтому в словаре указываются формы до приведения; о приведении — в статье про лемматизацию и стемминг.

Фильтр synonym_graph корректно обрабатывает многословные синонимы, тогда как synonym работает с одиночными токенами. Для русского языка с многословными названиями используется графовый вариант.

Где применять синонимы: при индексации или при запросе

Фильтр синонимов можно включить в анализатор индексации, в анализатор запроса либо в оба. Выбор определяет стоимость обновления словаря.

При индексации. Синонимы разворачиваются при записи документа, и в индексе хранятся все варианты. Обновление словаря требует переиндексации всего объёма, поскольку существующие сегменты не пересобираются.

При запросе. Синонимы подставляются в момент разбора запроса. Обновление словаря применяется сразу, а переиндексация не требуется. Недостаток — каждый запрос выполняет развёртывание, что увеличивает время разбора.

В обоих местах. Применяется для словарей, которые не меняются, и даёт максимальную полноту совпадения.

Практический выбор: для словаря, который пополняется по мере обнаружения новых вариантов, применяется развёртывание при запросе. Для устойчивого набора терминов — при индексации.

Отдельный аспект — влияние на релевантность. Развёртывание синонимов увеличивает число терминов запроса, а оценка релевантности учитывает частоту и число совпавших терминов; о ранжировании — в статье про релевантность поиска. Документ с точным совпадением исходного термина может опуститься ниже документа с совпадением по синониму.

Распространённый приём — использование should для синонимов с точным совпадением в must, что сохраняет преимущество исходного термина.

Словарь синонимов и морфология языка

Русская морфология влияет на состав словаря сильнее, чем в языках с простой системой окончаний. Три следствия стоит учитывать при составлении записей.

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

Множественное число. Если стеммер объединяет формы единственного и множественного числа, отдельная запись для каждой формы избыточна. Проверка результата приведения показывает, нужна ли запись.

Многословные термины. Словосочетание обрабатывается графовым фильтром, поскольку обычный фильтр работает с одиночными токенами. Запись «мобильный телефон» без графового фильтра не применяется корректно.

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

Отдельный вопрос — объём словаря. Каждая запись увеличивает число развёртываний при разборе запроса, поэтому словарь из тысяч записей заметно влияет на время разбора. Ограничение словаря реально встречающимися случаями сохраняет скорость.

Практика: ведение словаря синонимов

1. Начинайте с реальных запросов без результата. Словарь пополняется терминами, по которым поиск не нашёл документы, а не предположениями о близости слов.

2. Различайте эквивалентность и замену. Взаимозаменяемые названия записываются через запятую, приведение разговорного термина к принятому — стрелкой.

3. Проверяйте влияние каждой записи. Добавление одного синонима меняет выдачу по всем запросам с этим термином.

4. Не добавляйте близкие, но разные понятия. «Ноутбук» и «планшет» — разные устройства, и эквивалентность приводит к нерелевантной выдаче.

5. Храните словарь вне настроек индекса. Файл словаря либо внешний источник обновляется без изменения конфигурации индекса.

6. Учитывайте морфологию. Синонимы применяются до стеммера, поэтому форма в словаре должна совпадать с формой до приведения.

7. Фиксируйте словарь в системе контроля версий. Изменение словаря меняет поведение поиска, поэтому правки отслеживаются как изменения кода.

Рекомендации:

  1. Измеряйте влияние на выдачу до и после правки. Набор реальных запросов с ожидаемыми результатами показывает регрессии, которые не видны при проверке одного запроса.
  2. Разделяйте словарь синонимов и словарь исключений. Термины, которые не стоит разворачивать, обрабатываются отдельно.
  3. Не смешивайте синонимы с нечётким поиском без проверки. Оба механизма расширяют совпадение, и совместное применение увеличивает число ложных результатов.
  4. Учитывайте объём словаря. Большое число развёртываний увеличивает время разбора запроса, особенно при применении в анализаторе запроса.
  5. Документируйте источник каждой записи. Запись, добавленная по конкретному обращению пользователя, отличается от записи из справочника терминов.

Практический сценарий: выдача ухудшилась после добавления синонима

Контекст: после добавления эквивалентности «монитор, экран» запросы по слову «экран» стали возвращать нерелевантные документы.

  1. Диагностика. Запрос «экран телефона» возвращал документы о мониторах, а запрос «монитор 27 дюймов» — документы о защитных экранах.
  2. Причина. Эквивалентность применилась ко всем значениям многозначного слова. «Экран» обозначает и монитор, и защитную плёнку, и дисплей устройства, поэтому развёртывание смешало разные категории.
  3. Действия. (а) Заменили эквивалентность однонаправленной записью для конкретного контекста; (б) ограничили применение фильтра полем описания категории, где значение однозначно; (в) добавили точное совпадение исходного термина с более высоким весом, чтобы документы с прямым совпадением оставались выше; (г) собрали набор запросов со словом «экран» из реальной статистики и зафиксировали ожидаемую выдачу; (д) добавили правило проверки словаря: каждая новая запись прогоняется через набор запросов до применения.
  4. Результат. Многозначный термин обрабатывается с учётом контекста, а регрессии обнаруживаются проверкой до применения правки.

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

FAQ

Нужна ли переиндексация при изменении словаря? Да, если фильтр применяется при индексации. При применении в анализаторе запроса изменение действует без переиндексации.

Можно ли хранить словарь в отдельном файле? Да, движки поддерживают загрузку словаря из файла, что отделяет словарь от конфигурации индекса.

Влияют ли синонимы на порядок результатов? Да, поскольку развёртывание меняет число совпавших терминов и их частоту. Точное совпадение исходного термина обычно выделяется отдельным весом.

Какой формат фильтра выбрать для многословных синонимов? Графовый вариант, поскольку он корректно обрабатывает совпадения из нескольких токенов.

Источники: Elasticsearch synonym token filter, synonym graph token filter, Apache Lucene documentation — ссылки в шапке.