Mein erster Gedanke ist: Würde nicht eine Phrase Abfrage mit Slop die Arbeit machen? Das wäre sicherlich der einfachste Weg sein:
"term1 term2"~5
Dies wird Ihren Laut Analysator verwenden, und eine Nähe Abfrage mit den daraus resultierenden Token erzeugen.
Also, wenn Sie wirklich Notwendigkeit tun SpanQueries hier zu verwenden (vielleicht sind Sie mit Fuzzy-Abfragen oder Platzhalter oder so, oder PhraseQuery drohend an Sie wurde leering und Sie wollen nichts mehr mit ihm zu tun), müssen Sie die Analyse selbst durchführen. Sie können dies tun, indem Sie einen TokenStream von Analyzer.tokenStream
erhalten und die analysierten Token durchlaufen.
Wenn Sie einen Laut Algorithmus verwenden, die pro Trimester (soundex, zum Beispiel) einen einzigen Code erzeugt:
SpanNearQuery.Builder nearBuilder = new SpanNearQuery.Builder("text", true);
nearBuilder.setSlop(4);
TokenStream stream = analyzer.tokenStream("text", queryStringToParse);
stream.addAttribute(CharTermAttribute.class);
stream.reset();
while(stream.incrementToken()) {
CharTermAttribute token = stream.getAttribute(CharTermAttribute.class);
nearBuilder.addClause(new SpanTermQuery(new Term("text", token.toString())));
}
Query finalQuery = nearBuilder.build();
stream.close();
Wenn Sie ein Doppel Metaphone verwenden, wo Sie 1-2 Begriffe auf die haben gleiche Position, es ist ein bisschen komplexer, da Sie diese Position Inkremente berücksichtigen müssen:
SpanNearQuery.Builder nearBuilder = new SpanNearQuery.Builder("text", true);
nearBuilder.setSlop(4);
TokenStream stream = analyzer.tokenStream("text", "through and through");
stream.addAttribute(CharTermAttribute.class);
stream.addAttribute(PositionIncrementAttribute.class);
stream.reset();
String queuedToken = null;
while(stream.incrementToken()) {
CharTermAttribute token = stream.getAttribute(CharTermAttribute.class);
PositionIncrementAttribute increment = stream.getAttribute(PositionIncrementAttribute.class);
if (increment.getPositionIncrement() == 0) {
nearBuilder.addClause(new SpanOrQuery(
new SpanTermQuery(new Term("text", queuedToken)),
new SpanTermQuery(new Term("text", token.toString()))
));
queuedToken = null;
}
else if (increment.getPositionIncrement() >= 1 && queuedToken != null) {
nearBuilder.addClause(new SpanTermQuery(new Term("text", queuedToken)));
queuedToken = token.toString();
}
else {
queuedToken = token.toString();
}
}
if (queuedToken != null) {
nearBuilder.addClause(new SpanTermQuery(new Term("text", queuedToken)));
}
Query finalQuery = nearBuilder.build();
stream.close();