Lucene BooleanQuery
-
09-09-2019 - |
문제
Lucene 검색에서 StandardAnalyzer와 함께 부울 쿼리를 사용하는 방법은 무엇입니까?
해결책
QueryParser 객체를 사용하여 부울 쿼리를 구문 분석하고 있다고 가정합니다. 그만큼 Lucene Query Syntax 문서 필요한 모든 것이 있어야합니다.
다른 팁
문서에 따르면 부울 쿼리는 BooleanQuery.queryBuilder에 의해 한 번 생성 된 후 불변으로 간주해야합니다. 보다 booleanquery.builder.add (org.apache.lucene.search.booleanclause)
코드 예제는 다음에서 찾을 수 있습니다 http://programtalk.com/java-api-usage-examples/org.apache.lucene.util.querybuilder/주어진 한 가지 예는 다음과 같습니다.
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
부울 조항의 컨테이너는 선택 사항, 필수 또는 금지 하위 쿼리입니다. 일반적으로 절을 추가 할 수 있습니다 BooleanQuery
모양의 API 방법을 사용합니다.
public void add (쿼리 쿼리, 부울 필요, 부울 금지)
제휴하지 않습니다 StackOverflow