2012-02-27 77 views
2

我正在使用Lucene .Net 2.9.2创建一个索引。经过大量索引后,索引有许多段和删除的文档,所以我在IndexWriter上调用Optimize(numSegmets)。Lucene .Net优化过程

索引的段数确实减少到numSegmets的值,但它仍然有删除...没有调用Optimize也应该删除所有已删除的文档?

我的问题是非常重要的,所以我可以知道这是Lucene的工作或者也许我有一些bug ......

编辑: 这里是我的代码片段:

IndexWriter writer = new IndexWriter(/*open writer from index directroy*/); 
writer.Optimize(5); 
writer.Commit(); 

bool hasDeletions = writer.HasDeletions(); 

hasDeletions是真实的,虽然我期待这将是错误的...

+0

你也运行提交吗?请发布您的代码。 – jishi 2012-02-27 09:19:57

回答

5

删除可以保留,除非你提供作为最大数量段。

但你不应该担心这一点。引用文档IndexWriter#optimize in Lucene 3.5

此方法已被弃用,因为它是可怕的低效率,很少有理由。随着时间的推移,Lucene的多细分搜索性能已经有所提高,现在默认的TieredMergePolicy会将目标细分为具有删除的细分。

+0

但是旧版本的情况也是如此吗?据我所知最后一个.NET版本是2.9.4 – 2012-02-27 11:49:24

+0

可能不像Lucene(Java)3那样正确。5,但这意味着Lucene.net也将朝着这个方向发展。如果你想删除所有删除,你仍然可以调用'writer.optimize(1)' – jpountz 2012-02-27 13:14:07

2

优化合并段,并且在段合并期间,它将删除每个段中列出的删除。如果您没有进行完全优化,则可能会保留删除,因为这些段不合并/重建。

这并不意味着您需要执行完全优化才能删除删除。

IndexWriter writer = GetIndexWriter(); 
// delete some stuff 
writer.ExpungeDeletes(); 

这将从您的索引中删除已删除的文档,而不进行完全优化。它通常比优化花费更少的时间,尽管它取决于MergePolicy,因为它仍然可以将所有细分合并在一起(我相信默认情况下它不是而是这样做)。

1

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

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