term / terms query

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

Запрос term в Query DSL Elasticsearch выполняет точный поиск значений в полях типа keyword, числовых, булевых или дат, не пропуская значение через анализатор, — это правильный выбор для фильтрации по структурированным данным, когда известно точное хранимое значение. Запрос term выглядит как {"term": {"status": {"value": "published"}}} и функционально эквивалентен SQL-конструкции WHERE status = 'published'; он всегда используется в контексте фильтра внутри bool-запроса, чтобы воспользоваться кэшем фильтров Elasticsearch и избежать вычисления релевантности. Запрос terms является расширением term и сопоставляет документы, в которых значение поля равно любому из значений в переданном списке, аналогично SQL-конструкции IN: {"terms": {"category": ["news", "sports", "tech"]}}. Поскольку оба запроса — term и terms — обходят анализ, поиск по полю типа text с их помощью, как правило, не вернёт результатов, так как поля text хранятся как проанализированные токены в нижнем регистре; для точного совпадения всегда используйте поле keyword или подполе .keyword в Elasticsearch. Запрос terms_set — это более продвинутый вариант, требующий, чтобы документ совпадал с минимальным числом указанных термов, что полезно для сценариев сопоставления по множественным тегам.

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

term / terms 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ать".

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

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

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

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