Lucene インデックスとインクリメンタル インデックスに対して、7 日ごとに完全な再インデックスを実行します (つまり、インデックスをゼロから作成します)。私たちのインデックスには約 700,000 のドキュメントがあり、完全なインデックスには約 17 時間かかります (これは問題ではありません)。
インクリメンタル インデックスを作成する場合、過去 2 時間以内に変更されたコンテンツのみをインデックスに登録するため、時間は大幅に短縮され、約 30 分ほどかかります。ただし、この時間の多く (おそらく 10 分) が IndexWriter.optimize() メソッドの実行に費やされていることに気付きました。
LuceneFAQは次のように述べています。
IndexWriter クラスは、インデックス データベースを圧縮してクエリを高速化する optimize() メソッドをサポートしています。ドキュメント セットの完全なインデックス作成を実行した後、またはインデックスの増分更新後に、このメソッドを使用することができます。増分更新によってドキュメントが頻繁に追加される場合は、最適化の余分なオーバーヘッドを回避するために、最適化を時々実行する必要があります。
...しかし、これは「頻繁に」が何を意味するのかを定義していないようです。最適化は CPU を集中的に使用し、非常に IO を集中的に使用します。最適化されていないインデックスでクエリを実行した場合のヒットはどのくらいですか (たとえば、50,000 のドキュメントが変更された 20 のインクリメンタル インデックスの後と比較して、完全な再インデックス後のクエリ パフォーマンスに関して特に考えています)。すべてのインクリメンタル インデックスの後に最適化する必要がありますか、それともパフォーマンス ヒットは価値がないのでしょうか?