Изменение динамических синонимов поиска

Можно ли хранить синонимы для elasticsearch в индексе? Или можно получить список синонимов из базы данных, такой как couchdb? Я бы хотел добавить синонимы динамически в elasticsearch через REST-API.

Ответы

Ответ 1

При работе с синонимами существует два подхода:

  • расширение их при индексировании,
  • расширение их во время запроса.

Расширение синонимов во время запроса не рекомендуется, так как оно вызывает проблемы с:

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

Подробнее об этом на http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory (на странице Solr wiki, но релевантно также для ElasticSearch).

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

Ответ 2

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

  • фильтр-фильтр-фильтр файл - это плагин, который может периодически перезаписывать синонимы каждые заданные числа секунд, как определено пользователем.
  • refresh-токен-плагин позволяет обновлять индекс в реальном времени. Тем не менее, этот плагин по-видимому имеет некоторые проблемы, связанные с тем, что elasticsearch не может отличить анализаторы во время поиска только от тех, которые используются во время индекса.

Хорошее обсуждение этой темы можно найти в системе билетов elistisearch github: https://github.com/brusic/refresh-token-filters

Ответ 3

В elasticsearch не слишком больно обновлять список синонимов. Это можно сделать, открыв и закрыв. Вы можете заставить его двигаться из любого места, но вам нужна какая-то ваша собственная инфраструктура. Он будет работать следующим образом:

  • Вы хотите, чтобы псевдоним указывал на ваш текущий индекс
  • Синхронизировать новый индексный файл с серверами
  • Создайте новый индекс с помощью настраиваемого анализатора, который использует новый индекс
  • Перестроить содержимое из текущего индекса в новый индекс
  • Отменить псевдоним индекса от текущего к новому индексу