我正在以正常方式创建索引:
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!
答案 0 :(得分:5)
这通常是由于在优化时在索引上打开了IndexReaders / IndexSearchers。 IndexReaders在打开时会看到索引的快照,因此它们会锁定文件,而IndexWriter在关闭时无法删除它们。
在optmize之后,您应该通过重新创建它们或使用IndexReader上的Reopen()方法刷新IndexReaders / IndexSearchers。一旦IndexReaders / IndexSearchers刷新,如果您创建一个IndexWriter并立即关闭它,您应该看到文件消失。
话虽如此,如果你决定优化实时索引(你应该只在删除大量文档时才这样做),你应该总是期望索引暂时增长3倍,这是“正常”的大小。