Lucene的InderWriter
和IndexReader
實例都是線程安全的:您不應該有任何問題將它們重用爲單例。初始化任何一個的新實例都非常昂貴(當編寫和搜索類似的設計選項時,後者的接近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()
)。不這樣做可能會損壞索引。