Lucene.Net写/读同步

Edw*_*d83 10 c# indexing multithreading lucene.net thread-safety

  1. IndexWriter可以在打开阅读(带IndexReader)时将新文档写入索引吗?或者我必须在写作前仔细阅读?

  2. 我可以IndexReader在索引文件(带)中读取/搜索文件(带IndexWriter)吗?或者我必须在阅读前结束写作吗?

  3. Lucene.Net线程安全与否?或者我必须自己写吗?

sis*_*sve 20

您可以随时打开任意数量的读者/搜索者,但只有一位作者.这是由特定于目录的锁实施的,通常涉及名为"write.lock"的文件.

读者打开快照,编写者向索引添加更多数据.IndexReader.Reopen在您的作者IndexWriter.Commit提交()数据后,读者需要打开或重新打开(),除非您正在使用近实时搜索.这涉及从(IndexWriter.GetReader)返回的特殊阅读器,它将能够在执行对GetReader的调用之前查看内容.这也意味着读者可能会看到由于应用程序逻辑调用而永远不会被提交的数据IndexWriter.Rollback.

搜索者使用读者,因此对这些限制相同.(无限数量,只能看到已经提交的内容,除非基于近实时阅读器.)

Lucene是线程安全的,最佳实践是在多个线程之间共享读者和搜索者,同时检查它IndexReader.IsCurrent() == true.您可以运行后台线程,一旦检测到更改,重新打开读取器,创建新的搜索器,然后让主线程使用它.这也可以让您预热任何FieldCache,以便在新搜索器到位后提高搜索速度.