如何在Lucene 5中获得Span Term Query的匹配范围?

Jul*_*ano 5 lucene

在Lucene中,为了得到一个术语,建议使用Span Queries.http://lucidworks.com/blog/accessing-words-around-a-positional-match-in-lucene/有很好的演练.

应该使用getSpans()方法访问跨度.

SpanTermQuery fleeceQ = new SpanTermQuery(new Term("content", "fleece"));
Spans spans = fleeceQ.getSpans(searcher.getIndexReader());
Run Code Online (Sandbox Code Playgroud)

然后在Lucene 4中,API发生了变化,getSpans()方法变得更加复杂,最后,在最新的Lucene版本(5.3.0)中,此方法被删除(显然已移至SpanWeight类).

那么,当前访问跨度项查询匹配的跨度的方法是什么?

Apu*_*urv 2

方法如下。

LeafReader pseudoAtomicReader = SlowCompositeReaderWrapper.wrap(reader);
Term term = new Term("field", "fox");
SpanTermQuery spanTermQuery = new SpanTermQuery(term);
SpanWeight spanWeight = spanTermQuery.createWeight(is, false);
Spans spans = spanWeight.getSpans(pseudoAtomicReader.getContext(), Postings.POSITIONS);
Run Code Online (Sandbox Code Playgroud)

Lucene 5.3 版本中也不再支持通过 span.next() 迭代跨度。要迭代您可以执行的跨度

int nxtDoc = 0;
while((nxtDoc = spans.nextDoc()) != spans.NO_MORE_DOCS){
  System.out.println(spans.toString());
  int id = nxtDoc;
  System.out.println("doc_id="+id);
  Document doc = reader.document(id);
  System.out.println(doc.getField("field"));
  System.out.println(spans.nextStartPosition());
  System.out.println(spans.endPosition());
}
Run Code Online (Sandbox Code Playgroud)