|
48 | 48 | import org.elasticsearch.search.internal.ShardSearchContextId; |
49 | 49 | import org.elasticsearch.search.internal.ShardSearchRequest; |
50 | 50 | import org.elasticsearch.search.query.QuerySearchResult; |
51 | | -import org.elasticsearch.search.sort.FieldSortBuilder; |
52 | 51 | import org.elasticsearch.search.sort.MinAndMax; |
53 | 52 | import org.elasticsearch.tasks.CancellableTask; |
54 | 53 | import org.elasticsearch.tasks.Task; |
@@ -480,11 +479,7 @@ protected void doRun() { |
480 | 479 | } |
481 | 480 |
|
482 | 481 | try { |
483 | | - final int[] indexes = CanMatchPreFilterSearchPhase.sortShards( |
484 | | - shards, |
485 | | - minAndMax, |
486 | | - FieldSortBuilder.getPrimaryFieldSortOrNull(request.source()).order() |
487 | | - ); |
| 482 | + final int[] indexes = CanMatchPreFilterSearchPhase.sortShards(shards, minAndMax, request.source()); |
488 | 483 | final ShardToQuery[] orig = shards.toArray(new ShardToQuery[0]); |
489 | 484 | for (int i = 0; i < indexes.length; i++) { |
490 | 485 | shards.set(i, orig[indexes[i]]); |
@@ -652,31 +647,29 @@ static void registerNodeSearchAction( |
652 | 647 | NodeQueryRequest::new, |
653 | 648 | (request, channel, task) -> { |
654 | 649 | final SearchRequest searchRequest = request.searchRequest; |
655 | | - final IntUnaryOperator shards; |
656 | | - final ShardSearchRequest[] shardSearchRequests; |
| 650 | + ShardSearchRequest[] shardSearchRequests = null; |
| 651 | + IntUnaryOperator shards = IntUnaryOperator.identity(); |
657 | 652 | final int shardCount = request.shards.size(); |
658 | 653 | if (shardCount > 1 && hasPrimaryFieldSort(searchRequest.source())) { |
659 | | - shardSearchRequests = new ShardSearchRequest[shardCount]; |
660 | | - @SuppressWarnings("rawtypes") |
661 | | - final MinAndMax[] minAndMax = new MinAndMax[shardCount]; |
662 | | - for (int i = 0; i < minAndMax.length; i++) { |
663 | | - ShardSearchRequest r = buildShardSearchRequestForLocal(request, request.shards.get(i)); |
664 | | - shardSearchRequests[i] = r; |
665 | | - var canMatch = searchService.canMatch(r); |
666 | | - if (canMatch.canMatch()) { |
667 | | - r.setRunCanMatchInQueryPhase(false); |
668 | | - minAndMax[i] = canMatch.estimatedMinAndMax(); |
| 654 | + try { |
| 655 | + shardSearchRequests = new ShardSearchRequest[shardCount]; |
| 656 | + @SuppressWarnings("rawtypes") |
| 657 | + final MinAndMax[] minAndMax = new MinAndMax[shardCount]; |
| 658 | + for (int i = 0; i < minAndMax.length; i++) { |
| 659 | + ShardSearchRequest r = buildShardSearchRequestForLocal(request, request.shards.get(i)); |
| 660 | + shardSearchRequests[i] = r; |
| 661 | + var canMatch = searchService.canMatch(r); |
| 662 | + if (canMatch.canMatch()) { |
| 663 | + r.setRunCanMatchInQueryPhase(false); |
| 664 | + minAndMax[i] = canMatch.estimatedMinAndMax(); |
| 665 | + } |
669 | 666 | } |
| 667 | + int[] indexes = CanMatchPreFilterSearchPhase.sortShards(request.shards, minAndMax, searchRequest.source()); |
| 668 | + shards = pos -> indexes[pos]; |
| 669 | + } catch (Exception e) { |
| 670 | + // TODO: ignored for now but we'll be guaranteed to fail the query phase at this point, fix things to fail here |
| 671 | + // already |
670 | 672 | } |
671 | | - int[] indexes = CanMatchPreFilterSearchPhase.sortShards( |
672 | | - request.shards, |
673 | | - minAndMax, |
674 | | - FieldSortBuilder.getPrimaryFieldSortOrNull(searchRequest.source()).order() |
675 | | - ); |
676 | | - shards = pos -> indexes[pos]; |
677 | | - } else { |
678 | | - shardSearchRequests = null; |
679 | | - shards = IntUnaryOperator.identity(); |
680 | 673 | } |
681 | 674 | final CancellableTask cancellableTask = (CancellableTask) task; |
682 | 675 | int workers = Math.min(searchRequest.getMaxConcurrentShardRequests(), Math.min(shardCount, searchPoolMax)); |
|
0 commit comments