2010-05-12 19 views
1

什麼是LINQ到Lucene的Index<T>的正確使用模式?正確的LINQ到Lucene索引<T> ASP.NET的使用模式?

它實現IDisposible所以我想它包裹在一個using語句將最有意義:

IEnumerable<MyDocument> documents = null; 

using (Index<MyDocument> index = new Index<MyDocument>(new System.IO.DirectoryInfo(IndexRootPath))) 
{ 
    documents = index.Where(d => d.Name.Like("term")).ToList(); 
} 

我偶爾會遇到磁盤索引的不必要的刪除。如果指數的多個實例同時存在,那麼100%似乎就會發生。我使用PLINQ編寫了一個測試,並行運行2個搜索,1個搜索工作,另一個返回0結果,因爲索引被清空。

  • 我應該使用一個單一的靜態實例呢?
  • 我應該把它包裝在Lazy<T>
  • 當我有多個用戶同時訪問靜態索引時,我是否會解決其他問題?

我也想根據需要定期重新編制索引,可能使用Windows服務等其他進程。如果用戶在索引重建期間搜索,我是否也會遇到問題?

回答

0

該代碼看起來像Linq-to-Lucene

完全清除的Lucene索引的大多數情況是使用create參數設置爲true創建的新IndexWriters。問題中的代碼不處理索引,因此進一步調試很困難。

Lucene.Net是線程安全的,我期望linq-to-lucene也可以抑制這種行爲。一個靜態索引實例會緩存內存中的東西,但我想你需要自己處理索引重新加載的變化(我不知道linq-to-lucene是否會爲你做這件事)。

使用多個搜索器/閱讀器進行重新索引時應該沒有問題,構建Lucene以支持該場景。但是,每個目錄只能有一個編寫器,所以在Windows服務優化索引時,沒有其他進程可以將文檔寫入索引。