Lucene BooleanQuery
-
09-09-2019 - |
Frage
Wie booleanQuery mit StandardAnalyzer in Lucene Suche benutzen?
Lösung
Ich nehme an, Sie beziehen sich boolean Abfragen Parsen der QueryParser Objekt verwenden, richtig? Die Lucene Abfragesyntax Dokumentation alles haben, sollten Sie brauchen.
Andere Tipps
Nach dem Dokument sollten boolean Abfragen einmal durch BooleanQuery.QueryBuilder werden erstellt und dann unveränderlich angesehen. Siehe BooleanQuery.Builder.add (org.apache.lucene.search.BooleanClause)
Der Code kann beispielsweise durch http finden : //programtalk.com/java-api-usage-examples/org.apache.lucene.util.QueryBuilder/ und ein Beispiel gegeben ist:
public Query parse(Type type, String fieldName, Object value) throws IOException {
final String field;
MappedFieldType fieldType = context.fieldMapper(fieldName);
if (fieldType != null) {
field = fieldType.name();
} else {
field = fieldName;
}
/*
* If the user forced an analyzer we really don't care if they are
* searching a type that wants term queries to be used with query string
* because the QueryBuilder will take care of it. If they haven't forced
* an analyzer then types like NumberFieldType that want terms with
* query string will blow up because their analyzer isn't capable of
* passing through QueryBuilder.
*/
boolean noForcedAnalyzer = this.analyzer == null;
if (fieldType != null && fieldType.tokenized() == false && noForcedAnalyzer) {
return blendTermQuery(new Term(fieldName, value.toString()), fieldType);
}
Analyzer analyzer = getAnalyzer(fieldType);
assert analyzer != null;
MatchQueryBuilder builder = new MatchQueryBuilder(analyzer, fieldType);
builder.setEnablePositionIncrements(this.enablePositionIncrements);
Query query = null;
switch(type) {
case BOOLEAN:
if (commonTermsCutoff == null) {
query = builder.createBooleanQuery(field, value.toString(), occur);
} else {
query = builder.createCommonTermsQuery(field, value.toString(), occur, occur, commonTermsCutoff, fieldType);
}
break;
case PHRASE:
query = builder.createPhraseQuery(field, value.toString(), phraseSlop);
break;
case PHRASE_PREFIX:
query = builder.createPhrasePrefixQuery(field, value.toString(), phraseSlop, maxExpansions);
break;
default:
throw new IllegalStateException("No type found for [" + type + "]");
}
if (query == null) {
return zeroTermsQuery();
} else {
return query;
}
}
BooleanQuery. BooleanQuery
ist ein Container von Booleschen Klauseln, die optional sind, erforderlich oder Subqueries verboten. Sie können in der Regel eine Klausel hinzufügen Verwendung einer API-Methode BooleanQuery
machen, die wie folgt aussieht:
public void add (Query-Abfrage, boolean erforderlich, boolean verboten)