Full-text search

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

Полнотекстовый поиск в Elasticsearch — это возможность находить документы по естественно-языковым запросам, а не по точным совпадениям значений полей; в основе лежат инвертированный индекс и конвейер анализатора, обрабатывающего текст как при индексировании, так и при поиске. Когда вы отправляете запрос POST /<index>/_search с запросом match, Elasticsearch прогоняет строку запроса через тот же анализатор, который использовался при индексировании поля, затем ищет каждый полученный токен в инвертированном индексе, находит совпадающие документы и вычисляет оценку релевантности по алгоритму BM25. Полнотекстовый поиск в Elasticsearch поддерживает поиск фраз (через match_phrase), поиск по нескольким полям (через multi_match) и допуск опечаток (через параметр fuzziness) — всё это выражается через Query DSL. Релевантность результатов полнотекстового поиска можно повышать на уровне поля или документа с помощью параметра boost в запросах, пользовательских настроек сходства или запросов с функцией оценки, учитывающих бизнес-сигналы — популярность или свежесть. Вкладка Discover в Kibana и её строка поиска построены на возможностях полнотекстового поиска Elasticsearch: KQL (Kibana Query Language) под капотом транслируется в запросы Query DSL.

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

Full-text search: 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ать".

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

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

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

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