2012-05-31 31 views
3

我在一個正常的方式創建索引:Lucene net IndexWriter在UpdateDocument之後即使進行優化也會使索引大小加倍?

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個文件exactly..with 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文件大小的方式ind ex之前是5.8mb ...並且在_2.xxx文件中創建了一個相同大小的全新索引...所以對於一個單詞更改的兩個文檔,它將其加倍!

如果我重複這個操作,它也會繼續這樣做...所以它只會永遠加倍。

我的想法是,優化調用應該優化它,而不是導致這樣的事情?

如何阻止我的指數翻倍?

Thnx!

回答

4

這通常是由於您在優化時在索引中打開了IndexReader/IndexSearchers引起的。索引讀取器在打開索引時會看到索引的快照,因此它們會鎖定這些文件,並且IndexWriter在關閉時無法刪除它們。

在optmize之後,您應該通過重新創建它們或使用IndexReader上的Reopen()方法來刷新IndexReaders/IndexSearchers。 IndexReaders/IndexSearchers刷新後,如果您創建IndexWriter並立即關閉它,則應該看到文件消失。這就是說,如果您決定優化活動索引(您應該只在刪除大量文檔時才這樣做),那麼您應該始終期望索引暫時增長3倍,這是「正常」大小。

+0

Thnx,做到了!我在c#中使用聲明來包裝IndexSearcher,該聲明處理索引後,不要讓它掛起來,這就做到了! Btw。你知道將IndexSearcher緩存爲performanse會更聰明嗎? 此外,如果我確實緩存它,是否有辦法在晚上強制殺死所有搜索者(例如,當幾乎沒有人使用搜索器Web應用程序時,我的索引每天晚上由單獨的應用程序執行一次)? –

+0

是的,你應該試圖儘可能保持Searcher打開的時間,因爲內部lucene緩存底層IndexReader中的信息,這有助於提高性能。我通常做的是有一個管理器來保存我的IndexSearcher實例,通常每個索引爲1。當我即將關閉我的IndexWriter時,我首先使用管理器關閉IndexSearchers,然後關閉IndexWriter。 –

+0

我已經完成了我的索引優化。它的規模從370增加到826 GB,但文件現在只針對一個細分市場,並且在嘗試了您的建議後尺寸不會縮小。你可以給我更多的建議嗎?謝謝。 –

相關問題