Ist es möglich, eine Lucene SpanQuery zu verwenden, um alle Vorkommen zu finden, bei denen die Begriffe "rot", "grün" und "blau" in einem einzigen Satz vorkommen?Satzbewusste Suche mit Lucene SpanQueries
Mein erster (unvollständiger/inkorrekter) Ansatz besteht darin, einen Analysator zu schreiben, der ein spezielles Satzmarker-Token und den Anfang eines Satzes an der gleichen Position wie das erste Wort des Satzes platziert und dann nach etwas Ähnlichem abfragt folgende:
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);
das Problem ist natürlich, dass nextSentence
Satz nicht wirklich der nächsten ist, dann ist es jeden Satz Marker, einschließlich der in dem Satz, dass termsInSentence
Streichhölzer. Daher wird das nicht funktionieren.
Meine nächste Annäherung ist, den Analysator zu verursachen, der das Zeichen vor dem Satz setzt (das ist vor das erste Wort und nicht in der gleichen Position wie das erste Wort). Das Problem dabei ist, dass ich dann den zusätzlichen Offset berücksichtigen muss, der durch MY_SPECIAL_SENTENCE_TOKEN
verursacht wird. Darüber hinaus ist es besonders schlecht, wenn ich ein naives Muster verwende, um Sätze zu teilen (zB split auf /\.\s+[A-Z0-9]/
), weil ich alle (falschen) Satzmarker berücksichtigen muss, wenn ich nach USS Enterprise suche.
Also ... wie soll ich das angehen?