让我们假设我对添加和搜索文档有基本的了解。
管理IndexWriter和IndexReader实例的最佳做法是什么?
目前,我的应用程序创建了一个IndexWriter的单例实例。当我需要进行搜索时,我只需使用以下
从IndexWriter创建一个IndexSearcher。var searcher = new IndexSearcher(writer.GetReader())
我这样做是因为创建一个新的IndexReader会导致索引被加载到内存中,然后等待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 \产品3 \ write.lock' 因为它被另一个人使用 处理。在 System.IO .__ Error.WinIOError(的Int32 errorCode,String maybeFullPath)at System.IO.FileStream.Init(String path, FileMode模式,FileAccess访问, Int32权限,布尔值使用权限, FileShare共享,Int32 bufferSize, FileOptions选项, SECURITY_ATTRIBUTES secAttrs,String msgPath,Boolean bFromProxy,Boolean useLongPath)at System.IO.FileStream..ctor(字符串 path,FileMode模式,FileAccess 访问) Lucene.Net.Store.NativeFSLock.Obtain()
我想也许最好创建一个IndexSearcher的单例实例进行搜索,然后根据需要在内存中创建一个IndexWriter。这样,在更新索引时将创建/删除write.lock文件。我看到的唯一问题是IndexSearcher实例将过时,如果索引已经更新,我需要运行一个重新加载IndexSearcher的任务。
您怎么看?
如何通过实时更新处理大型索引?