Рубріки: HighloadТеория

Elastic поиск неточных соответствий

Игорь Грегорченко

Elasticsearch — поисковая система, основанная на Apache Lucene, которая обеспечивает полнотекстовый поиск и мультиарендность с веб-интерфейсом HTTP и поддержкой без-схемных JSON-документов.

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

А еще Elasticsearch весьма легко справляется с поиском неточных соответствий, который работает по немного отличному от wildcard-поиска в Sphinx принципу.

Нечеткие запросы

Fuzzy-запросы используют сходство на основе расстояния Левенштейна для текстовых полей или границу слева-справа для числовых полей и дат.

Для этого используется запрос fuzzy, который генерирует все возможные соответствия, которые находятся в пределах максимального редакционного расстояния (задается параметром fuzziness), а затем проверяет словарь терминов для сравнения с существующим индексом.

Создадим простой индекс:

curl -XPUT ‘http://localhost:9200/my_index/my_type/_bulk’ -d'
{ "index": { "_id": 1 }}
{ "text": "Surprise me!"}
{ "index": { "_id": 2 }}
{ "text": "That was surprising."}
{ "index": { "_id": 3 }}
{ "text": "I wasn't surprised."}

# Для тестирования можно использовать утилиту curl

При помощи все того же curl и простого запроса GET можно провести первый поиск:

curl -XGET ‘http://localhost:9200/my_index/my_type/_bulk/_search?pretty=true’ -d’
{
  "query": {
    "fuzzy": {
      "text": "surprize"
    }
  }
}

# Опция pretty=true обеспечит удобный вывод результатов (не в одну строку)

То есть мы провели fuzzy-поиск “surprize” по нашему индексу. Вывод будет содержать первый и третий документы, так как параметр fuzzinessпо умолчанию равен auto:

  • редакционное расстояние 0 для строк из 1 или 2 символов;
  • редакционное расстояние 1 для строк длиной от 3 до 5 символов;
  • редакционное расстояние 2 для строк длиной от 5 символов.

Следующий пример содержит большее количество параметров fuzzy:

curl -XGET ‘http://localhost:9200/my_index/my_type/_bulk/_search?pretty=true’ -d’
{
    "fuzzy" : {
        "text" : {
            "value" :         "surprize",
            "boost" :         1.0,
            "fuzziness" :     2,
            "prefix_length" : 2,
            "max_expansions": 100
        }
    }
}

# Чем выше значение fuzziness, тем больше выдача

Пройдемся по дополнительным параметрам:

  • boost — задает приоритет запроса, то есть можно повысить приоритет точных совпадений, чтобы они занимали первые позиции в поисковой выдаче;
  • prefix_length — задает размер префикса, помогает отсеять количество слов при поиске;
  • max_expansions — максимальное количество терминов неточного запроса, по умолчанию равно 50.

Учтите, что малое значение prefix_length и большое значение max_expansions увеличивают время поиска и нагрузку на сервер.

Запрос match

Неточные совпадения в Elasticsearch также могут использоваться в запросах типа match. К примеру:

curl -XGET ‘http://localhost:9200/my_index/my_type/_bulk/_search?pretty=true’ -d’
{
  "query": {
    "match": {
      "text": {
        "query":     "Surprize me",
        "fuzziness": "auto",
        "operator":  "and"
      }
    }
  }
}

# Сначала проверяются элементы [surprize, me], а затем совпадения в пределах fuzziness

Также можно производить неточный поиск по нескольким полям при помощи multi_match, а также использовать параметры prefix_length и max_expansions.

Самое главное

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

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

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

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023