Lucene.Net写/读同步

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

  2. 我是否可以在打开IndexWriter使用IndexWriter在索引中读取/搜索文档(使用IndexReader )? 或者我必须在阅读前结束写作吗?

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

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

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

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

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

正如我在此邮件列表中找到的那样

Lucene.NET是线程安全的。 因此,您可以在线程之间共享相同的IndexWriter或IndexSearcher实例。 使用写锁定,它还会阻碍使用相同索引打开第二个IndexWriter实例。

我认为我可以分开地写作和阅读; 我会检查一下;)