fuzzy

Поиск документов, содержащих термины, схожие с поисковым термином в пределах максимально допустимого расстояния Дамерау-Левенштейна

Нечеткий поиск (Fuzzy query)

Основные понятия

Нечеткий запрос (fuzzy query) ищет документы, содержащие термины, схожие с поисковым термином в пределах максимально допустимого расстояния Дамерау-Левенштейна. Это расстояние измеряет количество односимвольных изменений, необходимых для преобразования одного термина в другой:

  1. Замены: кот → бот
  2. Вставки: кот → коты
  3. Удаления: кот → от
  4. Транспозиции: кот → кто

Принцип работы

  1. Запрос генерирует все возможные варианты поискового термина, попадающие в заданное расстояние редактирования
  2. Количество вариантов ограничивается параметром max_expansions
  3. Поиск выполняется по всем сгенерированным вариантам

Примеры запросов

Базовый пример с поиском ошибочного написания “HALET” вместо “HAMLET”:

GET shakespeare/_search
{
  "query": {
    "fuzzy": {
      "speaker": {
        "value": "HALET"
      }
    }
  }
}

Примечание: Используется автоматическое определение расстояния (AUTO)

Расширенный пример с настройкой параметров:

GET shakespeare/_search
{
  "query": {
    "fuzzy": {
      "speaker": {
        "value": "HALET",
        "fuzziness": "2",
        "max_expansions": 40,
        "prefix_length": 0,
        "transpositions": true,
        "rewrite": "constant_score"
      }
    }
  }
}

Параметры запроса

Синтаксис запроса:

GET _search
{
  "query": {
    "fuzzy": {
      "<поле>": {
        "value": "образец",
        ...
      }
    }
  }
}

Доступные параметры:

Параметр Тип данных Описание
value Строка Обязательный. Искомый термин
boost Число с плавающей точкой Влияет на вес поля при расчете релевантности (>1 - увеличивает, 0-1 - уменьшает). По умолчанию: 1.0
fuzziness AUTO, 0 или положительное число Максимальное расстояние редактирования. AUTO - автоматический расчет на основе длины термина
max_expansions Положительное целое Максимальное количество вариантов термина для поиска. По умолчанию: 50
prefix_length Неотрицательное целое Количество начальных символов, не учитываемых при нечетком сравнении. По умолчанию: 0
rewrite Строка Стратегия перезаписи запроса. Допустимые значения: constant_score, scoring_boolean и др. По умолчанию: constant_score
transpositions Логическое Разрешать перестановки соседних символов (ab→ba). По умолчанию: true

Особенности производительности

  1. Большие значения max_expansions (особенно с prefix_length=0) могут снизить производительность из-за генерации множества вариантов
  2. При search.allow_expensive_queries=false нечеткие запросы не выполняются
  3. Для длинных слов рекомендуется использовать prefix_length>0

Практические рекомендации

  1. Для исправления опечаток используйте fuzziness=1 или fuzziness=2
  2. Для профессиональных терминов уменьшайте max_expansions
  3. Для ускорения поиска увеличивайте prefix_length
  4. Для точных полей отключайте транспозиции (transpositions=false)