【发布时间】:2011-04-20 13:56:44
【问题描述】:
假设我对添加和搜索文档有基本的了解。
管理 IndexWriter 和 IndexReader 实例的最佳做法是什么?
目前,我的应用程序创建了一个 IndexWriter 的单例实例。当我需要进行搜索时,我只需使用以下方法从 IndexWriter 创建一个 IndexSearcher
var searcher = new IndexSearcher(writer.GetReader())
我这样做是因为创建一个新的 IndexReader 会导致索引被加载到内存中,然后等待 GC 重新分配内存。这导致内存不足错误。
当前的实现是否理想?这个实现解决了内存问题,但是 write.lock 文件总是存在的问题(因为 IndexWriter 总是被实例化并打开)。这是我在应用程序中遇到的错误的堆栈跟踪。
锁定获取超时: NativeFSLock@C:\inetpub\wwwroot\htdocs_beta\App_Data\products3\write.lock: System.IO.IOException:进程 无法访问文件 'C:\inetpub\wwwroot\htdocs_beta\App_Data\products3\write.lock' 因为它正在被另一个人使用 过程。在 System.IO.__Error.WinIOError(Int32 错误代码,字符串可能全路径)在 System.IO.FileStream.Init(字符串路径, FileMode 模式,FileAccess 访问, Int32 权限,布尔用户权限, FileShare 共享,Int32 bufferSize, 文件选项选项, SECURITY_ATTRIBUTES secAttrs,字符串 msgPath,布尔值 bFromProxy,布尔值 使用LongPath)在 System.IO.FileStream..ctor(字符串 路径、FileMode 模式、FileAccess 访问)在 Lucene.Net.Store.NativeFSLock.Obtain()
我在想也许最好创建一个 IndexSearcher 的单例实例来进行搜索,然后根据需要在内存中创建一个 IndexWriter。这样,在更新索引时将创建/删除 write.lock 文件。我看到的唯一问题是 IndexSearcher 实例会过时,如果索引已更新,我需要运行一个任务来重新加载 IndexSearcher。
你怎么看?
如何通过实时更新处理大型索引?
【问题讨论】:
标签: lucene.net lifetime