2012-02-27 73 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(); 
    } 
} 

我不知道爲什麼會刪除整個索引?