2011-04-20 99 views
4

假設我對添加和搜索文檔有基本的瞭解。Lucene.NET生命週期管理

管理IndexWriter和IndexReader實例的最佳做法是什麼?

目前,我的應用程序創建一個IndexWriter的單例實例。當曾經我需要做一個搜索,我只是通過以下

var searcher = new IndexSearcher(writer.GetReader()) 

我這樣做是因爲創建一個新的IndexReader導致指數得到加載到內存中創建一個從IndexWriter類的IndexSearcher的,然後等待GC重新分配內存。這是造成內存不足的錯誤。

這個當前的實現是否被認爲是理想的?此實現已解決了內存問題,但write.lock文件始終存在問題(因爲IndexWriter總是被即時打開並打開)。以下是我在應用程序中獲得的錯誤的堆棧跟蹤。

鎖獲取超時: NativeFSLock @ C:\的Inetpub \ wwwroot的\ htdocs_beta \ App_Data文件\產品3 \ write.lock: System.IO.IOException:過程 無法訪問該文件 「C:\ inetpub \ wwwroot \ htdocs_beta \ App_Data \ products3 \ write.lock' ,因爲它正在被另一個 進程使用。在 System.IO .__ Error.WinIOError(的Int32 的errorCode,字符串maybeFullPath)在 System.IO.FileStream.Init(字符串路徑, 的FileMode模式,FileAccess的訪問, 的Int32權利,布爾useRights, 文件共享份額,緩衝區大小的Int32 , FileOptions選項, SECURITY_ATTRIBUTES secAttrs,字符串 MSGPATH,布爾bFromProxy,布爾 useLongPath)在 System.IO.FileStream..ctor(字符串 路徑,的FileMode模式,FileAccess的 訪問)在 Lucene.Net.Store。 NativeFSLock.Obtain()

我在想也許最好創建一個IndexSearcher的單例實例進行搜索,然後根據需要在內存中創建一個IndexWriter。這樣,更新索引時將創建/刪除write.lock文件。我看到的唯一問題是,IndexSearcher實例將變得過時,如果索引已更新,我需要運行一個重新加載IndexSearcher的任務。

您認爲如何?

你如何處理一個大的索引與實時更新?

回答