3

通常の方法でインデックスを作成しています:

var directory = FSDirectory.Open(...);
var analyzer = ...

var indexWriter = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
indexWriter.SetWriteLockTimeout(30000);

indexWriter.AddDocument(doc1);
indexWriter.AddDocument(doc2);
indexWriter.AddDocument(...);

indexWriter.Commit();
indexWriter.Optimize();
indexWriter.Close();

これにより、5.8mbのインデックスが作成されます

ここで、2 つのドキュメントを正確に更新する必要があります..それぞれに 1 つの単語を追加して..インデックスのサイズをごくわずかに増やすか、まったく増やす必要はありません。

var indexWriter = new IndexWriter(directory, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
indexWriter.SetWriteLockTimeout(30000);

indexWriter.UpdateDocument(doc1);
indexWriter.UpdateDocument(doc2);

indexWriter.Commit();
**indexWriter.Optimize();**
indexWriter.Close();

この操作は、インデックスが以前は 5.8 MB だったサイズの _0.cfs ファイルを残すという方法で、インデックスサイズを 2 倍にし、_2.xxx ファイルに同じサイズのまったく新しいインデックスを作成します。 1 つの単語を含む 2 つのドキュメントを変更すると、2 倍になります。

操作を繰り返すと、これも続行されます...したがって、永遠に2倍になります。

私の考えでは、最適化呼び出しはそれを最適化し、これらのようなことを引き起こさないようにする必要がありますか?

インデックスが2倍にならないようにするにはどうすればよいですか?

サンクス!

4

1 に答える 1

5

これは通常、最適化中に IndexReaders/IndexSearchers がインデックスで開かれていることが原因です。IndexReaders は、開いたときに Index のスナップショットを参照するため、ファイルをロックしたままにし、IndexWriter は閉じたときにそれらを削除できません。

最適化後、IndexReaders/IndexSearchers を再作成するか、IndexReader で Reopen() メソッドを使用して更新する必要があります。IndexReaders/IndexSearchers が更新されたら、IndexWriter を作成してすぐに閉じると、ファイルが表示されなくなります。

そうは言っても、ライブ インデックスを最適化することにした場合 (大量のドキュメントを削除する場合にのみ行う必要があります)、インデックスが一時的に「通常の」サイズの 3 倍になることを常に想定する必要があります。

于 2012-05-31T14:15:40.970 に答える