【问题标题】:Lucene's AtomicReader.termPositionsEnum(Term) not returning offSetsLucene 的 AtomicReader.termPositionsEnum(Term) 不返回偏移量
【发布时间】:2014-02-09 14:13:01
【问题描述】:

更新:添加示例

我们有一个基于 Lucene 4.6 的 API,我正在尝试使其适应在 Solr 4.6 下运行。问题是当索引由 Lucene 创建时,我们从索引中读取术语的字符偏移量的方式按预期工作,但在 Solr 创建索引时总是返回 -1。在后一种情况下,我可以通过 Luke 查看字符偏移量,甚至可以在访问 /tvrh 搜索处理程序时从 Solr 获取它们,该处理程序使用 TermVectorComponent 类。

这大致是我在 Lucene 代码中读取字符偏移的方式:

public void showOffsets(Directory dir, Term term) {
  IndexReader indexReader = DirectoryReader.open(dir);
  IndexReaderContext topContext = indexReader.getContext();

  for (AtomicReaderContext context : topContext.leaves()) {
    AtomicReader reader = context.reader();
    termMatches(term, reader);
  }
}

private void termMatches(Term term, AtomicReader reader) throws IOException {
  DocsAndPositionsEnum postings = reader.termPositionsEnum(term);
  if (postings != null) {
    while (postings.nextDoc() != DocsAndPositionsEnum.NO_MORE_DOCS) {
      for (int i = 0; i < postings.freq(); i++) {
        System.out.println(
          "term:" + term.toString() +
          " tokpos:" + postings.nextPosition() +
          " start:" + postings.startOffset() +
          " end:" + postings.endOffset());
      }
    }
  }
}

请注意,我想要单个术语的值。当针对 Solr 创建的索引运行时,上面对 startOffset() 和 endOffset() 的调用返回 -1,尽管对 nextPosition() 的调用正常。 Solr 的 TermVectorComponent 像这样打印正确的偏移量(释义):

IndexReader reader = searcher.getIndexReader();
final Terms vector = reader.getTermVector(docId, field);
TermsEnum termsEnum = vector.iterator(termsEnum);

final int freq = (int) termsEnum.totalTermFreq();
DocsAndPositionsEnum dpEnum = null;
while((text = termsEnum.next()) != null) {
  String term = text.utf8ToString();
  dpEnum = termsEnum.docsAndPositions(null, dpEnum);
  dpEnum.nextDoc();

  for (int i = 0; i < freq; i++) {
    final int pos = dpEnum.nextPosition();

    System.out.println("start:" + dpEnum.startOffset());
    System.out.println("end:" + dpEnum.endOffset());
  }
}

但在这种情况下,它获取的是每个文档 ID 的偏移量,而不是单个术语。

谁能告诉我:

  1. 为什么我无法使用我的第一个示例获取偏移量,和/或
  2. 获取给定术语的偏移量的更好方法?

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    Solr 电子邮件列表中的 Robert Muir 指出,我对 Solr 中的索引选项感到困惑。我不需要术语向量。相反,我需要将storeOffsetsWithPositions="true" 添加到架构中的字段定义中。这样做并重新索引后,我现在得到了预期的偏移量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多