Lucene.Net优化过程



我正在使用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();
    }
}

我不知道为什么这会删除整个索引?

最新更新