bool query
Тема дорожной карты · Elasticsearch
Запрос bool в Elasticsearch является основным составным типом запроса в Query DSL, объединяющим несколько условий с помощью булевой логики для управления тем, какие документы совпадут и как они будут оценены. Запрос bool поддерживает четыре типа условий: must (документ должен совпасть, вносит вклад в оценку), filter (документ должен совпасть, на оценку не влияет), should (документ может совпасть, при совпадении повышает оценку) и must_not (документ не должен совпасть, не оценивается). Запрос bool — рекомендованный способ построения сложной логики поиска, поскольку каждое условие может само по себе быть любым запросом Query DSL, включая вложенные bool-запросы для произвольно глубокой логики. Условия в блоке filter внутри bool-запроса автоматически кешируются Elasticsearch, что делает их значительно быстрее условий из must для чисто бинарных проверок — например, по статусу или диапазону дат. Строка поиска Kibana генерирует bool-запросы под капотом, когда вы комбинируете несколько условий через поисковый интерфейс Elastic Stack.
Как это работает
bool 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ать".
Типичные ошибки
Ловушки bool query: search keyword поля через match (анализ его убивает — пусто); leading wildcards на огромных индексах (сканирует всё); deep pagination (from + size) > 10k (используйте search_after или PIT); не используют filter context для non-scored критериев.