Skip to content

Commit d389cff

Browse files
authored
Don't compute numDocs when size is set to 0 while creating query phase collector manager (#112488)
A simple call to `IndexReader#numDocs` can make us go through all docs and execute scripts in case there are runtime fields involved in the search. This is necessary only when size is greater than 0, otherwise it can be avoided. This commit moves the call to the two specific if branches in place of computing numDocs before the conditional
1 parent 2a9e474 commit d389cff

File tree

1 file changed

+40
-40
lines changed

1 file changed

+40
-40
lines changed

server/src/main/java/org/elasticsearch/search/query/QueryPhaseCollectorManager.java

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,6 @@ static CollectorManager<Collector, QueryPhaseResult> createQueryPhaseCollectorMa
220220
);
221221
final IndexReader reader = searchContext.searcher().getIndexReader();
222222
final Query query = searchContext.rewrittenQuery();
223-
// top collectors don't like a size of 0
224-
final int totalNumDocs = Math.max(1, reader.numDocs());
225223
if (searchContext.size() == 0) {
226224
return new EmptyHits(
227225
postFilterWeight,
@@ -232,31 +230,10 @@ static CollectorManager<Collector, QueryPhaseResult> createQueryPhaseCollectorMa
232230
searchContext.sort(),
233231
searchContext.trackTotalHitsUpTo()
234232
);
235-
} else if (searchContext.scrollContext() != null) {
236-
// we can disable the tracking of total hits after the initial scroll query
237-
// since the total hits is preserved in the scroll context.
238-
int trackTotalHitsUpTo = searchContext.scrollContext().totalHits != null
239-
? SearchContext.TRACK_TOTAL_HITS_DISABLED
240-
: SearchContext.TRACK_TOTAL_HITS_ACCURATE;
241-
// no matter what the value of from is
242-
int numDocs = Math.min(searchContext.size(), totalNumDocs);
243-
return forScroll(
244-
postFilterWeight,
245-
terminateAfterChecker,
246-
aggsCollectorManager,
247-
searchContext.minimumScore(),
248-
searchContext.getProfilers() != null,
249-
reader,
250-
query,
251-
searchContext.sort(),
252-
numDocs,
253-
searchContext.trackScores(),
254-
trackTotalHitsUpTo,
255-
hasFilterCollector,
256-
searchContext.scrollContext(),
257-
searchContext.numberOfShards()
258-
);
259-
} else {
233+
}
234+
// top collectors don't like a size of 0
235+
final int totalNumDocs = Math.max(1, reader.numDocs());
236+
if (searchContext.scrollContext() == null) {
260237
int numDocs = Math.min(searchContext.from() + searchContext.size(), totalNumDocs);
261238
final boolean rescore = searchContext.rescore().isEmpty() == false;
262239
if (rescore) {
@@ -265,38 +242,61 @@ static CollectorManager<Collector, QueryPhaseResult> createQueryPhaseCollectorMa
265242
numDocs = Math.max(numDocs, rescoreContext.getWindowSize());
266243
}
267244
}
268-
if (searchContext.collapse() != null) {
269-
boolean trackScores = searchContext.sort() == null || searchContext.trackScores();
270-
return forCollapsing(
245+
if (searchContext.collapse() == null) {
246+
return new WithHits(
271247
postFilterWeight,
272248
terminateAfterChecker,
273249
aggsCollectorManager,
274250
searchContext.minimumScore(),
275251
searchContext.getProfilers() != null,
276-
searchContext.collapse(),
252+
reader,
253+
query,
277254
searchContext.sort(),
255+
searchContext.searchAfter(),
278256
numDocs,
279-
trackScores,
280-
searchContext.searchAfter()
257+
searchContext.trackScores(),
258+
searchContext.trackTotalHitsUpTo(),
259+
hasFilterCollector
281260
);
282261
} else {
283-
return new WithHits(
262+
boolean trackScores = searchContext.sort() == null || searchContext.trackScores();
263+
return forCollapsing(
284264
postFilterWeight,
285265
terminateAfterChecker,
286266
aggsCollectorManager,
287267
searchContext.minimumScore(),
288268
searchContext.getProfilers() != null,
289-
reader,
290-
query,
269+
searchContext.collapse(),
291270
searchContext.sort(),
292-
searchContext.searchAfter(),
293271
numDocs,
294-
searchContext.trackScores(),
295-
searchContext.trackTotalHitsUpTo(),
296-
hasFilterCollector
272+
trackScores,
273+
searchContext.searchAfter()
297274
);
298275
}
299276
}
277+
// we can disable the tracking of total hits after the initial scroll query
278+
// since the total hits is preserved in the scroll context.
279+
int trackTotalHitsUpTo = searchContext.scrollContext().totalHits != null
280+
? SearchContext.TRACK_TOTAL_HITS_DISABLED
281+
: SearchContext.TRACK_TOTAL_HITS_ACCURATE;
282+
// no matter what the value of from is
283+
int numDocs = Math.min(searchContext.size(), totalNumDocs);
284+
return forScroll(
285+
postFilterWeight,
286+
terminateAfterChecker,
287+
aggsCollectorManager,
288+
searchContext.minimumScore(),
289+
searchContext.getProfilers() != null,
290+
reader,
291+
query,
292+
searchContext.sort(),
293+
numDocs,
294+
searchContext.trackScores(),
295+
trackTotalHitsUpTo,
296+
hasFilterCollector,
297+
searchContext.scrollContext(),
298+
searchContext.numberOfShards()
299+
);
300300
}
301301

302302
/**

0 commit comments

Comments
 (0)