Query DSL
Тема дорожной карты · Elasticsearch
Query DSL (Domain Specific Language) — это JSON-язык запросов Elasticsearch, используемый для построения всех типов поисковых запросов и агрегаций, отправляемых на эндпоинт _search. Query DSL разделяет запросы на два контекста: контекст запроса (где Elasticsearch вычисляет оценку релевантности _score для каждого совпадающего документа) и контекст фильтра (где Elasticsearch лишь проверяет соответствие документа условию без оценки и кеширует результаты для повышения производительности). Query DSL предоставляет богатую библиотеку типов запросов: полнотекстовые запросы — match, match_phrase, multi_match — для анализируемых текстовых полей; запросы уровня термина — term, terms, range, exists, prefix — для полей с точными значениями или структурированных полей; составные запросы — bool, dis_max, function_score — для объединения нескольких условий. Запросы Query DSL отправляются в виде JSON-тела в вызовах POST /<index>/_search, и тот же синтаксис используется во вложенных запросах в фильтрах агрегаций, условиях ingest-конвейеров и условиях соответствия политик ILM. Понимание Query DSL — центральный навык эффективной работы с Elasticsearch, поскольку он лежит в основе каждого поиска, агрегации и правила оповещения в Elastic Stack.
Как это работает
Query DSL: 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ать".
Типичные ошибки
Ловушки Query DSL: search keyword поля через match (анализ его убивает — пусто); leading wildcards на огромных индексах (сканирует всё); deep pagination (from + size) > 10k (используйте search_after или PIT); не используют filter context для non-scored критериев.