Query DSL: text query to support minimum_should_match, closes #1971.
This commit is contained in:
parent
5bd93d6f93
commit
86cd95aee2
|
@ -69,6 +69,8 @@ public class TextQueryBuilder extends BaseQueryBuilder {
|
||||||
|
|
||||||
private Integer maxExpansions;
|
private Integer maxExpansions;
|
||||||
|
|
||||||
|
private String minimumShouldMatch;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new text query.
|
* Constructs a new text query.
|
||||||
*/
|
*/
|
||||||
|
@ -140,6 +142,11 @@ public class TextQueryBuilder extends BaseQueryBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TextQueryBuilder minimumShouldMatch(String minimumShouldMatch) {
|
||||||
|
this.minimumShouldMatch = minimumShouldMatch;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doXContent(XContentBuilder builder, Params params) throws IOException {
|
public void doXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
builder.startObject(TextQueryParser.NAME);
|
builder.startObject(TextQueryParser.NAME);
|
||||||
|
@ -170,6 +177,9 @@ public class TextQueryBuilder extends BaseQueryBuilder {
|
||||||
if (maxExpansions != null) {
|
if (maxExpansions != null) {
|
||||||
builder.field("max_expansions", maxExpansions);
|
builder.field("max_expansions", maxExpansions);
|
||||||
}
|
}
|
||||||
|
if (minimumShouldMatch != null) {
|
||||||
|
builder.field("minimum_should_match", minimumShouldMatch);
|
||||||
|
}
|
||||||
|
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
|
|
|
@ -20,9 +20,11 @@
|
||||||
package org.elasticsearch.index.query;
|
package org.elasticsearch.index.query;
|
||||||
|
|
||||||
import org.apache.lucene.search.BooleanClause;
|
import org.apache.lucene.search.BooleanClause;
|
||||||
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
import org.apache.lucene.search.FuzzyQuery;
|
import org.apache.lucene.search.FuzzyQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.elasticsearch.common.inject.Inject;
|
import org.elasticsearch.common.inject.Inject;
|
||||||
|
import org.elasticsearch.common.lucene.search.Queries;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -68,6 +70,7 @@ public class TextQueryParser implements QueryParser {
|
||||||
int prefixLength = FuzzyQuery.defaultPrefixLength;
|
int prefixLength = FuzzyQuery.defaultPrefixLength;
|
||||||
int maxExpansions = FuzzyQuery.defaultMaxExpansions;
|
int maxExpansions = FuzzyQuery.defaultMaxExpansions;
|
||||||
BooleanClause.Occur occur = BooleanClause.Occur.SHOULD;
|
BooleanClause.Occur occur = BooleanClause.Occur.SHOULD;
|
||||||
|
String minimumShouldMatch = null;
|
||||||
|
|
||||||
token = parser.nextToken();
|
token = parser.nextToken();
|
||||||
if (token == XContentParser.Token.START_OBJECT) {
|
if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
@ -111,6 +114,8 @@ public class TextQueryParser implements QueryParser {
|
||||||
} else {
|
} else {
|
||||||
throw new QueryParsingException(parseContext.index(), "text query requires operator to be either 'and' or 'or', not [" + op + "]");
|
throw new QueryParsingException(parseContext.index(), "text query requires operator to be either 'and' or 'or', not [" + op + "]");
|
||||||
}
|
}
|
||||||
|
} else if ("minimum_should_match".equals(currentFieldName) || "minimumShouldMatch".equals(currentFieldName)) {
|
||||||
|
minimumShouldMatch = parser.textOrNull();
|
||||||
} else {
|
} else {
|
||||||
throw new QueryParsingException(parseContext.index(), "[text] query does not support [" + currentFieldName + "]");
|
throw new QueryParsingException(parseContext.index(), "[text] query does not support [" + currentFieldName + "]");
|
||||||
}
|
}
|
||||||
|
@ -136,6 +141,11 @@ public class TextQueryParser implements QueryParser {
|
||||||
tQP.setOccur(occur);
|
tQP.setOccur(occur);
|
||||||
|
|
||||||
Query query = tQP.parse(type);
|
Query query = tQP.parse(type);
|
||||||
|
|
||||||
|
if (query instanceof BooleanQuery) {
|
||||||
|
Queries.applyMinimumShouldMatch((BooleanQuery) query, minimumShouldMatch);
|
||||||
|
}
|
||||||
|
|
||||||
query.setBoost(boost);
|
query.setBoost(boost);
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue