Inverted Index

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

Инвертированный индекс — это ключевая структура данных, благодаря которой Elasticsearch так быстро выполняет полнотекстовый поиск: вместо того чтобы просматривать каждый документ в поиске нужного слова, он хранит отображение от каждого уникального термина к списку идентификаторов документов (и позиций), в которых этот термин встречается. Когда вы индексируете документ в Elasticsearch, настроенный анализатор токенизирует и нормализует текстовые поля, а полученные токены записываются в инвертированный индекс, хранящийся внутри сегмента Apache Lucene на шарде. Инвертированный индекс неизменяем после записи: Lucene никогда не изменяет существующий сегмент, а вместо этого создаёт новые сегменты для новых документов, периодически объединяя небольшие сегменты в более крупные в фоновом режиме для поддержания оптимальной производительности поиска. Благодаря инвертированному индексу поиск термина (например, запрос term или match в Query DSL) представляет собой хеш-поиск за O(1) с последующим пересечением множеств, а не полный перебор таблицы — это позволяет Elasticsearch искать среди миллиардов документов за миллисекунды. Понимание инвертированного индекса также помогает объяснить, почему некоторые операции — например, обновление документа в Elasticsearch — внутренне реализуются как удаление с последующим переиндексированием: неизменяемая структура сегментов Lucene не поддерживает модификацию на месте.

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

Inverted Index: Index — логическая коллекция документов (аналог DB-таблицы). Документы — JSON, идентифицируются _id. Индексы делятся на Shards (Lucene-индексы) — primary + replica копии, распределённые по нодам. Inverted Index — on-disk структура, делающая full-text search быстрым: term → список документов с ним. Роли нод: master (cluster state), data (хранение + queries), ingest (pipelines), coordinating (роутинг запросов). Современные кластеры часто используют dedicated роли для стабильности.

Когда применять

Планируйте shard count ДО индексации — primary shards не меняются после создания (только через reindex). Целитесь в 10-50GB на shard. Replicas: минимум 1 в prod (HA + read throughput). Для time-series (logs) — ILM + rollover вместо огромных fixed-индексов. Dedicate master + data + coordinator роли на масштабе (50+ нод).

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

Ловушки Inverted Index: много маленьких shards ("shard explosion" — cluster state растёт, master перегружен); single-shard индексы, растущие огромными (не параллелятся queries); нет replicas в prod (одна нода вниз = data loss); all-rounder ноды на масштабе (master-задачи заглушены data-queries).

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

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