|
@@ -22,17 +22,16 @@ package org.elasticsearch.index.query;
|
|
|
import org.apache.lucene.search.FuzzyQuery;
|
|
|
import org.apache.lucene.search.Query;
|
|
|
import org.elasticsearch.ElasticsearchParseException;
|
|
|
+import org.elasticsearch.Version;
|
|
|
import org.elasticsearch.common.ParseField;
|
|
|
import org.elasticsearch.common.ParsingException;
|
|
|
import org.elasticsearch.common.Strings;
|
|
|
import org.elasticsearch.common.io.stream.StreamInput;
|
|
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
|
|
import org.elasticsearch.common.io.stream.Writeable;
|
|
|
-import org.elasticsearch.common.regex.Regex;
|
|
|
import org.elasticsearch.common.unit.Fuzziness;
|
|
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
|
import org.elasticsearch.common.xcontent.XContentParser;
|
|
|
-import org.elasticsearch.index.mapper.MapperService;
|
|
|
import org.elasticsearch.index.query.support.QueryParsers;
|
|
|
import org.elasticsearch.index.search.MatchQuery;
|
|
|
import org.elasticsearch.index.search.MultiMatchQuery;
|
|
@@ -74,6 +73,8 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
private static final ParseField TYPE_FIELD = new ParseField("type");
|
|
|
private static final ParseField QUERY_FIELD = new ParseField("query");
|
|
|
private static final ParseField FIELDS_FIELD = new ParseField("fields");
|
|
|
+ private static final ParseField GENERATE_SYNONYMS_PHRASE_QUERY = new ParseField("auto_generate_synonyms_phrase_query");
|
|
|
+
|
|
|
|
|
|
private final Object value;
|
|
|
private final Map<String, Float> fieldsBoosts;
|
|
@@ -91,6 +92,7 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
private boolean lenient = DEFAULT_LENIENCY;
|
|
|
private Float cutoffFrequency = null;
|
|
|
private MatchQuery.ZeroTermsQuery zeroTermsQuery = DEFAULT_ZERO_TERMS_QUERY;
|
|
|
+ private boolean autoGenerateSynonymsPhraseQuery = true;
|
|
|
|
|
|
public enum Type implements Writeable {
|
|
|
|
|
@@ -221,6 +223,9 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
lenient = in.readBoolean();
|
|
|
cutoffFrequency = in.readOptionalFloat();
|
|
|
zeroTermsQuery = MatchQuery.ZeroTermsQuery.readFromStream(in);
|
|
|
+ if (in.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
|
|
|
+ autoGenerateSynonymsPhraseQuery = in.readBoolean();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -245,6 +250,9 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
out.writeBoolean(lenient);
|
|
|
out.writeOptionalFloat(cutoffFrequency);
|
|
|
zeroTermsQuery.writeTo(out);
|
|
|
+ if (out.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
|
|
|
+ out.writeBoolean(autoGenerateSynonymsPhraseQuery);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public Object value() {
|
|
@@ -514,6 +522,19 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
return zeroTermsQuery;
|
|
|
}
|
|
|
|
|
|
+ public MultiMatchQueryBuilder autoGenerateSynonymsPhraseQuery(boolean enable) {
|
|
|
+ this.autoGenerateSynonymsPhraseQuery = enable;
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Whether phrase queries should be automatically generated for multi terms synonyms.
|
|
|
+ * Defaults to <tt>true</tt>.
|
|
|
+ */
|
|
|
+ public boolean autoGenerateSynonymsPhraseQuery() {
|
|
|
+ return autoGenerateSynonymsPhraseQuery;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void doXContent(XContentBuilder builder, Params params) throws IOException {
|
|
|
builder.startObject(NAME);
|
|
@@ -551,6 +572,7 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
builder.field(CUTOFF_FREQUENCY_FIELD.getPreferredName(), cutoffFrequency);
|
|
|
}
|
|
|
builder.field(ZERO_TERMS_QUERY_FIELD.getPreferredName(), zeroTermsQuery.toString());
|
|
|
+ builder.field(GENERATE_SYNONYMS_PHRASE_QUERY.getPreferredName(), autoGenerateSynonymsPhraseQuery);
|
|
|
printBoostAndQueryName(builder);
|
|
|
builder.endObject();
|
|
|
}
|
|
@@ -572,6 +594,7 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
Float cutoffFrequency = null;
|
|
|
boolean lenient = DEFAULT_LENIENCY;
|
|
|
MatchQuery.ZeroTermsQuery zeroTermsQuery = DEFAULT_ZERO_TERMS_QUERY;
|
|
|
+ boolean autoGenerateSynonymsPhraseQuery = true;
|
|
|
|
|
|
float boost = AbstractQueryBuilder.DEFAULT_BOOST;
|
|
|
String queryName = null;
|
|
@@ -634,6 +657,8 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
}
|
|
|
} else if (AbstractQueryBuilder.NAME_FIELD.match(currentFieldName)) {
|
|
|
queryName = parser.text();
|
|
|
+ } else if (GENERATE_SYNONYMS_PHRASE_QUERY.match(currentFieldName)) {
|
|
|
+ autoGenerateSynonymsPhraseQuery = parser.booleanValue();
|
|
|
} else {
|
|
|
throw new ParsingException(parser.getTokenLocation(),
|
|
|
"[" + NAME + "] query does not support [" + currentFieldName + "]");
|
|
@@ -673,6 +698,7 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
.slop(slop)
|
|
|
.tieBreaker(tieBreaker)
|
|
|
.zeroTermsQuery(zeroTermsQuery)
|
|
|
+ .autoGenerateSynonymsPhraseQuery(autoGenerateSynonymsPhraseQuery)
|
|
|
.boost(boost)
|
|
|
.queryName(queryName);
|
|
|
}
|
|
@@ -728,6 +754,7 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
}
|
|
|
multiMatchQuery.setLenient(lenient);
|
|
|
multiMatchQuery.setZeroTermsQuery(zeroTermsQuery);
|
|
|
+ multiMatchQuery.setAutoGenerateSynonymsPhraseQuery(autoGenerateSynonymsPhraseQuery);
|
|
|
|
|
|
if (useDisMax != null) { // backwards foobar
|
|
|
boolean typeUsesDismax = type.tieBreaker() != 1.0f;
|
|
@@ -748,7 +775,7 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
protected int doHashCode() {
|
|
|
return Objects.hash(value, fieldsBoosts, type, operator, analyzer, slop, fuzziness,
|
|
|
prefixLength, maxExpansions, minimumShouldMatch, fuzzyRewrite, useDisMax, tieBreaker, lenient,
|
|
|
- cutoffFrequency, zeroTermsQuery);
|
|
|
+ cutoffFrequency, zeroTermsQuery, autoGenerateSynonymsPhraseQuery);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -768,6 +795,7 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder<MultiMatchQuery
|
|
|
Objects.equals(tieBreaker, other.tieBreaker) &&
|
|
|
Objects.equals(lenient, other.lenient) &&
|
|
|
Objects.equals(cutoffFrequency, other.cutoffFrequency) &&
|
|
|
- Objects.equals(zeroTermsQuery, other.zeroTermsQuery);
|
|
|
+ Objects.equals(zeroTermsQuery, other.zeroTermsQuery) &&
|
|
|
+ Objects.equals(autoGenerateSynonymsPhraseQuery, other.autoGenerateSynonymsPhraseQuery);
|
|
|
}
|
|
|
}
|