From 3ec369fa1a7c76372342695966e7fc77effa1ef9 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Sat, 15 Jul 2017 23:14:36 +0200 Subject: [PATCH] Prevent skipping shards if a suggest builder is present 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 --- .../main/java/org/elasticsearch/search/SearchService.java | 7 ++++++- .../java/org/elasticsearch/search/SearchServiceTests.java | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java index 662638ae1a505..2c5e6c49b417e 100644 --- a/core/src/main/java/org/elasticsearch/search/SearchService.java +++ b/core/src/main/java/org/elasticsearch/search/SearchService.java @@ -854,8 +854,13 @@ public boolean canMatch(ShardSearchRequest request) throws IOException { } } + /** + * Returns true iff the given search source builder can be early terminated by rewriting to a match none query. Or in other words + * if the execution of a the search request can be early terminated without executing it. This is for instance not possible if + * a global aggregation is part of this request or if there is a suggest builder present. + */ public static boolean canRewriteToMatchNone(SearchSourceBuilder source) { - if (source == null || source.query() == null || source.query() instanceof MatchAllQueryBuilder) { + if (source == null || source.query() == null || source.query() instanceof MatchAllQueryBuilder || source.suggest() != null) { return false; } else { AggregatorFactories.Builder aggregations = source.aggregations(); diff --git a/core/src/test/java/org/elasticsearch/search/SearchServiceTests.java b/core/src/test/java/org/elasticsearch/search/SearchServiceTests.java index 9d0e978795c70..c83789cfa33c3 100644 --- a/core/src/test/java/org/elasticsearch/search/SearchServiceTests.java +++ b/core/src/test/java/org/elasticsearch/search/SearchServiceTests.java @@ -56,6 +56,7 @@ import org.elasticsearch.search.internal.AliasFilter; import org.elasticsearch.search.internal.SearchContext; import org.elasticsearch.search.internal.ShardSearchLocalRequest; +import org.elasticsearch.search.suggest.SuggestBuilder; import org.elasticsearch.test.ESSingleNodeTestCase; import java.io.IOException; @@ -354,5 +355,11 @@ public void testCanRewriteToMatchNone() { assertTrue(SearchService.canRewriteToMatchNone(new SearchSourceBuilder().query(new TermQueryBuilder("foo", "bar")))); assertTrue(SearchService.canRewriteToMatchNone(new SearchSourceBuilder().query(new MatchNoneQueryBuilder()) .aggregation(new TermsAggregationBuilder("test", ValueType.STRING).minDocCount(1)))); + assertFalse(SearchService.canRewriteToMatchNone(new SearchSourceBuilder().query(new MatchNoneQueryBuilder()) + .aggregation(new TermsAggregationBuilder("test", ValueType.STRING).minDocCount(1)) + .suggest(new SuggestBuilder()))); + assertFalse(SearchService.canRewriteToMatchNone(new SearchSourceBuilder().query(new TermQueryBuilder("foo", "bar")) + .suggest(new SuggestBuilder()))); + } }