org.hibernate.search.query.dsl.impl.ConnectedSimpleQueryParser.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.search.query.dsl.impl.ConnectedSimpleQueryParser.java

Source

/*
 * Hibernate Search, full-text search for your domain model
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */

package org.hibernate.search.query.dsl.impl;

import java.util.HashMap;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.simple.SimpleQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;

/**
 * A FieldsContext aware implementation of the SimpleQueryParser of Lucene.
 *
 * @author Guillaume Smet
 */
public class ConnectedSimpleQueryParser extends SimpleQueryParser {

    /** Fields context as defined by the DSL */
    protected final List<FieldsContext> fieldsContexts;

    /** Creates a new parser searching over multiple fields with different weights. */
    public ConnectedSimpleQueryParser(Analyzer analyzer, List<FieldsContext> fieldsContexts) {
        this(analyzer, fieldsContexts, -1);
    }

    /** Creates a new parser with custom flags used to enable/disable certain features. */
    public ConnectedSimpleQueryParser(Analyzer analyzer, List<FieldsContext> fieldsContexts, int flags) {
        super(analyzer, new HashMap<String, Float>(0), flags);
        this.fieldsContexts = fieldsContexts;
    }

    /**
     * Factory method to generate a standard query (no phrase or prefix operators).
     */
    @Override
    protected Query newDefaultQuery(String text) {
        BooleanQuery.Builder bqb = new BooleanQuery.Builder().setDisableCoord(true);
        for (FieldsContext fieldsContext : fieldsContexts) {
            for (FieldContext fieldContext : fieldsContext) {
                Query q = createBooleanQuery(fieldContext.getField(), text, getDefaultOperator());
                if (q != null) {
                    bqb.add(fieldContext.getFieldCustomizer().setWrappedQuery(q).createQuery(),
                            BooleanClause.Occur.SHOULD);
                }
            }
        }
        return simplify(bqb.build());
    }

    /**
     * Factory method to generate a fuzzy query.
     */
    @Override
    protected Query newFuzzyQuery(String text, int fuzziness) {
        BooleanQuery.Builder bqb = new BooleanQuery.Builder().setDisableCoord(true);
        for (FieldsContext fieldsContext : fieldsContexts) {
            for (FieldContext fieldContext : fieldsContext) {
                Query q = new FuzzyQuery(new Term(fieldContext.getField(), text), fuzziness);
                if (q != null) {
                    bqb.add(fieldContext.getFieldCustomizer().setWrappedQuery(q).createQuery(),
                            BooleanClause.Occur.SHOULD);
                }
            }
        }
        return simplify(bqb.build());
    }

    /**
     * Factory method to generate a phrase query with slop.
     */
    @Override
    protected Query newPhraseQuery(String text, int slop) {
        BooleanQuery.Builder bqb = new BooleanQuery.Builder().setDisableCoord(true);
        for (FieldsContext fieldsContext : fieldsContexts) {
            for (FieldContext fieldContext : fieldsContext) {
                Query q = createPhraseQuery(fieldContext.getField(), text, slop);
                if (q != null) {
                    bqb.add(fieldContext.getFieldCustomizer().setWrappedQuery(q).createQuery(),
                            BooleanClause.Occur.SHOULD);
                }
            }
        }
        return simplify(bqb.build());
    }

    /**
     * Factory method to generate a prefix query.
     */
    @Override
    protected Query newPrefixQuery(String text) {
        BooleanQuery.Builder bqb = new BooleanQuery.Builder().setDisableCoord(true);
        for (FieldsContext fieldsContext : fieldsContexts) {
            for (FieldContext fieldContext : fieldsContext) {
                PrefixQuery prefix = new PrefixQuery(new Term(fieldContext.getField(), text));
                bqb.add(fieldContext.getFieldCustomizer().setWrappedQuery(prefix).createQuery(),
                        BooleanClause.Occur.SHOULD);
            }
        }
        return simplify(bqb.build());
    }

}