query - ¿Cómo obtener los tramos coincidentes de una consulta de término total en Lucene 5?
lucene vs elasticsearch (1)
En Lucene para obtener las palabras en torno a un término, se recomienda utilizar consultas de extensión. Hay un buen tutorial en http://lucidworks.com/blog/accessing-words-around-a-positional-match-in-lucene/
Se supone que se debe acceder a los tramos utilizando el método getSpans ().
SpanTermQuery fleeceQ = new SpanTermQuery(new Term("content", "fleece"));
Spans spans = fleeceQ.getSpans(searcher.getIndexReader());
Luego, en Lucene 4, la API cambió y el método getSpans () se volvió más complejo, y finalmente, en la última versión de Lucene (5.3.0), este método fue eliminado (aparentemente trasladado a la clase SpanWeight).
Entonces, ¿cuál es la forma actual de acceder a los tramos combinados con una consulta de término de tramo?
La forma de hacerlo sería la siguiente.
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);
El soporte para iterar sobre los tramos a través de span.next () también ha desaparecido en la versión 5.3 de Lucene. Para iterar sobre los tramos, puede hacer
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());
}