Lucene BooleanQuery - PullRequest
       8

Lucene BooleanQuery

3 голосов
/ 04 июня 2009

Как использовать booleanQuery со StandardAnalyzer в Lucene Search?

Ответы [ 3 ]

6 голосов
/ 04 июня 2009

Полагаю, вы имеете в виду разбор логических запросов с использованием объекта QueryParser, верно? В документации по синтаксису запроса Lucene должно быть все необходимое.

2 голосов
/ 05 декабря 2016

Согласно документу логические запросы должны быть созданы 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;
    }
}
0 голосов
/ 27 июня 2012

BooleanQuery. BooleanQuery - это контейнер логических предложений, которые являются необязательными, обязательными или запрещенными подзапросами. Обычно к BooleanQuery можно добавить предложение, используя метод API, который выглядит следующим образом:

public void add (запрос, логическое значение, логическое значение запрещено)

...