Do not apply minimum_should_match on auto generated boolean query if the coordination factor is disabled.
Affects match, multi_match, query_string and simple_query_string queries. Direct bool queries are not affected anymore (minimum_should_match is applied even if the coord factor is disabled).
This commit is contained in:
parent
eaad8924d8
commit
8f063b0a07
|
@ -117,12 +117,6 @@ public class Queries {
|
|||
if (minimumShouldMatch == null) {
|
||||
return query;
|
||||
}
|
||||
// Queries with a single word expanded with synonyms
|
||||
// have their coordination factor disabled (@see org.apache.lucene.util.QueryBuilder#analyzeBoolean()).
|
||||
// minimumShouldMatch should not be applicable in such case.
|
||||
if (query.isCoordDisabled()) {
|
||||
return query;
|
||||
}
|
||||
int optionalClauses = 0;
|
||||
for (BooleanClause c : query.clauses()) {
|
||||
if (c.getOccur() == BooleanClause.Occur.SHOULD) {
|
||||
|
|
|
@ -372,7 +372,10 @@ public class MatchQueryBuilder extends AbstractQueryBuilder<MatchQueryBuilder> {
|
|||
return null;
|
||||
}
|
||||
|
||||
if (query instanceof BooleanQuery) {
|
||||
// If the coordination factor is disabled on a boolean query we don't apply the minimum should match.
|
||||
// This is done to make sure that the minimum_should_match doesn't get applied when there is only one word
|
||||
// and multiple variations of the same word in the query (synonyms for instance).
|
||||
if (query instanceof BooleanQuery && !((BooleanQuery) query).isCoordDisabled()) {
|
||||
query = Queries.applyMinimumShouldMatch((BooleanQuery) query, minimumShouldMatch);
|
||||
} else if (query instanceof ExtendedCommonTermsQuery) {
|
||||
((ExtendedCommonTermsQuery)query).setLowFreqMinimumNumberShouldMatch(minimumShouldMatch);
|
||||
|
|
|
@ -735,7 +735,10 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
|
|||
}
|
||||
|
||||
query = Queries.fixNegativeQueryIfNeeded(query);
|
||||
if (query instanceof BooleanQuery) {
|
||||
// If the coordination factor is disabled on a boolean query we don't apply the minimum should match.
|
||||
// This is done to make sure that the minimum_should_match doesn't get applied when there is only one word
|
||||
// and multiple variations of the same word in the query (synonyms for instance).
|
||||
if (query instanceof BooleanQuery && !((BooleanQuery) query).isCoordDisabled()) {
|
||||
query = Queries.applyMinimumShouldMatch((BooleanQuery) query, this.minimumShouldMatch());
|
||||
}
|
||||
|
||||
|
|
|
@ -285,7 +285,10 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder<SimpleQuerySt
|
|||
sqp.setDefaultOperator(defaultOperator.toBooleanClauseOccur());
|
||||
|
||||
Query query = sqp.parse(queryText);
|
||||
if (minimumShouldMatch != null && query instanceof BooleanQuery) {
|
||||
// If the coordination factor is disabled on a boolean query we don't apply the minimum should match.
|
||||
// This is done to make sure that the minimum_should_match doesn't get applied when there is only one word
|
||||
// and multiple variations of the same word in the query (synonyms for instance).
|
||||
if (minimumShouldMatch != null && query instanceof BooleanQuery && !((BooleanQuery) query).isCoordDisabled()) {
|
||||
query = Queries.applyMinimumShouldMatch((BooleanQuery) query, minimumShouldMatch);
|
||||
}
|
||||
return query;
|
||||
|
|
|
@ -54,7 +54,10 @@ public class MultiMatchQuery extends MatchQuery {
|
|||
|
||||
private Query parseAndApply(Type type, String fieldName, Object value, String minimumShouldMatch, Float boostValue) throws IOException {
|
||||
Query query = parse(type, fieldName, value);
|
||||
if (query instanceof BooleanQuery) {
|
||||
// If the coordination factor is disabled on a boolean query we don't apply the minimum should match.
|
||||
// This is done to make sure that the minimum_should_match doesn't get applied when there is only one word
|
||||
// and multiple variations of the same word in the query (synonyms for instance).
|
||||
if (query instanceof BooleanQuery && !((BooleanQuery) query).isCoordDisabled()) {
|
||||
query = Queries.applyMinimumShouldMatch((BooleanQuery) query, minimumShouldMatch);
|
||||
}
|
||||
if (query != null && boostValue != null && boostValue != AbstractQueryBuilder.DEFAULT_BOOST) {
|
||||
|
|
|
@ -280,7 +280,7 @@ public class BoolQueryBuilderTests extends AbstractQueryTestCase<BoolQueryBuilde
|
|||
.minimumNumberShouldMatch("3")
|
||||
.disableCoord(true)
|
||||
.buildAsBytes()).toQuery(createShardContext());
|
||||
assertEquals(0, bq.getMinimumNumberShouldMatch());
|
||||
assertEquals(3, bq.getMinimumNumberShouldMatch());
|
||||
}
|
||||
|
||||
public void testFromJson() throws IOException {
|
||||
|
|
Loading…
Reference in New Issue