假設我對添加和搜索文檔有基本的瞭解。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的任務。
您認爲如何?
你如何處理一個大的索引與實時更新?
問這個問題的人建議他們已經有一個索引編寫器,所以我不確定這是否有用作爲答案。 – Bittercoder 2011-10-02 23:35:22