range query
Тема дорожной карты · Elasticsearch
Запрос range в Query DSL Elasticsearch находит документы, значения поля которых попадают в заданный интервал, и является одним из наиболее часто используемых структурированных запросов для числовых полей, полей дат и IP-адресов. Запрос range задаётся с помощью параметров gte (больше или равно), gt (строго больше), lte (меньше или равно) и lt (строго меньше); любая комбинация этих границ позволяет определить открытый или закрытый интервал (например, "range": {"price": {"gte": 10, "lt": 100}}). Для полей дат запрос range в Elasticsearch поддерживает выражения с математикой дат: now-1d/d (начало предыдущего дня) и now/d (начало текущего дня), что упрощает написание запросов с временным окном для анализа логов без жёсткого задания временных меток. Когда запрос range размещается в блоке filter bool-запроса, Elasticsearch кеширует результирующее битовое множество и пропускает вычисление релевантности, что существенно повышает производительность для повторяющихся временных фильтров по индексам логов или метрик. Запрос range также работает с полями keyword при строковых сравнениях в лексикографическом порядке, однако для точного и эффективного поиска по диапазонам в Elasticsearch настоятельно рекомендуется использовать числовые типы и типы дат.
Как это работает
range 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ать".
Типичные ошибки
Ловушки range query: search keyword поля через match (анализ его убивает — пусто); leading wildcards на огромных индексах (сканирует всё); deep pagination (from + size) > 10k (используйте search_after или PIT); не используют filter context для non-scored критериев.