Skip to content

Commit a8be2fa

Browse files
authored
Rewrite match_all inside must_not (#85999) (#86028)
A must_not with a match_all clause inside a bool query is currently not rewritten to a match_none query. This means that running a boolean query with "must_not":[{"terms":{"_tier":["data_frozen","data_cold"]}] is currently not rewritten as match_none on a cold/frozen tier node.
1 parent aa6b946 commit a8be2fa

File tree

4 files changed

+18
-9
lines changed

4 files changed

+18
-9
lines changed

docs/changelog/85999.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 85999
2+
summary: Rewrite `match_all` inside `must_not`
3+
area: Search
4+
type: bug
5+
issues: []

qa/full-cluster-restart/src/test/java/org/elasticsearch/upgrades/QueryBuilderBWCIT.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.index.query.ConstantScoreQueryBuilder;
2424
import org.elasticsearch.index.query.DisMaxQueryBuilder;
2525
import org.elasticsearch.index.query.MatchAllQueryBuilder;
26+
import org.elasticsearch.index.query.MatchNoneQueryBuilder;
2627
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
2728
import org.elasticsearch.index.query.MatchQueryBuilder;
2829
import org.elasticsearch.index.query.Operator;
@@ -88,10 +89,10 @@ public class QueryBuilderBWCIT extends AbstractFullClusterRestartTestCase {
8889
""", new RangeQueryBuilder("long_field").from(1).to(9));
8990
addCandidate(
9091
"""
91-
"bool": { "must_not": [{"match_all": {}}], "must": [{"match_all": {}}], "filter": [{"match_all": {}}], \
92+
"bool": { "must_not": [{"match_none": {}}], "must": [{"match_all": {}}], "filter": [{"match_all": {}}], \
9293
"should": [{"match_all": {}}]}
9394
""",
94-
new BoolQueryBuilder().mustNot(new MatchAllQueryBuilder())
95+
new BoolQueryBuilder().mustNot(new MatchNoneQueryBuilder())
9596
.must(new MatchAllQueryBuilder())
9697
.filter(new MatchAllQueryBuilder())
9798
.should(new MatchAllQueryBuilder())

server/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@
2929
import java.util.List;
3030
import java.util.Map;
3131
import java.util.Objects;
32-
import java.util.Optional;
3332
import java.util.function.Consumer;
34-
import java.util.stream.Stream;
3533

3634
import static org.elasticsearch.common.lucene.search.Queries.fixNegativeQueryIfNeeded;
3735
import static org.elasticsearch.search.SearchModule.INDICES_MAX_NESTED_DEPTH_SETTING;
@@ -385,11 +383,10 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws
385383
}
386384

387385
// lets do some early termination and prevent any kind of rewriting if we have a mandatory query that is a MatchNoneQueryBuilder
388-
Optional<QueryBuilder> any = Stream.concat(newBuilder.mustClauses.stream(), newBuilder.filterClauses.stream())
389-
.filter(b -> b instanceof MatchNoneQueryBuilder)
390-
.findAny();
391-
if (any.isPresent()) {
392-
return any.get();
386+
if (newBuilder.mustClauses.stream().anyMatch(b -> b instanceof MatchNoneQueryBuilder)
387+
|| newBuilder.filterClauses.stream().anyMatch(b -> b instanceof MatchNoneQueryBuilder)
388+
|| newBuilder.mustNotClauses.stream().anyMatch(b -> b instanceof MatchAllQueryBuilder)) {
389+
return new MatchNoneQueryBuilder();
393390
}
394391

395392
if (changed) {

server/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,12 @@ public void testRewriteWithMatchNone() throws IOException {
425425
boolQueryBuilder = new BoolQueryBuilder();
426426
rewritten = Rewriteable.rewrite(boolQueryBuilder, createSearchExecutionContext());
427427
assertNotEquals(new MatchNoneQueryBuilder(), rewritten);
428+
429+
boolQueryBuilder = new BoolQueryBuilder();
430+
boolQueryBuilder.filter(new TermQueryBuilder(TEXT_FIELD_NAME, "bar"));
431+
boolQueryBuilder.mustNot(new WrapperQueryBuilder(new WrapperQueryBuilder(new MatchAllQueryBuilder().toString()).toString()));
432+
rewritten = boolQueryBuilder.rewrite(createSearchExecutionContext());
433+
assertEquals(new MatchNoneQueryBuilder(), rewritten);
428434
}
429435

430436
@Override

0 commit comments

Comments
 (0)