SearchService#canMatch takes into consideration the alias filter (#55120)

Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
Stéphane Campinas 2020-04-15 22:32:46 +02:00 committed by jimczi
parent 29b70733ae
commit 6ef1c64760
2 changed files with 16 additions and 2 deletions

View File

@ -1116,6 +1116,8 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
// we don't want to use the reader wrapper since it could run costly operations
// and we can afford false positives.
try (Engine.Searcher searcher = indexShard.acquireCanMatchSearcher()) {
final boolean aliasFilterCanMatch = request.getAliasFilter()
.getQueryBuilder() instanceof MatchNoneQueryBuilder == false;
QueryShardContext context = indexService.newQueryShardContext(request.shardId().id(), searcher,
request::nowInMillis, request.getClusterAlias());
Rewriteable.rewrite(request.getRewriteable(), context, false);
@ -1123,10 +1125,12 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
MinAndMax<?> minMax = sortBuilder != null ? FieldSortBuilder.getMinMaxOrNull(context, sortBuilder) : null;
if (canRewriteToMatchNone(request.source())) {
QueryBuilder queryBuilder = request.source().query();
return new CanMatchResponse(queryBuilder instanceof MatchNoneQueryBuilder == false, minMax);
return new CanMatchResponse(
aliasFilterCanMatch && queryBuilder instanceof MatchNoneQueryBuilder == false, minMax
);
}
// null query means match_all
return new CanMatchResponse(true, minMax);
return new CanMatchResponse(aliasFilterCanMatch, minMax);
}
}

View File

@ -673,6 +673,16 @@ public class SearchServiceTests extends ESSingleNodeTestCase {
ShardSearchRequest request = new ShardSearchRequest(OriginalIndices.NONE, searchRequest, indexShard.shardId(), 1,
new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, -1, null, null);
assertAcked(
client().admin().indices().prepareAliases()
.addAlias("index", "alias", new MatchNoneQueryBuilder())
.get()
);
searchRequest.source(new SearchSourceBuilder().query(new MatchAllQueryBuilder()));
assertFalse(service.canMatch(new ShardSearchRequest(OriginalIndices.NONE, searchRequest, indexShard.shardId(), 1,
new AliasFilter(new MatchNoneQueryBuilder(), "alias"), 1f, -1, null, null)).canMatch());
CountDownLatch latch = new CountDownLatch(1);
SearchShardTask task = new SearchShardTask(123L, "", "", "", null, Collections.emptyMap());
service.executeQueryPhase(request, task, new ActionListener<SearchPhaseResult>() {