UpdateDocument之后的Lucene net IndexWriter即使使用optimize也会将索引的大小加倍?

时间:2012-05-31 09:56:18

标签: indexing lucene.net lucene

我正在以正常方式创建索引:

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();

此操作以索引大小为 _0.cfs 的方式减去索引的大小,该文件的大小为索引之前 5.8mb ...并创建一个_2.xxx文件中相同大小的全新索引...所以对于一个单词更改的两个文档,它会加倍!

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

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

如何阻止它加倍索引?

日Thnx!

1 个答案:

答案 0 :(得分:5)

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

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

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