Как хранится инвертированный индекс? - PullRequest
0 голосов
/ 11 марта 2020

Я недавно сделал индекс ок. 2 000 000 документов в памяти. Документы импортируются из базы данных mysql и их загрузка занимает от 6 до 10 секунд. Каждый раз при запуске программа тратит время на импорт данных. Я пробовал использовать json, pickle, cPickle и даже redis, но время - проблема, и для обновления мне нужно перезапустить всю программу. Я использую python здесь.

Мой вопрос заключается в том, как поисковые системы, такие как google, solr ,asticsearch, хранят инвертированные индексы. Они хранят их в памяти как таблицы sh или в базе данных? Как индекс обновляется без перезапуска? Что может быть лучшей базой данных для таких целей.

1 Ответ

2 голосов
/ 12 марта 2020

Короткий ответ :

Вам не нужно загружать все в память, поскольку этот процесс может быть особенно медленным для больших коллекций документов (что еще хуже, инвертированный индекс может даже не помещаться в память).

Длинный ответ :

Инвертированный индекс обычно хранится на диске и загружается на основе динамического c в зависимости от запроса ... например, если запрос «переполнение стека», вы попадаете в отдельные списки, соответствующие терминам «стек» и «переполнение» ...

Структура файла для инвертированного списка представляет собой сочетание обеих фиксированных длин. и компоненты переменной длины. Информация переменной длины хранится как указатели .

Поскольку члены (в основном, строки) имеют переменную длину, они преобразуются в целые числа (фиксированная длина 4/8 байтов). Отображение обычно хранится в памяти как таблица ha sh (#terms обычно не так велика, порядка 100 КБ, что легко помещается в памяти).

Учитывая термин, вы должны посмотреть его в хэш-таблице in-mem и получите ее id . Затем вы используете id для прямого перехода ( произвольный доступ со смещением ) к его местоположению на диске. Это местоположение содержит указатель на список документов, содержащих этот термин (этот список имеет переменную длину), который необходимо загрузить в память.

После загрузки сообщений для всех условий запроса (обычно это не большое число ), вы можете агрегировать оценки для всех документов, просматривая эти списки (обычно эти списки сортируются по идентификаторам документов).

Схема c Диаграмма приведенного выше описания: enter image description here

...