2012-08-24 40 views
1

我設立了承載Lucene.Net/AzureDirectory搜索引擎的一個WCF Web服務一個單獨的對象。我如何重新初始化在某個區間

對於速度的目的,使用AzureDirectory推薦的方法是有一個所有服務調用中使用的單IndexSearcher實例。這是我必須做的是:

​​

由於該對象緩存正在搜索索引我需要重新初始化該對象上的間隔異步從任何客戶端調用...比如每分鐘左右。於是,我就在安裝在我的蔚藍的實例,這是否另一個線程運行的進程......

LuceneHelper.initSearcher(); 
while (true) 
{ 
    Thread.Sleep(60000); 
    LuceneHelper.initSearcher(); 
} 

我可以從我的測試告訴他們倆都工作,但相互獨立的。所以我猜在我的web服務中有一個IndexSearcher,而在我的工作線程中有一個。

我的問題:有沒有辦法在我的web服務運行我的無限「而」聲明異步或任何其他方式重新初始化一個對象而從客戶的電話?

+0

爲什麼你需要在一段時間內重新打開IndexSearcher?它看起來像你想接近實時的使用Lucene,http://blog.mikemccandless.com/2011/06/lucenes-near-real-time-search-is-fast.html –

+0

搜索通過預先初始化IndexSearcher的它緩存該索引是什麼讓Lucene.Net儘快變成現實。我需要重新打開它的原因是刷新緩存。 – Paul

回答

0

回答您的直接問題,是的,它可能在你的web服務的後臺運行while語句。所有你需要做的就是創建一個Thread class的實例,讓它運行你的循環並在你的應用程序中存儲對它的引用(你的singleton類將是一個很好的地方)。

這就是說,我不會推薦這一點,因爲你不需要打開/關閉/重新打開IndexSearcher class。建議的做法是保持一個共享IndexWriter實例爲您的應用程序的生命,然後調用GetReader method獲得一個IndexReader實例點播(從中可以再創建一個IndexSearcher)。這通常比重新創建索引快得多並且更易於維護(並且它也是實時的,因爲GetReader的調用將對索引進行所有更改)。

+0

將其與IndexWriter.MergedSegmentWarmer結合使用,您可以爲新創建的段執行自定義預熱邏輯。 – sisve

+0

@ simon-svensson我無法找到如何使用IndexWriter.SetMergedSegmentWarmer。你可以分享一個簡單的例子或指導方法的鏈接?謝謝。 – Paul

+0

@Paul,是否有任何異常或錯誤?你的代碼是否被調用? – sisve