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-запросы помогут расширить результаты поиска. При этом важно учитывать дополнительные параметры, которые увеличивают нагрузку на систему, а также назначать приоритеты, чтобы точные совпадения были выше неточных.
На фоне роста спроса на ликвидность в бычьем рынке 2025 года, криптозаймы снова выходят на…
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…