¿Es posible usar un Lucene SpanQuery para encontrar todas las ocurrencias donde los términos "rojo", "verde" y "azul" aparecen dentro de una sola oración?Búsqueda consciente de la oración con Lucene SpanQueries
Mi primer enfoque (incompleto/incorrecto) es escribir un analizador que coloca un token de marcador de oraciones especial y el comienzo de una oración en la misma posición que la primera palabra de la oración y luego buscar algo similar al siguientes:
SpanQuery termsInSentence = new SpanNearQuery(
SpanQuery[] {
new SpanTermQuery(new Term (MY_SPECIAL_SENTENCE_TOKEN)),
new SpanTermQuery(new Term ("red")),
new SpanTermQuery(new Term ("green")),
new SpanTermQuery(new Term ("blue")),
},
999999999999,
false
);
SpanQuery nextSentence = new SpanTermQuery(new Term (MY_SPECIAL_SENTENCE_TOKEN));
SpanNotQuery notInNextSentence = new SpanNotQuery(termsInSentence,nextSentence);
el problema, por supuesto, es que nextSentence
no es realmente la próxima frase, es cualquier marcador de sentencia, incluyendo el de la frase que termsInSentence
partidos. Por lo tanto, esto no funcionará.
Mi próximo enfoque es crear el analizador que coloca la ficha antes de la oración (es decir, antes de la primera palabra en lugar de en la misma posición que la primera palabra). El problema con esto es que luego tengo que dar cuenta de la compensación extra causada por MY_SPECIAL_SENTENCE_TOKEN
. Es más, esto será especialmente malo al principio cuando estoy usando un patrón ingenuo para dividir oraciones (por ejemplo, dividir en /\.\s+[A-Z0-9]/
) porque tendré que dar cuenta de todos los marcadores de oraciones (falsas) cuando busco USS Enterprise.
Entonces ... ¿cómo debo abordar esto?