Выберем управляемую стратегию для префиксов, опечаток и расширенного пользовательского ввода.
Примеры course-products используют учебную схему и товар из главы 5 «Mapping и типы полей». Разборы упражнений ниже используют отдельный публичный набор тренажёра.
- Префиксы и шаблоны
- Опечатки и расширения
- Безопасный пользовательский язык
Выберем управляемую стратегию для префиксов, опечаток и расширенного пользовательского ввода.
Курс ориентирован на Elasticsearch 9.4.3. Разборы упражнений используют публичный набор products; остальные запросы показывают отдельные учебные индексы и могут требовать подготовки или прав, недоступных в тренажёре. Ответы сокращены, score может меняться. Для расширенных функций проверяйте лицензию и вариант развёртывания.
Префиксы и шаблоны
prefix ищет начало терма. wildcard задаёт шаблон с * и ?, regexp — регулярное выражение над термами словаря, а не произвольный обход исходных строк. Ведущий wildcard может заставлять просматривать много термов. Ограничения длины и сложности пользовательского ввода важнее попыток компенсировать тяжёлый шаблон дополнительными серверами.
СамопроверкаОпечатки и расширения
Fuzzy matching расширяет терм по расстоянию редактирования. Важны fuzziness, prefix_length и max_expansions: они влияют на полноту и стоимость. Это не семантический поиск и не автоматическая транслитерация. Для коротких артикулов нечёткость может возвращать другой товар. match_phrase_prefix и match_bool_prefix полезны при вводе последнего незавершённого слова, но имеют разные правила для предыдущих слов.
СамопроверкаБезопасный пользовательский язык
query_string поддерживает выразительный синтаксис, но ошибки разбора могут отклонить запрос. simple_query_string терпимее к ошибкам и позволяет ограничить операторы. Оба требуют осознанной политики полей, экранирования и сложности. Не передавайте произвольный DSL из публичной формы в кластер: сервер задаёт допустимые поля, фильтры доступа и ресурсные ограничения.
Нечёткий поиск ограничивает расширения; качество проверяют на реальных опечатках.
{
"query": {
"match": {
"name": {
"query": "headphnes",
"fuzziness": "AUTO",
"prefix_length": 1,
"max_expansions": 20
}
}
}
}Как читать результат
Нечёткий поиск ограничивает расширения; качество проверяют на реальных опечатках.
Разбор на примере каталога
Опечатка "headphnes" похожа на headphones по написанию, а запрос «для пробежки» выражает потребность, которой в слове headphones нет. Fuzzy может помочь первому случаю, но не обязан помогать второму. Prefix подходит незавершённому началу терма, а wildcard по внутреннему фрагменту имеет другую стоимость. Не объединяйте все способы через should без измерений: число кандидатов и задержка могут резко вырасти, а точный результат потеряется среди слабых совпадений.
СамопроверкаПоиск с опечаткой
Fuzziness допускает ограниченное число правок между проанализированным термином запроса и термином индекса. AUTO выбирает расстояние по длине слова и не означает произвольное сходство. В примере travle может совпасть с travel за счёт перестановки. Это инструмент для опечаток, а не замена точных идентификаторов и бизнес-фильтров.
Нечёткий запрос всё ещё работает с анализируемыми словами. Он не является wildcard для произвольной подстроки. Более свободный поиск может добавить лишние документы, поэтому включайте fuzziness, когда требуется допуск опечаток. В тренажёре дорогие scripts, wildcard и regexp намеренно недоступны.
Разберём другой сценарий
{
"query": {
"match": {
"name": {
"query": "travle",
"fuzziness": "AUTO"
}
}
},
"size": 2,
"_source": [
"name",
"price"
]
}Ответ Elasticsearch
{
"hits": {
"total": {
"value": 60,
"relation": "eq"
},
"hits": [
{
"_id": "3",
"_score": 1.3610321,
"_source": {
"name": "Sony Travel Speaker 3",
"price": 100
}
},
{
"_id": "13",
"_score": 1.3610321,
"_source": {
"name": "Apple Travel Speaker 13",
"price": 100
}
}
]
}
}Как читать результат
В названиях используется правильное travel, а не опечатка. Ответ демонстрирует ограниченное исправление токена, а не поиск подстроки.
Самопроверка
Сначала ответьте самостоятельно, затем раскройте объяснение.
1. Где работает regexp?
По индексированным термам поля.
2. Почему *phone может быть дорогим?
Ведущий wildcard расширяет область перебора словаря.
3. Fuzzy исправляет смысл?
Нет, оно работает с расстоянием между написаниями.
4. Что выбрать для простого пользовательского синтаксиса?
Часто simple_query_string с ограниченными операторами и полями.
5. Где ограничивать DSL?
На серверной границе до обращения к Elasticsearch.
Краткая памятка
- По индексированным термам поля.
- Ведущий wildcard расширяет область перебора словаря.
- Нет, оно работает с расстоянием между написаниями.
- Часто simple_query_string с ограниченными операторами и полями.
- На серверной границе до обращения к Elasticsearch.
Официальная документация
Готовы применить знания?
Подтвердите прочтение, чтобы сохранить своё место. Чтение и решение заданий учитываются отдельно в этом браузере с помощью гостевой cookie.