我正在使用Lucene.Net 2.9.2创建一个索引。经过大量索引,索引中有许多段和已删除的文档,因此我在IndexWriter上调用Optimize(numSegmets)。
索引的分段数确实减少到numSegmets的值,但它仍然有删除。。。调用"优化"不应该同时删除所有已删除的文档吗?
我的问题非常重要,所以我可以知道Lucene是这样工作的,还是我有一些错误。。。
编辑:这是我的代码片段:
IndexWriter writer = new IndexWriter(/*open writer from index directroy*/);
writer.Optimize(5);
writer.Commit();
bool hasDeletions = writer.HasDeletions();
hasDelitions是真的,而我原以为它是假的。。。
删除可以保留,除非您提供1作为最大分段数。
但你不应该担心这个。引用Lucene 3.5 中IndexWriter#优化的文档
这种方法一直被反对,因为它效率极低,而且很少有正当理由。随着时间的推移,Lucene的多段搜索性能有所提高,默认的TieredMergePolicy现在针对的是删除的段。
Optimization合并段,在段合并过程中,它会删除每个段中列出的删除项。如果不进行完全优化,则可能会保留删除,因为段不会合并/重建。
这并不意味着你需要做一个完整的优化来删除删除。
IndexWriter writer = GetIndexWriter();
// delete some stuff
writer.ExpungeDeletes();
这将在不进行完全优化的情况下从索引中删除已删除的文档。它通常比优化花费更少的时间,尽管它确实依赖于MergePolicy
,因为它仍然可能将所有分段合并在一起(我相信默认情况下它会而不是这样做)。
Optimize似乎正在删除整个索引?
我是Lucene.NET的新手,但我已经把它连接起来了,一切看起来都很棒!我添加了测试数据,删除了项目,然后尝试优化(1)和ExpungeDeletes()(如上所示)。。。
但不管我怎么处理。。。它不是合并或其他什么——它只是删除整个索引?
我的代码看起来像这样(从网上的一个样本中得到):
public void Optimize()
{
analyzer = new StandardAnalyzer(Version.LUCENE_30);
using (var writer = new IndexWriter(_directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED))
{
analyzer.Close();
//writer.Optimize(1);
writer.ExpungeDeletes();
writer.Dispose();
}
}
我不知道为什么这会删除整个索引?