Java tutorial
/* * 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()); } }