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.8mb 的_0.cfs文件……并在 _2.xxx 文件中创建一个相同大小的全新索引……所以对于一个两个文件一个词的变化,它加倍!

如果我重复该操作,它也会继续这样做……所以它只会永远加倍。

我的想法是优化调用应该优化它而不是导致这样的事情?

如何阻止它使我的索引翻倍?

谢谢!

4

1 回答 1

5

这通常是由于在优化时在索引上打开了 IndexReaders/IndexSearchers 造成的。IndexReaders 在打开时会看到索引的快照,因此它们会锁定文件,并且 IndexWriter 在关闭时无法删除它们。

在 optmize 之后,您应该通过重新创建 IndexReaders/IndexSearchers 或使用 IndexReader 上的 Reopen() 方法来刷新它们。刷新 IndexReaders/IndexSearchers 后,如果您创建一个 IndexWriter 并立即关闭它,您应该会看到文件消失。

话虽如此,如果您决定优化实时索引(只有在删除大量文档时才应该这样做),您应该始终期望索引暂时增长 3 倍它的“正常”大小。

于 2012-05-31T14:15:40.970 回答