wildcard и fuzzy

Тема дорожной карты · Elasticsearch

Запросы wildcard и fuzzy в Query DSL Elasticsearch — это два запроса на уровне термов, обеспечивающие поиск по шаблону и устойчивость к опечаткам соответственно, жертвуя частью производительности ради гибкости. Запрос wildcard сопоставляет документы, значение поля которых соответствует шаблону с символами * (ноль и более символов) или ? (ровно один символ): например, {"wildcard": {"filename": {"value": "report_2024_*"}}} совпадает с любым именем файла, начинающимся на report_2024_. Ведущие символы подстановки (например, *report) особенно затратны в Elasticsearch, поскольку требуют сканирования каждого терма в инвертированном индексе, и их следует избегать на нагруженных путях поиска. Запрос fuzzy сопоставляет термы, находящиеся в пределах настраиваемого редакционного расстояния (расстояние Левенштейна) от строки запроса, что обеспечивает устойчивость к опечаткам: {"fuzzy": {"name": {"value": "elasticsearh", "fuzziness": "AUTO"}}} всё равно найдёт документы с правильно написанным elasticsearch. Рекомендуется использовать fuzziness: "AUTO" вместо фиксированного числа, поскольку Elasticsearch автоматически выбирает подходящее редакционное расстояние (0 для коротких термов, 1 для средних, 2 для длинных) в зависимости от длины термa запроса. Для сценариев автодополнения и поиска по мере набора запроса предпочтительнее использовать запрос match с параметром fuzziness, а не самостоятельный запрос fuzzy, поскольку он пропускает ввод через анализатор поля перед применением нечёткого совпадения.

Как это работает

wildcard и fuzzy: JSON-based query language. match — full-text search (с analyzer); term/terms — exact-match (без анализа — для keywords, ID); bool комбинирует must/should/must_not/filter с relevance scoring; range — numeric/date диапазоны; wildcard/fuzzy — inexact matches (медленно — избегайте). Filter context пропускает scoring (быстрее + cacheable) — для "yes/no" критериев. Query context считает relevance — для "best match".

Когда применять

filter для boolean критериев (date range, status = "active") — cacheable + быстрее. query для scored matches (релевантный текст). Никогда wildcard с leading * (full scan). match_phrase для фраз, не просто match. Тюньте analysis: для ID, кодов, exact-strings — keyword; для текста — text с analyzer. Mismatch = пустые результаты которые "должны matchать".

Типичные ошибки

Ловушки wildcard и fuzzy: search keyword поля через match (анализ его убивает — пусто); leading wildcards на огромных индексах (сканирует всё); deep pagination (from + size) > 10k (используйте search_after или PIT); не используют filter context для non-scored критериев.

Связанные понятия

Полезные ресурсы