|
@@ -22,6 +22,7 @@ package org.elasticsearch.index.query;
|
|
|
import org.apache.lucene.analysis.Analyzer;
|
|
|
import org.apache.lucene.search.BooleanQuery;
|
|
|
import org.apache.lucene.search.Query;
|
|
|
+import org.elasticsearch.Version;
|
|
|
import org.elasticsearch.common.ParseField;
|
|
|
import org.elasticsearch.common.ParsingException;
|
|
|
import org.elasticsearch.common.Strings;
|
|
@@ -94,6 +95,8 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
/** Name for (de-)serialization. */
|
|
|
public static final String NAME = "simple_query_string";
|
|
|
|
|
|
+ public static final Version V_5_1_0_UNRELEASED = Version.fromId(5010099);
|
|
|
+
|
|
|
private static final ParseField MINIMUM_SHOULD_MATCH_FIELD = new ParseField("minimum_should_match");
|
|
|
private static final ParseField ANALYZE_WILDCARD_FIELD = new ParseField("analyze_wildcard");
|
|
|
private static final ParseField LENIENT_FIELD = new ParseField("lenient");
|
|
@@ -104,6 +107,7 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
private static final ParseField ANALYZER_FIELD = new ParseField("analyzer");
|
|
|
private static final ParseField QUERY_FIELD = new ParseField("query");
|
|
|
private static final ParseField FIELDS_FIELD = new ParseField("fields");
|
|
|
+ private static final ParseField QUOTE_FIELD_SUFFIX_FIELD = new ParseField("quote_field_suffix");
|
|
|
|
|
|
/** Query text to parse. */
|
|
|
private final String queryText;
|
|
@@ -158,6 +162,9 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
settings.analyzeWildcard(in.readBoolean());
|
|
|
settings.locale(Locale.forLanguageTag(in.readString()));
|
|
|
minimumShouldMatch = in.readOptionalString();
|
|
|
+ if (in.getVersion().onOrAfter(V_5_1_0_UNRELEASED)) {
|
|
|
+ settings.quoteFieldSuffix(in.readOptionalString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -176,6 +183,9 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
out.writeBoolean(settings.analyzeWildcard());
|
|
|
out.writeString(settings.locale().toLanguageTag());
|
|
|
out.writeOptionalString(minimumShouldMatch);
|
|
|
+ if (out.getVersion().onOrAfter(V_5_1_0_UNRELEASED)) {
|
|
|
+ out.writeOptionalString(settings.quoteFieldSuffix());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/** Returns the text to parse the query from. */
|
|
@@ -292,6 +302,21 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
return this.settings.locale();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Set the suffix to append to field names for phrase matching.
|
|
|
+ */
|
|
|
+ public SimpleQueryStringBuilder quoteFieldSuffix(String suffix) {
|
|
|
+ settings.quoteFieldSuffix(suffix);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Return the suffix to append to field names for phrase matching.
|
|
|
+ */
|
|
|
+ public String quoteFieldSuffix() {
|
|
|
+ return settings.quoteFieldSuffix();
|
|
|
+ }
|
|
|
+
|
|
|
/** Specifies whether query parsing should be lenient. Defaults to false. */
|
|
|
public SimpleQueryStringBuilder lenient(boolean lenient) {
|
|
|
this.settings.lenient(lenient);
|
|
@@ -408,6 +433,9 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
builder.field(LENIENT_FIELD.getPreferredName(), settings.lenient());
|
|
|
builder.field(ANALYZE_WILDCARD_FIELD.getPreferredName(), settings.analyzeWildcard());
|
|
|
builder.field(LOCALE_FIELD.getPreferredName(), (settings.locale().toLanguageTag()));
|
|
|
+ if (settings.quoteFieldSuffix() != null) {
|
|
|
+ builder.field(QUOTE_FIELD_SUFFIX_FIELD.getPreferredName(), settings.quoteFieldSuffix());
|
|
|
+ }
|
|
|
|
|
|
if (minimumShouldMatch != null) {
|
|
|
builder.field(MINIMUM_SHOULD_MATCH_FIELD.getPreferredName(), minimumShouldMatch);
|
|
@@ -433,6 +461,7 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
boolean lowercaseExpandedTerms = SimpleQueryStringBuilder.DEFAULT_LOWERCASE_EXPANDED_TERMS;
|
|
|
boolean analyzeWildcard = SimpleQueryStringBuilder.DEFAULT_ANALYZE_WILDCARD;
|
|
|
Locale locale = null;
|
|
|
+ String quoteFieldSuffix = null;
|
|
|
|
|
|
XContentParser.Token token;
|
|
|
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
|
@@ -495,6 +524,8 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
queryName = parser.text();
|
|
|
} else if (parseContext.getParseFieldMatcher().match(currentFieldName, MINIMUM_SHOULD_MATCH_FIELD)) {
|
|
|
minimumShouldMatch = parser.textOrNull();
|
|
|
+ } else if (parseContext.getParseFieldMatcher().match(currentFieldName, QUOTE_FIELD_SUFFIX_FIELD)) {
|
|
|
+ quoteFieldSuffix = parser.textOrNull();
|
|
|
} else {
|
|
|
throw new ParsingException(parser.getTokenLocation(), "[" + SimpleQueryStringBuilder.NAME +
|
|
|
"] unsupported field [" + parser.currentName() + "]");
|
|
@@ -513,7 +544,7 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|
|
SimpleQueryStringBuilder qb = new SimpleQueryStringBuilder(queryBody);
|
|
|
qb.boost(boost).fields(fieldsAndWeights).analyzer(analyzerName).queryName(queryName).minimumShouldMatch(minimumShouldMatch);
|
|
|
qb.flags(flags).defaultOperator(defaultOperator).locale(locale).lowercaseExpandedTerms(lowercaseExpandedTerms);
|
|
|
- qb.lenient(lenient).analyzeWildcard(analyzeWildcard).boost(boost);
|
|
|
+ qb.lenient(lenient).analyzeWildcard(analyzeWildcard).boost(boost).quoteFieldSuffix(quoteFieldSuffix);
|
|
|
return Optional.of(qb);
|
|
|
}
|
|
|
|