>可以在打开阅读时使用IndexWriter(IndexWriter)将新文档写入索引(使用IndexReader)?还是在写作之前我要仔细阅读吗?
>可以在索引中读取/搜索文档(使用IndexReader)打开它(使用IndexWriter)吗?或者我必须在阅读之前关闭写作?
Lucene.Net线程是否安全?还是我自己写?
>可以在索引中读取/搜索文档(使用IndexReader)打开它(使用IndexWriter)吗?或者我必须在阅读之前关闭写作?
Lucene.Net线程是否安全?还是我自己写?
解决方法
您可能会随时开放任何数量的读者/搜索者,但只有一位作家.这是由目录特定的锁执行的,通常涉及一个名为“write.lock”的文件.
读者打开快照,作者将更多的数据添加到索引.在您的作者提交(IndexWriter.Commit)数据后,读者需要打开或重新打开(IndexReader.Reopen)才能看到,除非您使用近实时搜索.这涉及从(IndexWriter.GetReader)返回的特殊读者,它将能够在GetReader的调用执行之前查看内容.这也意味着读者可能会看到由于应用程序逻辑调用IndexWriter.Rollback而永远不会被提交的数据.
搜索者使用读者,对这些相同的限制. (无限数量,只能看到已经提交的内容,除非是基于近实时阅读器.)
Lucene是线程安全的,最佳实践是在多个线程之间共享读者和搜索者,同时检查IndexReader.IsCurrent()== true.您可以有一个后台线程运行,一旦检测到更改,重新打开读取器,创建一个新的搜索器,然后让主线程使用它.一旦新的搜索器到位,这也可以预先使用您使用的FieldCache来提高搜索速度.