Solr Lucene';s AtomicReader.termPositionsEnum(术语)不返回偏移量

Solr Lucene';s AtomicReader.termPositionsEnum(术语)不返回偏移量,solr,lucene,Solr,Lucene,更新:添加示例 我们在Lucene 4.6之上有一个API,我正在尝试适应它在Solr 4.6下运行。问题在于,当Lucene创建索引时,我们从索引读取术语的字符偏移量的方式与预期一样有效,但当Solr创建索引时,总是返回-1。在后一种情况下,我可以通过Luke看到角色偏移量,当我访问/tvrh搜索处理程序时,我甚至可以从Solr获得它们,该处理程序使用TermVectorComponent类 这大致就是我在Lucene代码中读取字符偏移量的方式: public void showOffsets

更新:添加示例

我们在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());
      }
    }
  }
}
public void showOffset(目录目录目录,术语){
IndexReader IndexReader=DirectoryReader.open(dir);
IndexReaderContext topContext=indexReader.getContext();
for(AtomicReaderContext上下文:topContext.leaves()){
AtomicReader=context.reader();
术语匹配(术语、读取器);
}
}
private void termMatches(术语,AtomicReader)引发IOException{
DocsAndPositionsEnum postings=reader.termPositionsEnum(术语);
如果(过账!=null){
while(postings.nextDoc()!=DOCS和positionsenum.NO\u更多文档){
对于(int i=0;i
请注意,我需要单个项的值。当针对Solr创建的索引运行时,上面对startOffset()和endOffset()的调用返回-1,尽管对nextPosition()的调用工作正常。Solr的TermVectorComponent打印正确的偏移量,如下所示(意译):

IndexReader=searcher.getIndexReader();
最终术语向量=reader.getTermVector(docId,字段);
TermsEnum TermsEnum=向量迭代器(TermsEnum);
final int freq=(int)termsEnum.totalTermFreq();
DocsAndPositionsEnum dpEnum=null;
while((text=termsEnum.next())!=null){
字符串项=text.utf8ToString();
dpEnum=termsEnum.docsAndPositions(null,dpEnum);
dpEnum.nextDoc();
对于(int i=0;i
但在本例中,它是获取每个文档ID的偏移量,而不是单个术语

谁能告诉我:

  • 为什么我不能使用我的第一个示例获得偏移,和/或
  • 获得给定项的偏移量的更好方法

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

    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());
      }
    }