Skip to content

Commit e349318

Browse files
authored
Simplify MaxScoreBulkScorer. (#15141)
After recent optimizations, the cases when we effectively evaluate a disjunctive query `apache OR lucene` as either `+apache +lucene` (two required clauses) or `apache +lucene` (one required clause, one optional clause) have converged a bit, and can be simplified.
1 parent eb21dd7 commit e349318

File tree

1 file changed

+7
-39
lines changed

1 file changed

+7
-39
lines changed

lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,6 @@ private void scoreInnerWindow(
147147
LeafCollector collector, Bits acceptDocs, int max, DisiWrapper filter) throws IOException {
148148
if (filter != null) {
149149
scoreInnerWindowWithFilter(collector, acceptDocs, max, filter);
150-
} else if (allScorers.length - firstRequiredScorer >= 2) {
151-
scoreInnerWindowAsConjunction(collector, acceptDocs, max);
152150
} else {
153151
DisiWrapper top = essentialQueue.top();
154152
DisiWrapper top2 = essentialQueue.top2();
@@ -238,42 +236,6 @@ private void scoreInnerWindowSingleEssentialClause(
238236
essentialQueue.updateTop();
239237
}
240238

241-
private void scoreInnerWindowAsConjunction(LeafCollector collector, Bits acceptDocs, int max)
242-
throws IOException {
243-
assert firstEssentialScorer == allScorers.length - 1;
244-
assert firstRequiredScorer <= allScorers.length - 2;
245-
DisiWrapper lead1 = allScorers[allScorers.length - 1];
246-
assert essentialQueue.size() == 1;
247-
assert lead1 == essentialQueue.top();
248-
249-
for (lead1.scorer.nextDocsAndScores(max, acceptDocs, docAndScoreBuffer);
250-
docAndScoreBuffer.size > 0;
251-
lead1.scorer.nextDocsAndScores(max, acceptDocs, docAndScoreBuffer)) {
252-
253-
docAndScoreAccBuffer.copyFrom(docAndScoreBuffer);
254-
255-
for (int i = allScorers.length - 2; i >= firstRequiredScorer; --i) {
256-
257-
if (scorable.minCompetitiveScore > 0) {
258-
ScorerUtil.filterCompetitiveHits(
259-
docAndScoreAccBuffer,
260-
maxScoreSums[i],
261-
scorable.minCompetitiveScore,
262-
allScorers.length);
263-
}
264-
265-
DisiWrapper scorer = allScorers[i];
266-
ScorerUtil.applyRequiredClause(docAndScoreAccBuffer, scorer.iterator, scorer.scorable);
267-
}
268-
269-
scoreNonEssentialClauses(collector, docAndScoreAccBuffer, firstRequiredScorer);
270-
}
271-
272-
for (int i = allScorers.length - 1; i >= firstRequiredScorer; --i) {
273-
allScorers[i].doc = allScorers[i].iterator.docID();
274-
}
275-
}
276-
277239
private void scoreInnerWindowMultipleEssentialClauses(
278240
LeafCollector collector, Bits acceptDocs, int max) throws IOException {
279241
DisiWrapper top = essentialQueue.top();
@@ -375,9 +337,15 @@ private void scoreNonEssentialClauses(
375337
DisiWrapper scorer = allScorers[i];
376338
assert scorable.minCompetitiveScore > 0
377339
: "All clauses are essential if minCompetitiveScore is equal to zero";
340+
378341
ScorerUtil.filterCompetitiveHits(
379342
buffer, maxScoreSums[i], scorable.minCompetitiveScore, allScorers.length);
380-
ScorerUtil.applyOptionalClause(buffer, scorer.iterator, scorer.scorable);
343+
344+
if (i >= firstRequiredScorer) {
345+
ScorerUtil.applyRequiredClause(buffer, scorer.iterator, scorer.scorable);
346+
} else {
347+
ScorerUtil.applyOptionalClause(buffer, scorer.iterator, scorer.scorable);
348+
}
381349
scorer.doc = scorer.iterator.docID();
382350
}
383351

0 commit comments

Comments
 (0)