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:
Следующий пример содержит большее количество параметров 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, тем больше выдача
Пройдемся по дополнительным параметрам:
Учтите, что малое значение prefix_length
и большое значение max_expansions
увеличивают время поиска и нагрузку на сервер.
Неточные совпадения в 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 в Украине, особенно для…
В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…
Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…
Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…
Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…
IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…