match query
Тема дорожной карты · Elasticsearch
Запрос match — стандартный запрос полнотекстового поиска в Query DSL Elasticsearch, предназначенный для поиска по полям text путём прогона строки запроса через тот же анализатор, который применялся к полю во время индексирования. Когда вы отправляете POST /products/_search с запросом match по полю description, Elasticsearch токенизирует строку поиска, ищет каждый токен в инвертированном индексе и возвращает документы, упорядоченные по оценке релевантности BM25. Запрос match поддерживает несколько важных опций: operator (значение AND требует совпадения всех токенов, OR — любого), fuzziness (для допуска опечаток с настраиваемым редакционным расстоянием) и minimum_should_match (для управления долей токенов, которые должны совпасть). Для одновременного поиска сразу по нескольким полям text запрос multi_match расширяет match, принимая массив fields с опциональными коэффициентами усиления для каждого поля (например, "fields": ["title^3", "body"]). Запрос match — правильный выбор для пользовательских строк поиска в приложениях на базе Elasticsearch, тогда как запрос term лучше подходит для точной фильтрации по полям keyword.
Как это работает
match query: 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ать".
Типичные ошибки
Ловушки match query: search keyword поля через match (анализ его убивает — пусто); leading wildcards на огромных индексах (сканирует всё); deep pagination (from + size) > 10k (используйте search_after или PIT); не используют filter context для non-scored критериев.