16

Lucene インデックスとインクリメンタル インデックスに対して、7 日ごとに完全な再インデックスを実行します (つまり、インデックスをゼロから作成します)。私たちのインデックスには約 700,000 のドキュメントがあり、完全なインデックスには約 17 時間かかります (これは問題ではありません)。

インクリメンタル インデックスを作成する場合、過去 2 時間以内に変更されたコンテンツのみをインデックスに登録するため、時間は大幅に短縮され、約 30 分ほどかかります。ただし、この時間の多く (おそらく 10 分) が IndexWriter.optimize() メソッドの実行に費やされていることに気付きました。

LuceneFAQは次のように述べています。

IndexWriter クラスは、インデックス データベースを圧縮してクエリを高速化する optimize() メソッドをサポートしています。ドキュメント セットの完全なインデックス作成を実行した後、またはインデックスの増分更新後に、このメソッドを使用することができます。増分更新によってドキュメントが頻繁に追加される場合は、最適化の余分なオーバーヘッドを回避するために、最適化を時々実行する必要があります。

...しかし、これは「頻繁に」が何を意味するのかを定義していないようです。最適化は CPU を集中的に使用し、非常に IO を集中的に使用します。最適化されていないインデックスでクエリを実行した場合のヒットはどのくらいですか (たとえば、50,000 のドキュメントが変更された 20 のインクリメンタル インデックスの後と比較して、完全な再インデックス後のクエリ パフォーマンスに関して特に考えています)。すべてのインクリメンタル インデックスの後に最適化する必要がありますか、それともパフォーマンス ヒットは価値がないのでしょうか?

4

3 に答える 3

17

optimize()マット、現在のプロセスにかかる時間はよくわかっているようですので、を削除して影響を測定することをお勧めします。

これらの2時間のウィンドウで、ドキュメントの多くが変更されますか?ごく一部(50,000 / 700,000は約7%)だけが段階的に再インデックス付けされる場合、私はあなたがから多くの価値を得ているとは思わないoptimize()

いくつかのアイデア:

  • インクリメンタルは一切行わないでくださいoptimize()。私の経験によると、とにかくクエリの大幅な改善は見られません。
  • optimize()2時間ごとではなく毎日行います。
  • optimize()少量の時間帯に実行します(これはjavadoc言うことです)。

そして、あなたが測定をすることを確認してください。これらの種類の変更は、それらなしで暗闇の中でのショットである可能性があります。

于 2008-09-23T11:16:40.450 に答える
4

操作はインデックス全体のoptimize読み取りと書き込みを行うため、IOを大量に消費します。

最適化操作の背後にある考え方は、Luceneインデックス内のさまざまなセグメントをすべて1つのセグメントに再結合することです。これにより、クエリごとに複数のファイルを開いて検索する必要がないため、クエリ時間を大幅に短縮できます。(結合された構造ではなく)通常のLuceneインデックスファイル構造を使用している場合は、コミット操作ごとに新しいセグメントを取得します。私が想定しているあなたの再索引付けと同じですか?

マットには素晴らしいアドバイスがあると思います。彼の言うことはすべて2番目になります。あなたが持っているデータに基づいて行動します。私は実際にはさらに一歩進んで、a)必要な場合とb)クエリ量が少ない場合にのみ最適化します。

クエリのパフォーマンスはインデックス内のセグメントの数と密接に関連しているls -1 index/segments_* | countため、最適化が本当に必要な場合は、単純なものが有用な指標になる可能性があります。

または、クエリのパフォーマンスとボリュームを追跡し、許容できないほど低いボリュームで許容できない低いパフォーマンスに達したときに最適化を開始することは、より良いソリューションです。

于 2008-12-24T00:57:21.607 に答える
2

このメールで、Otis Gospodneticは、インデックスが常に更新されている場合、最適化を使用しないようアドバイスしています。これは 2007 年のものですが、呼び出しoptimize()は本質的に IO を多用する操作です。より段階的なアプローチの使用を検討できます。MergeScheduler _

于 2010-10-06T07:59:10.550 に答える