From 6a04f62c6b858381b504ed17a925be8962c4d6b6 Mon Sep 17 00:00:00 2001 From: Matteo Piergiovanni <134913285+piergm@users.noreply.github.com> Date: Fri, 18 Oct 2024 08:44:39 +0200 Subject: [PATCH] Bool query early termination should also consider must_not clauses (#115031) * Bool query early termination should also consider must_not clauses * Update docs/changelog/115031.yaml (cherry picked from commit 5e381a3a89fb734ade6a1a299881ef1be4df7019) --- docs/changelog/115031.yaml | 5 +++++ .../org/elasticsearch/index/query/BoolQueryBuilder.java | 1 + .../elasticsearch/index/query/BoolQueryBuilderTests.java | 6 ++++++ 3 files changed, 12 insertions(+) create mode 100644 docs/changelog/115031.yaml diff --git a/docs/changelog/115031.yaml b/docs/changelog/115031.yaml new file mode 100644 index 0000000000000..d8d6e1a3f8166 --- /dev/null +++ b/docs/changelog/115031.yaml @@ -0,0 +1,5 @@ +pr: 115031 +summary: Bool query early termination should also consider `must_not` clauses +area: Search +type: enhancement +issues: [] diff --git a/server/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java b/server/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java index a7b3b9145d2ca..d61e69208cfd6 100644 --- a/server/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java @@ -359,6 +359,7 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws if (mustClauses.size() == 0 && filterClauses.size() == 0 && shouldClauses.size() > 0 + && mustNotClauses.size() == 0 && newBuilder.shouldClauses.stream().allMatch(b -> b instanceof MatchNoneQueryBuilder)) { return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query."); } diff --git a/server/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java index 25d4c1008ba7d..0fa8f70525e8a 100644 --- a/server/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java @@ -449,6 +449,12 @@ public void testRewriteWithMatchNone() throws IOException { rewritten = Rewriteable.rewrite(boolQueryBuilder, createSearchExecutionContext()); assertNotEquals(new MatchNoneQueryBuilder(), rewritten); + boolQueryBuilder = new BoolQueryBuilder(); + boolQueryBuilder.should(new WrapperQueryBuilder(new MatchNoneQueryBuilder().toString())); + boolQueryBuilder.mustNot(new TermQueryBuilder(TEXT_FIELD_NAME, "bar")); + rewritten = Rewriteable.rewrite(boolQueryBuilder, createSearchExecutionContext()); + assertNotEquals(new MatchNoneQueryBuilder(), rewritten); + boolQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.filter(new TermQueryBuilder(TEXT_FIELD_NAME, "bar")); boolQueryBuilder.mustNot(new WrapperQueryBuilder(new WrapperQueryBuilder(new MatchAllQueryBuilder().toString()).toString()));