2011-04-20 98 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的任务。

您认为如何?

你如何处理一个大的索引与实时更新?

回答