Skip to content

Commit f5a0c22

Browse files
committed
Prevent skipping shards if a suggest builder is present (#25739)
Even if the query part can rewrite to match none we can't skip the suggest execution since it might yield results. Relates to #25658
1 parent 60d1d51 commit f5a0c22

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

core/src/main/java/org/elasticsearch/search/SearchService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,8 +850,13 @@ public boolean canMatch(ShardSearchRequest request) throws IOException {
850850
}
851851
}
852852

853+
/**
854+
* Returns true iff the given search source builder can be early terminated by rewriting to a match none query. Or in other words
855+
* if the execution of a the search request can be early terminated without executing it. This is for instance not possible if
856+
* a global aggregation is part of this request or if there is a suggest builder present.
857+
*/
853858
public static boolean canRewriteToMatchNone(SearchSourceBuilder source) {
854-
if (source == null || source.query() == null || source.query() instanceof MatchAllQueryBuilder) {
859+
if (source == null || source.query() == null || source.query() instanceof MatchAllQueryBuilder || source.suggest() != null) {
855860
return false;
856861
} else {
857862
AggregatorFactories.Builder aggregations = source.aggregations();

core/src/test/java/org/elasticsearch/search/SearchServiceTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.elasticsearch.search.internal.AliasFilter;
5757
import org.elasticsearch.search.internal.SearchContext;
5858
import org.elasticsearch.search.internal.ShardSearchLocalRequest;
59+
import org.elasticsearch.search.suggest.SuggestBuilder;
5960
import org.elasticsearch.test.ESSingleNodeTestCase;
6061

6162
import java.io.IOException;
@@ -354,5 +355,11 @@ public void testCanRewriteToMatchNone() {
354355
assertTrue(SearchService.canRewriteToMatchNone(new SearchSourceBuilder().query(new TermQueryBuilder("foo", "bar"))));
355356
assertTrue(SearchService.canRewriteToMatchNone(new SearchSourceBuilder().query(new MatchNoneQueryBuilder())
356357
.aggregation(new TermsAggregationBuilder("test", ValueType.STRING).minDocCount(1))));
358+
assertFalse(SearchService.canRewriteToMatchNone(new SearchSourceBuilder().query(new MatchNoneQueryBuilder())
359+
.aggregation(new TermsAggregationBuilder("test", ValueType.STRING).minDocCount(1))
360+
.suggest(new SuggestBuilder())));
361+
assertFalse(SearchService.canRewriteToMatchNone(new SearchSourceBuilder().query(new TermQueryBuilder("foo", "bar"))
362+
.suggest(new SuggestBuilder())));
363+
357364
}
358365
}

0 commit comments

Comments
 (0)