【问题标题】:Lucene docID reliabilityLucene docID 可靠性
【发布时间】:2011-03-31 07:56:52
【问题描述】:


如果 lucene 索引上只发生插入操作(没有删除/更新),那么 docID 是否没有改变?而且它也很可靠
如果是真的,我想用它来增量加载 FieldCache 以降低加载所有文档的开销,最好的解决方案是什么??

【问题讨论】:

    标签: c# java .net lucene lucene.net


    【解决方案1】:

    我不太确定您打算如何处理字段缓存,但我对文档 ID 的理解是,它们可以在插入期间更改,具体取决于挂起的删除、合并策略等。

    即文档 ID 不应在重新打开的索引阅读器上超过提交边界使用

    希望这会有所帮助,

    【讨论】:

      【解决方案2】:

      文档 ID 在段内是静态的。 IndexReader.Open(通常)打开一个DirectoryReader,它结合了几个SegmentReader。您需要将“底部”读取器传递给 FieldCache 以使总体正常工作。

      这是来自FieldCache with frequently updating index 的示例,它确保 FieldCache 仅读取新读取的段,而不是最顶层的读取器(每次提交时都会被视为更改)。

      var directory = FSDirectory.Open(new DirectoryInfo("index"));
      var reader = IndexReader.Open(directory, readOnly: true);
      var documentId = 1337;
      
      // Grab all subreaders.
      var subReaders = new List<IndexReader>();
      ReaderUtil.GatherSubReaders(subReaders, reader);
      
      // Loop through all subreaders. While subReaderId is higher than the
      // maximum document id in the subreader, go to next.
      var subReaderId = documentId;
      var subReader = subReaders.First(sub => {
          if (sub.MaxDoc() < subReaderId) {
              subReaderId -= sub.MaxDoc();
              return false;
          }
      
          return true;
      });
      
      var values = FieldCache_Fields.DEFAULT.GetInts(subReader, "newsdate");
      var value = values[subReaderId];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        • 2015-05-22
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        相关资源
        最近更新 更多