2017-08-15 4 views
0

Ich benutze Apache Lucene 6.6.0 und ich versuche, Begriffe aus der Suchanfrage zu extrahieren. Die aktuelle Version von Code wie folgt aussieht:Apache Lucene createWeight() für Wildcard-Abfrage

Query parsedQuery = new AnalyzingQueryParser("", analyzer).parse(query); 
Weight weight = parsedQuery.createWeight(searcher, false); 
Set<Term> terms = new HashSet<>(); 
weight.extractTerms(terms); 

Es ziemlich gut funktioniert, aber in letzter Zeit bemerkte ich, dass es nicht mit Wildcards unterstützt das Abfragen (das heißt * Zeichen). Wenn die Abfrage Platzhalter (n) enthält, dann bekomme ich eine Ausnahme:

java.lang.UnsupportedOperationException: Abfrage -ID: 123 * 456 nicht implementiert createWeight bei org.apache.lucene.search.Query. createWeight (Query.java:66) bei org.apache.lucene.search.IndexSearcher.createWeight (IndexSearcher.java:751) bei org.apache.lucene.search.BooleanWeight. (BooleanWeight.java:60) bei org.apache.lucene.search.BooleanQuery.createWeight (BooleanQuery.java:225)

Gibt es eine Möglichkeit, createWeight() mit wildcarded Abfragen zu verwenden? Oder gibt es eine andere Möglichkeit, Suchbegriffe aus der Abfrage ohne createWeight() zu extrahieren?

Antwort

0

Lange Rede kurzer Sinn, es ist notwendig, um die Abfrage, zum Beispiel neu zu schreiben, wie folgt:

final AnalyzingQueryParser analyzingQueryParser = new AnalyzingQueryParser("", analyzer); 

// TODO: The rewrite method can be overridden. 
// analyzingQueryParser.setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE); 

Query parsedQuery = analyzingQueryParser.parse(query); 
// Here parsedQuery is an instance of the org.apache.lucene.search.WildcardQuery class. 

parsedQuery = parsedQuery.rewrite(reader); 
// Here parsedQuery is an instance of the org.apache.lucene.search.MultiTermQueryConstantScoreWrapper class. 

final Weight weight = parsedQuery.createWeight(searcher, false); 
final Set<Term> terms = new HashSet<>(); 
weight.extractTerms(terms); 

Bitte beachten Sie die Gewinde:

für weitere Details.

Es scheint die erwähnte Stack Overflow Frage ist diese: How to get matches from a wildcard Query in Lucene 6.2.

+0

Nun, es sieht für mich wie eine Art Schwarzmagie aus, aber es hat tatsächlich funktioniert. Vielen Dank! –

+0

@DmytroTitov, froh, dass es geholfen hat! Stimme mit dir überein: das ist nicht einfach. –

Verwandte Themen