tutorial query example lucene

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