Тестовые данные взяты из набора данных ClueWeb09B, образец которого хранится в каталоге ./test_data
для целей тестирования. Когда начинается построение индекса, программа считывает сжатый прямой индекс, распаковывает его и генерирует позиционные публикации. Позиционная проводка учитывается для создания непозиционной проводки.
Позиционные и непозиционные публикации хранятся в двух векторах STL отдельно. Когда вектор достигает определенного размера, например 500, оба вектора сжимаются и опустошаются. На диске в каталоге disk_index
создаются два файла для хранения сжатого двоичного массива. Этот процесс повторяется до тех пор, пока не останется менее 500 публикаций. Оставшиеся записи хранятся в памяти как динамический индекс.
На данный момент реализована только одна форма метода кодирования. Когда метод равен 1, сообщения сжимаются с использованием кодирования переменных байтов. Правило переменных байтов, используемое в моем индексе, выглядит следующим образом:
Имя каждого файла состоит из двух частей: префикса и номера. Позиционные индексы хранятся в файле «Z0», «Z1», ... «Zn», «I0», «I1», ... «В». После сжатия индексатор проверяет, существует ли «Z0» на диске. Если «Z0» не завершается, создается «Z0» и записывается индекс в «Z0». Если «Z0» существует, вместо этого индекс записывается в «I0». Для непозиционного индекса проверяется «X0» и записывается в него, если он не существует. В противном случае непозиционный индекс записывается в «L0». Идентификатор термина хранится в метаданных файла соответствующего файла. Метаданные термина хранят имя файла, а также начальную и конечную позицию.
Два файла с одинаковым индексным номером никогда не смогут постоянно сосуществовать на диске. Когда 500 сообщений завершают запись на диск, индексатор проверяет, есть ли два файла с одинаковым индексным номером. Если они есть, два файла объединяются в новый файл с индексным номером, увеличенным на 1. Этот процесс известен как логарифмическое слияние. Например, если существуют и «Z0», и «I0», они объединяются и записываются в «Z1» или «I1», если «Z1» уже существует на диске. Этот процесс повторяется до тех пор, пока на диске не останется файлов «I». Метаданные обновляются соответствующим образом.
Новые публикации принимаются и сохраняются в динамическом индексе. Проводки, создаваемые анализатором документов, называются внешними проводками, а проводки, сохраняемые в памяти, называются внутренними проводками. Когда в памяти имеется 500 проводок, она сжимается тем же методом, что и при построении индекса.
indexer.cpp
, которые необходимо исправить, и две функции можно оптимизировать в одном файле. ./initialize.sh
, чтобы создать каталог, в котором хранится индекс диска, и убедиться, что каталог пуст. make
./INDEX
начинает построение индекса.