テスト データは ClueWeb09B データセットからのもので、そのサンプルはテスト目的でディレクトリ./test_data
に保存されています。インデックスの構築を開始すると、プログラムは圧縮された前方インデックスを読み取り、それを解凍し、位置ポストを生成します。定位置投稿は、非定位置投稿を生成するためにカウントされます。
位置ポスティングと非位置ポスティングは、2 つの STL ベクトルに別々に格納されます。ベクトルが特定のサイズ (たとえば 500) に達すると、両方のベクトルが圧縮されて空になります。圧縮されたバイナリ配列を保存するために、ディスク上のdisk_index
ディレクトリの下に 2 つのファイルが作成されます。このプロセスは、残りの投稿が 500 件未満になるまで繰り返されます。残った投稿は動的インデックスとしてメモリに保存されます。
現時点では、1 つの形式のエンコード方式のみが実装されています。 Method が 1 の場合、ポスティングは可変バイト エンコーディングを使用して圧縮されます。私のインデックスで使用される可変バイト ルールは次のとおりです。
各ファイルの名前には、プレフィックスと番号の 2 つの部分が含まれます。位置インデックスは、ファイル「Z0」、「Z1」、...「Zn」、「I0」、「I1」、...「In」に保存されます。圧縮後、インデクサーはディスク上に「Z0」が存在するかどうかを確認します。 「Z0」が存在しない場合は、「Z0」が作成され、「Z0」にインデックスが書き込まれます。 「Z0」が存在する場合、代わりにインデックスは「I0」に書き込まれます。非位置インデックスの場合、「X0」がチェックされ、存在しない場合は書き込まれます。それ以外の場合、非位置インデックスは「L0」に書き込まれます。用語IDは、対応するファイルのファイルメタデータに格納される。用語のメタデータには、ファイル名と開始位置と終了位置が格納されます。
同じインデックス番号を持つ 2 つのファイルがディスク上に永続的に共存することはできません。 500 件の投稿がディスクへの書き込みを完了するたびに、インデクサーは同じインデックス番号を持つファイルが 2 つあるかどうかを確認します。存在する場合は、2 つのファイルが結合されて、インデックス番号が 1 ずつ増加した新しいファイルが作成されます。このプロセスは、対数マージとして知られています。たとえば、「Z0」と「I0」の両方が存在する場合、それらは結合されて「Z1」に書き込まれます。「Z1」がすでにディスク上に存在する場合は「I1」に書き込まれます。このプロセスは、ディスク上に「I」ファイルがなくなるまで繰り返されます。それに応じてメタデータが更新されます。
新しい投稿が受信され、動的インデックスに保存されます。ドキュメントアナライザによって生成される転記は外部転記と呼ばれ、メモリに保存される転記は内部転記と呼ばれます。メモリ内に 500 件の投稿がある場合、インデックスを構築するのと同じ方法を使用して圧縮されます。
indexer.cpp
には修正が必要な 2 つのエラーがあり、同じファイル内で 2 つの関数を最適化できます。./initialize.sh
、ディスク インデックスが保存されるディレクトリを作成し、そのディレクトリが空であることを確認します。 make
call makefile ./INDEX
インデックスの構築を開始します。