2013-10-03 89 views
0

我正在開發一個將在後臺線程上運行的「索引服務」(作爲WPF應用程序的一部分),並使用FileSystemWatcher來監視某些文件。當文件內容發生變化時,我想提取一些信息並更新Lucene索引。偶爾用戶可能希望對索引執行搜索。Lucene.net對象的生命週期?

我應該每次用戶執行搜索時創建一個索引閱讀器嗎?每次索引更新時,作者都是一名作家?或者,對於我的索引服務類(這是一個單例)是否有單例讀寫器實例(加上一個單例FSDirectory,它們都有依賴關係)呢?

如果我使用單例實例,我是否需要擔心關閉/處理它們?如果是這樣,我的索引服務應該執行IDisposable,並在Dispose()做清理?

回答

1

Lucene的InderWriterIndexReader實例都是線程安全的:您不應該有任何問題將它們重用爲單例。初始化任何一個的新實例都非常昂貴(當編寫和搜索類似的設計選項時,後者的接近60%是顯着的改進)。

對於IndexWriter只需保留您通過IndexingService公開的私人實例。對於IndexReader,您需要一種可以處理索引更改的不同方法。基於源,你可以做,

public class IndexingService 

    ... 

    public IndexReader GetReader() 
    { 
     var reopenedReader = this.reader.Reopen(openReadOnly: true); 
     if (reopenedReader != this.reader) 
     { 
      this.reader.Dispose(); 
      return this.reader = reopenedReader; 
     } 

     return this.reader; 
    } 

this.reader.Reopen呼叫將首先檢查讀取器是否是最新的(如果因爲被打開了沒有發生變化),如果是的話,它會簡單地返回自己。如果有變化,讀者將只加載已經改變的段,這通常比加載所有段更快。如果您期望多線程訪問,您還需要同步訪問閱讀器。

最後一件事:在應用程序關閉時,您肯定需要處理資源,作者和讀者(使用方法Dispose())。不這樣做可能會損壞索引。

0

每次創建一個作家都不是最佳選擇,所以您最好等待一段時間並寫出所有更改。您可以在用戶執行搜索時推送更改,這實際上取決於您的索引編寫的複雜程度。

當您將更改提交到索引時,您需要創建一個新的索引閱讀器,否則將不會接受更改。所以我只想將索引閱讀器重新用於索引例程。但是,除非您更新索引,否則不要重新創建閱讀器,否則會降低您的應用速度。