|
@@ -68,6 +68,7 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
public static final Fuzziness DEFAULT_FUZZINESS = Fuzziness.AUTO;
|
|
|
public static final Operator DEFAULT_OPERATOR = Operator.OR;
|
|
|
public static final MultiMatchQueryBuilder.Type DEFAULT_TYPE = MultiMatchQueryBuilder.Type.BEST_FIELDS;
|
|
|
+ public static final boolean DEFAULT_FUZZY_TRANSPOSITIONS = FuzzyQuery.defaultTranspositions;
|
|
|
|
|
|
private static final ParseField QUERY_FIELD = new ParseField("query");
|
|
|
private static final ParseField FIELDS_FIELD = new ParseField("fields");
|
|
@@ -104,6 +105,7 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
.withAllDeprecated("Set [default_field] to `*` instead");
|
|
|
private static final ParseField TYPE_FIELD = new ParseField("type");
|
|
|
private static final ParseField GENERATE_SYNONYMS_PHRASE_QUERY = new ParseField("auto_generate_synonyms_phrase_query");
|
|
|
+ private static final ParseField FUZZY_TRANSPOSITIONS_FIELD = new ParseField("fuzzy_transpositions");
|
|
|
|
|
|
private final String queryString;
|
|
|
|
|
@@ -161,6 +163,8 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
|
|
|
private boolean autoGenerateSynonymsPhraseQuery = true;
|
|
|
|
|
|
+ private boolean fuzzyTranspositions = DEFAULT_FUZZY_TRANSPOSITIONS;
|
|
|
+
|
|
|
public QueryStringQueryBuilder(String queryString) {
|
|
|
if (queryString == null) {
|
|
|
throw new IllegalArgumentException("query text missing");
|
|
@@ -226,6 +230,9 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
if (in.getVersion().onOrAfter(Version.V_6_1_0)) {
|
|
|
autoGenerateSynonymsPhraseQuery = in.readBoolean();
|
|
|
}
|
|
|
+ if (in.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
|
|
|
+ fuzzyTranspositions = in.readBoolean();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -281,6 +288,9 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
if (out.getVersion().onOrAfter(Version.V_6_1_0)) {
|
|
|
out.writeBoolean(autoGenerateSynonymsPhraseQuery);
|
|
|
}
|
|
|
+ if (out.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
|
|
|
+ out.writeBoolean(fuzzyTranspositions);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public String queryString() {
|
|
@@ -648,6 +658,22 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
return autoGenerateSynonymsPhraseQuery;
|
|
|
}
|
|
|
|
|
|
+ public boolean fuzzyTranspositions() {
|
|
|
+ return fuzzyTranspositions;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Sets whether transpositions are supported in fuzzy queries.<p>
|
|
|
+ * The default metric used by fuzzy queries to determine a match is the Damerau-Levenshtein
|
|
|
+ * distance formula which supports transpositions. Setting transposition to false will
|
|
|
+ * switch to classic Levenshtein distance.<br>
|
|
|
+ * If not set, Damerau-Levenshtein distance metric will be used.
|
|
|
+ */
|
|
|
+ public QueryStringQueryBuilder fuzzyTranspositions(boolean fuzzyTranspositions) {
|
|
|
+ this.fuzzyTranspositions = fuzzyTranspositions;
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
protected void doXContent(XContentBuilder builder, Params params) throws IOException {
|
|
|
builder.startObject(NAME);
|
|
@@ -706,6 +732,7 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
}
|
|
|
builder.field(ESCAPE_FIELD.getPreferredName(), this.escape);
|
|
|
builder.field(GENERATE_SYNONYMS_PHRASE_QUERY.getPreferredName(), autoGenerateSynonymsPhraseQuery);
|
|
|
+ builder.field(FUZZY_TRANSPOSITIONS_FIELD.getPreferredName(), fuzzyTranspositions);
|
|
|
printBoostAndQueryName(builder);
|
|
|
builder.endObject();
|
|
|
}
|
|
@@ -739,6 +766,8 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
String rewrite = null;
|
|
|
Map<String, Float> fieldsAndWeights = null;
|
|
|
boolean autoGenerateSynonymsPhraseQuery = true;
|
|
|
+ boolean fuzzyTranspositions = DEFAULT_FUZZY_TRANSPOSITIONS;
|
|
|
+
|
|
|
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
|
|
if (token == XContentParser.Token.FIELD_NAME) {
|
|
|
currentFieldName = parser.currentName();
|
|
@@ -813,6 +842,8 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
queryName = parser.text();
|
|
|
} else if (GENERATE_SYNONYMS_PHRASE_QUERY.match(currentFieldName)) {
|
|
|
autoGenerateSynonymsPhraseQuery = parser.booleanValue();
|
|
|
+ } else if (FUZZY_TRANSPOSITIONS_FIELD.match(currentFieldName)) {
|
|
|
+ fuzzyTranspositions = parser.booleanValue();
|
|
|
} else if (AUTO_GENERATE_PHRASE_QUERIES_FIELD.match(currentFieldName)) {
|
|
|
// ignore, deprecated setting
|
|
|
} else if (LOWERCASE_EXPANDED_TERMS_FIELD.match(currentFieldName)) {
|
|
@@ -866,6 +897,7 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
queryStringQuery.boost(boost);
|
|
|
queryStringQuery.queryName(queryName);
|
|
|
queryStringQuery.autoGenerateSynonymsPhraseQuery(autoGenerateSynonymsPhraseQuery);
|
|
|
+ queryStringQuery.fuzzyTranspositions(fuzzyTranspositions);
|
|
|
return queryStringQuery;
|
|
|
}
|
|
|
|
|
@@ -900,7 +932,8 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
Objects.equals(timeZone.getID(), other.timeZone.getID()) &&
|
|
|
Objects.equals(escape, other.escape) &&
|
|
|
Objects.equals(maxDeterminizedStates, other.maxDeterminizedStates) &&
|
|
|
- Objects.equals(autoGenerateSynonymsPhraseQuery, other.autoGenerateSynonymsPhraseQuery);
|
|
|
+ Objects.equals(autoGenerateSynonymsPhraseQuery, other.autoGenerateSynonymsPhraseQuery) &&
|
|
|
+ Objects.equals(fuzzyTranspositions, other.fuzzyTranspositions);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -909,7 +942,8 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
quoteFieldSuffix, allowLeadingWildcard, analyzeWildcard,
|
|
|
enablePositionIncrements, fuzziness, fuzzyPrefixLength,
|
|
|
fuzzyMaxExpansions, fuzzyRewrite, phraseSlop, type, tieBreaker, rewrite, minimumShouldMatch, lenient,
|
|
|
- timeZone == null ? 0 : timeZone.getID(), escape, maxDeterminizedStates, autoGenerateSynonymsPhraseQuery);
|
|
|
+ timeZone == null ? 0 : timeZone.getID(), escape, maxDeterminizedStates, autoGenerateSynonymsPhraseQuery,
|
|
|
+ fuzzyTranspositions);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -979,6 +1013,7 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|
|
queryParser.setTimeZone(timeZone);
|
|
|
queryParser.setMaxDeterminizedStates(maxDeterminizedStates);
|
|
|
queryParser.setAutoGenerateMultiTermSynonymsPhraseQuery(autoGenerateSynonymsPhraseQuery);
|
|
|
+ queryParser.setFuzzyTranspositions(fuzzyTranspositions);
|
|
|
|
|
|
Query query;
|
|
|
try {
|