【问题标题】:How to get the matching spans of a Span Term Query in Lucene 5?如何在 Lucene 5 中获取 Span Term Query 的匹配跨度?
【发布时间】:2015-09-03 21:40:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: lucene


    【解决方案1】:

    方法如下。

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

    Lucene 5.3 版也不再支持通过 span.next() 对 span 进行迭代。要遍历跨度,您可以这样做

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2010-11-01
      • 2012-12-09
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多