【问题标题】:Lucene.Net writing/reading synchronizationLucene.Net 写/读同步
【发布时间】:2011-07-22 04:34:54
【问题描述】:
  1. 我可以在打开索引(使用IndexReader)读取新文档时(使用IndexWriter)将新文档写入索引吗?还是我必须在写之前先结束阅读?

  2. 我可以在索引中读取/搜索文档(带有IndexReader),同时打开以进行写入(带有IndexWriter)吗?或者我必须在阅读之前关闭写作?

  3. Lucene.Net 线程是否安全?还是我必须自己写?

【问题讨论】:

    标签: c# multithreading indexing thread-safety lucene.net


    【解决方案1】:

    您可以随时打开任意数量的阅读器/搜索器,但只能打开一个作者。这是由特定于目录的锁强制执行的,通常涉及名为“write.lock”的文件。

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

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

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

    【讨论】:

    • 了解IncRef()DecRef() 及其与Close() 的关系(参见文档)是很有用的IndexReader。只要您仍然有 IndexSearchers 引用它(它们本身不调用 Ref-Methods),它们就会帮助您保持 IndexReader 处于打开状态。在所有搜索者都有一个IndexReader 的情况下,这使得替换IndexReaders 变得容易,同时确保打开的IndexSearchers 可以完成。如果我在任何一点上错了,请纠正我。也许,不再建议为所有工作使用一个IndexReader
    • 这些是供专家使用的。从不直接关闭读者通常更容易,但让读者在和平和垃圾收集中消失。 IndexSearcher 有一个对活动阅读器的硬引用,因此在搜索器之前不会对阅读器进行垃圾收集。在所有工作中重用阅读器/搜索器仍然是最佳做法(并在需要时重新打开以重新加载更改)。
    • 这很有趣。只看到 Lucene 的公共 .NET 接口,我一直认为,您必须手动完成所有操作。 IE。任何地方都看不到IDisposable。显眼的Close()也惹人用了……我应该去看看源代码……是不是这样贴近Java实现?
    • 是的。我不确定确切的过程,但 Lucene.NET 似乎是 Java 代码到 C# 的自动端口。没有 IDisposable,因为 Java 没有它。此外,它不会遵循 .NET 命名指南,例如接口以字母 i 开头。
    • 如果 IsCurrent 为 False,您提到“创建一个新的”搜索器。在阅读器上使用 ReOpen 是否总是可以替代这一点,还是只能在某些情况下使用 ReOpen?此外,如果使用 ReOpen,我是否必须锁定阅读器,或者这是否会在内部处理?换句话说,是否可以在当前正在重新打开阅读器的搜索上继续进行搜索?
    【解决方案2】:

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

    Lucene.NET 是线程安全的。所以你可以共享 IndexWriter 的同一个实例 或线程之间的 IndexSearcher。使用写锁,也阻碍了第二次 IndexWriter 实例以相同的索引打开。

    正如我所见,我可以分开写和读;我会检查的;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多