2015-12-10 50 views
0

我正在開發一個WPF應用程序,它使用Lucene.Net來索引由第三方進程生成的文件中的數據。它的體積很小,每分鐘創建一次新文件的次數不會超過一次。使用Lucene.Net的應用程序的多個實例

我的應用程序使用在啓動時創建的單例實例IndexWriter。同樣,IndexSearcher也在啓動時創建,但每當IndexWriter.Commit()發生時都會重新創建,以確保新添加的文檔將出現在搜索結果中。

無論如何,有些用戶需要運行應用程序的兩個實例,但問題是在第二個實例中搜索時沒有顯示新添加的文檔。我想這是因爲第一個實例正在提交,並且需要有一種方法來告訴第二個實例重新創建它的IndexSearcher。

其中一種方法是使用文件創建/更新與FileSystemWatcher一起發送信號,但首先想知道我是否可以使用Lucene.Net中的任何內容?

回答

2

我能想到的唯一可能會對你有所幫助的是IndexReader.Reopen()。這將刷新IndexReader,但如果自從讀取器最初打開以來索引已更改,則將只更新。在索引尚未更新的情況下,它應該導致最小的磁盤訪問,並且在它具有的情況下,它會嘗試僅加載已更改或添加的段。

有一點需要注意API:Reopen返回IndexReader。在索引沒有改變的情況下,它返回相同的實例;否則它會返回一個新的。原來的指數讀者沒有設置,所以你需要做手工:

IndexReader reader = /* ... */; 
IndexReader newReader = reader.Reopen(); 

if(newReader != reader) 
{ 
    // Only close the old reader if we got a new one 
    reader.Dispose(); 
} 

reader = newReader; 

我現在無法找到.NET文檔,但對於here are the Java docs Lucene的3.0.3解釋的API。

1

如果兩個實例都在同一個目錄中打開了自己的IndexWriter,則表示您處於痛苦和間歇性不良行爲的世界。

IW期望並要求獨佔索引目錄的控制權。這是鎖定文件的原因。

如果第二個實例可以檢測到存在現有實例,那麼您可能只需在該文件夾中打開IndexReader/Searcher並在目錄更改時重新打開即可。

但是,如果第一個實例關閉,會發生什麼?該指數將不再更新。因此,第二次實例需要重新初始化,這次是使用IW。也許它可以在第一個實例關閉時刪除鎖定文件時執行此操作。

「更好」的方法是啓動一個「服務」(只是後臺進程,可能在系統托盤中)。 所有應用程序的實例將查詢此服務。如果該應用程序已啓動並且未檢測到該服務,則將其啓動。

相關問題