Открыть сервис

Инвертированный индекс

Инвертированный индекс — это структура данных, используемая в информационном поиске для хранения соответствий между термами (словами, токенами) и документами, в которых они встречаются. В отличие от прямого индекса, который сопоставляет документы с их содержимым, инвертированный индекс позволяет быстро находить документы по заданному запросу, что делает его ключевым компонентом поисковых систем (например, Google, Яндекс), баз данных полнотекстового поиска (Elasticsearch, Apache Lucene) и библиотек обработки естественного языка.

Основные понятия и структура

Инвертированный индекс состоит из двух основных частей:

Формально инвертированный индекс можно представить как отображение вида: `` терм → [(docID₁, позиция₁, позиция₂, ...), (docID₂, ...), ...] ``

Например, для коллекции из трёх документов:

Инвертированный индекс будет выглядеть так:

История

Идея инвертированного индекса восходит к механизмам библиотечных каталогов, где для быстрого поиска книг по ключевым словам использовались карточки с перекрёстными ссылками. В компьютерной форме концепция впервые была реализована в 1960-х годах в рамках проектов по автоматизации информационного поиска (например, система SMART Джерарда Солтона). Ключевой прорыв произошёл в 1990-х годах с развитием веб-поисковиков: инвертированный индекс стал основой для индексации миллиардов веб-страниц. Современные реализации (Apache Lucene, Elasticsearch) оптимизируют индекс для работы с терабайтами данных, используя сжатие, битовые карты и распределённые вычисления.

Классификация

Инвертированные индексы можно классифицировать по нескольким признакам:

По объёму хранимой информации

По способу хранения пост-листов

По типу документов

Устройство и характеристики

Построение индекса

Процесс построения инвертированного индекса включает следующие этапы:

  1. Токенизация: разбиение текста на отдельные токены (слова, числа, знаки).
  2. Нормализация: приведение токенов к единой форме (нижний регистр, стемминг — «кошки» → «кошк», лемматизация — «бежал» → «бежать»).
  3. Удаление стоп-слов: исключение часто встречающихся слов («и», «в», «на»), не несущих смысловой нагрузки.
  4. Сортировка и слияние: группировка пар (терм, docID) и формирование пост-листов.

Поиск по индексу

При поступлении запроса (например, «кошка собака»):

  1. Поиск термов в словаре.
  2. Извлечение соответствующих пост-листов.
  3. Выполнение логической операции (для AND — пересечение списков, для OR — объединение).
  4. Ранжирование результатов по релевантности (например, по TF-IDF, BM25).

Производительность

Основные характеристики:

Применение

Поисковые системы

Инвертированный индекс — основа всех современных веб-поисковиков. Google, Яндекс, Bing используют его для индексации миллиардов страниц. При вводе запроса система обращается к индексу, находит релевантные документы и возвращает их в виде списка.

Базы данных и системы управления контентом

Информационный поиск и NLP

Другие области

Примеры реализации

Apache Lucene

Библиотека на Java, предоставляющая готовую реализацию инвертированного индекса. Поддерживает позиционные индексы, стемминг, сжатие, ранжирование по BM25. Используется в Elasticsearch, Solr, Twitter Search.

Elasticsearch

Распределённая система на основе Lucene. Инвертированный индекс шардируется на несколько узлов, что позволяет обрабатывать петабайты данных. Поддерживает сложные запросы (фразовые, fuzzy, геопространственные).

PostgreSQL (GIN-индекс)

PostgreSQL использует инвертированный индекс через тип данных tsvector и индекс GIN (Generalized Inverted Index). Пример: ``sql CREATE INDEX idx_gin ON documents USING GIN(to_tsvector('russian', content)); SELECT * FROM documents WHERE to_tsvector('russian', content) @@ to_tsquery('кошка & собака'); ``

Критика и ограничения

Несмотря на широкое распространение, инвертированный индекс имеет недостатки:

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →