blob: 4e7d984f64817339486d9fdc9c80988c5eb6e7ce [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.luke.models.search;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.stream.Collectors;
import org.apache.lucene.document.DateTools;
/**
* Configurations for query parser.
*/
public final class QueryParserConfig {
/** query operators */
public enum Operator {
AND, OR
}
private final boolean useClassicParser;
private final boolean enablePositionIncrements;
private final boolean allowLeadingWildcard;
private final DateTools.Resolution dateResolution;
private final Operator defaultOperator;
private final float fuzzyMinSim;
private final int fuzzyPrefixLength;
private final Locale locale;
private final TimeZone timeZone;
private final int phraseSlop;
// classic parser only configurations
private final boolean autoGenerateMultiTermSynonymsPhraseQuery;
private final boolean autoGeneratePhraseQueries;
private final boolean splitOnWhitespace;
// standard parser only configurations
private final Map<String, Class<? extends Number>> typeMap;
/** Builder for {@link QueryParserConfig} */
public static class Builder {
private boolean useClassicParser = true;
private boolean enablePositionIncrements = true;
private boolean allowLeadingWildcard = false;
private DateTools.Resolution dateResolution = DateTools.Resolution.MILLISECOND;
private Operator defaultOperator = Operator.OR;
private float fuzzyMinSim = 2f;
private int fuzzyPrefixLength = 0;
private Locale locale = Locale.getDefault();
private TimeZone timeZone = TimeZone.getDefault();
private int phraseSlop = 0;
private boolean autoGenerateMultiTermSynonymsPhraseQuery = false;
private boolean autoGeneratePhraseQueries = false;
private boolean splitOnWhitespace = false;
private Map<String, Class<? extends Number>> typeMap = new HashMap<>();
/** Builder for {@link QueryParserConfig} */
public Builder useClassicParser(boolean value) {
useClassicParser = value;
return this;
}
public Builder enablePositionIncrements(boolean value) {
enablePositionIncrements = value;
return this;
}
public Builder allowLeadingWildcard(boolean value) {
allowLeadingWildcard = value;
return this;
}
public Builder dateResolution(DateTools.Resolution value) {
dateResolution = value;
return this;
}
public Builder defaultOperator(Operator op) {
defaultOperator = op;
return this;
}
public Builder fuzzyMinSim(float val) {
fuzzyMinSim = val;
return this;
}
public Builder fuzzyPrefixLength(int val) {
fuzzyPrefixLength = val;
return this;
}
public Builder locale(Locale val) {
locale = val;
return this;
}
public Builder timeZone(TimeZone val) {
timeZone = val;
return this;
}
public Builder phraseSlop(int val) {
phraseSlop = val;
return this;
}
public Builder autoGenerateMultiTermSynonymsPhraseQuery(boolean val) {
autoGenerateMultiTermSynonymsPhraseQuery = val;
return this;
}
public Builder autoGeneratePhraseQueries(boolean val) {
autoGeneratePhraseQueries = val;
return this;
}
public Builder splitOnWhitespace(boolean val) {
splitOnWhitespace = val;
return this;
}
public Builder typeMap(Map<String, Class<? extends Number>> val) {
typeMap = val;
return this;
}
public QueryParserConfig build() {
return new QueryParserConfig(this);
}
}
private QueryParserConfig(Builder builder) {
this.useClassicParser = builder.useClassicParser;
this.enablePositionIncrements = builder.enablePositionIncrements;
this.allowLeadingWildcard = builder.allowLeadingWildcard;
this.dateResolution = builder.dateResolution;
this.defaultOperator = builder.defaultOperator;
this.fuzzyMinSim = builder.fuzzyMinSim;
this.fuzzyPrefixLength = builder.fuzzyPrefixLength;
this.locale = builder.locale;
this.timeZone = builder.timeZone;
this.phraseSlop = builder.phraseSlop;
this.autoGenerateMultiTermSynonymsPhraseQuery = builder.autoGenerateMultiTermSynonymsPhraseQuery;
this.autoGeneratePhraseQueries = builder.autoGeneratePhraseQueries;
this.splitOnWhitespace = builder.splitOnWhitespace;
this.typeMap = Collections.unmodifiableMap(builder.typeMap);
}
public boolean isUseClassicParser() {
return useClassicParser;
}
public boolean isAutoGenerateMultiTermSynonymsPhraseQuery() {
return autoGenerateMultiTermSynonymsPhraseQuery;
}
public boolean isEnablePositionIncrements() {
return enablePositionIncrements;
}
public boolean isAllowLeadingWildcard() {
return allowLeadingWildcard;
}
public boolean isAutoGeneratePhraseQueries() {
return autoGeneratePhraseQueries;
}
public boolean isSplitOnWhitespace() {
return splitOnWhitespace;
}
public DateTools.Resolution getDateResolution() {
return dateResolution;
}
public Operator getDefaultOperator() {
return defaultOperator;
}
public float getFuzzyMinSim() {
return fuzzyMinSim;
}
public int getFuzzyPrefixLength() {
return fuzzyPrefixLength;
}
public Locale getLocale() {
return locale;
}
public TimeZone getTimeZone() {
return timeZone;
}
public int getPhraseSlop() {
return phraseSlop;
}
public Map<String, Class<? extends Number>> getTypeMap() {
return typeMap;
}
@Override
public String toString() {
return "QueryParserConfig: [" +
" default operator=" + defaultOperator.name() + ";" +
" enable position increment=" + enablePositionIncrements + ";" +
" allow leading wildcard=" + allowLeadingWildcard + ";" +
" split whitespace=" + splitOnWhitespace + ";" +
" generate phrase query=" + autoGeneratePhraseQueries + ";" +
" generate multiterm sysnonymsphrase query=" + autoGenerateMultiTermSynonymsPhraseQuery + ";" +
" phrase slop=" + phraseSlop + ";" +
" date resolution=" + dateResolution.name() +
" locale=" + locale.toLanguageTag() + ";" +
" time zone=" + timeZone.getID() + ";" +
" numeric types=" + String.join(",", getTypeMap().entrySet().stream()
.map(e -> e.getKey() + "=" + e.getValue().toString()).collect(Collectors.toSet())) + ";" +
"]";
}
}