Lucene.NET终身管理

时间:2011-04-20 13:56:44

标签: lucene.net lifetime

让我们假设我对添加和搜索文档有基本的了解。

管理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的任务。

您怎么看?

如何通过实时更新处理大型索引?

1 个答案:

答案 0 :(得分:1)

您应该只使用一个索引编写器,以避免锁定问题。看看:Lucene.Net writing/reading synchronization