Die Testdaten stammen aus dem ClueWeb09B-Datensatz, dessen Beispiel zu Testzwecken im Verzeichnis ./test_data
gespeichert ist. Wenn mit der Erstellung des Index begonnen wird, liest das Programm den komprimierten Vorwärtsindex ein, dekomprimiert ihn und generiert eine Positionsbuchung. Die Positionsbuchung wird gezählt, um eine Nicht-Positionsbuchung zu generieren.
Die Positions-Postings und Nicht-Positions-Postings werden separat in zwei STL-Vektoren gespeichert. Wenn der Vektor eine bestimmte Größe erreicht, beispielsweise 500, werden beide Vektoren komprimiert und geleert. Auf der Festplatte werden im Verzeichnis disk_index
zwei Dateien erstellt, um das komprimierte Binärarray zu speichern. Dieser Vorgang wird wiederholt, bis weniger als 500 Beiträge übrig sind. Die verbleibenden Buchungen werden als dynamischer Index im Speicher abgelegt.
Derzeit ist nur eine Form der Kodierungsmethode implementiert. Wenn Methode gleich 1 ist, werden die Postings mit variabler Byte-Kodierung komprimiert. Die in meinem Index verwendete Variable-Byte-Regel lautet wie folgt:
Der Name jeder Datei besteht aus zwei Teilen, einem Präfix und einer Nummer. Positionsindizes werden in der Datei „Z0“, „Z1“, ... „Zn“, „I0“, „I1“, ... „In“ gespeichert. Nach dem Komprimieren prüft der Indexer, ob „Z0“ auf der Festplatte vorhanden ist. Wenn „Z0“ nicht beendet wird, wird „Z0“ erstellt und der Index auf „Z0“ geschrieben. Wenn „Z0“ vorhanden ist, wird der Index stattdessen auf „I0“ geschrieben. Für einen nicht-positionellen Index wird „X0“ überprüft und geschrieben, wenn es nicht existiert. Andernfalls wird der nicht-positionelle Index auf „L0“ geschrieben. Die Term-ID wird in den Datei-Metadaten der entsprechenden Datei gespeichert. Die Metadaten des Begriffs speichern den Dateinamen sowie die Start- und Endposition.
Zwei Dateien mit derselben Indexnummer können niemals dauerhaft auf der Festplatte koexistieren. Immer wenn 500 Beiträge auf die Festplatte geschrieben wurden, prüft der Indexer, ob zwei Dateien dieselbe Indexnummer haben. Wenn dies der Fall ist, werden zwei Dateien zu einer neuen Datei mit einer um 1 erhöhten Indexnummer zusammengefasst. Dieser Vorgang wird als logarithmische Zusammenführung bezeichnet. Wenn beispielsweise sowohl „Z0“ als auch „I0“ vorhanden sind, werden sie kombiniert und in „Z1“ geschrieben, oder in „I1“, wenn „Z1“ bereits auf der Festplatte vorhanden ist. Dieser Vorgang wird wiederholt, bis keine „I“-Dateien mehr auf der Festplatte vorhanden sind. Die Metadaten werden entsprechend aktualisiert.
Neue Beiträge werden empfangen und im dynamischen Index gespeichert. Die vom Dokumentenanalysator generierten Buchungen werden als externe Buchungen bezeichnet und die im Speicher zu speichernden Buchungen werden als interne Buchungen bezeichnet. Wenn sich 500 Beiträge im Speicher befinden, wird dieser mit der gleichen Methode wie beim Erstellen eines Index komprimiert.
indexer.cpp
, die korrigiert werden müssen, und zwei Funktionen können in derselben Datei optimiert werden ./initialize.sh
um ein Verzeichnis zu erstellen, in dem der Festplattenindex gespeichert ist, und stellen Sie sicher, dass das Verzeichnis leer ist. make
makefile auf ./INDEX
beginnt mit der Erstellung des Index