You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2025/09/08 07:32:42 UTC
(lucene) branch main updated: Simplify MaxScoreBulkScorer. (#15141)
This is an automated email from the ASF dual-hosted git repository.
jpountz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git
The following commit(s) were added to refs/heads/main by this push:
new e3493182e9b Simplify MaxScoreBulkScorer. (#15141)
e3493182e9b is described below
commit e3493182e9b6e68faca70d6b905b4206da0399b5
Author: Adrien Grand <jp...@gmail.com>
AuthorDate: Mon Sep 8 09:32:36 2025 +0200
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.
---
.../apache/lucene/search/MaxScoreBulkScorer.java | 46 ++++------------------
1 file changed, 7 insertions(+), 39 deletions(-)
diff --git a/lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java b/lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java
index c723cbe00f1..343239e8c7a 100644
--- a/lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java
@@ -147,8 +147,6 @@ final class MaxScoreBulkScorer extends BulkScorer {
LeafCollector collector, Bits acceptDocs, int max, DisiWrapper filter) throws IOException {
if (filter != null) {
scoreInnerWindowWithFilter(collector, acceptDocs, max, filter);
- } else if (allScorers.length - firstRequiredScorer >= 2) {
- scoreInnerWindowAsConjunction(collector, acceptDocs, max);
} else {
DisiWrapper top = essentialQueue.top();
DisiWrapper top2 = essentialQueue.top2();
@@ -238,42 +236,6 @@ final class MaxScoreBulkScorer extends BulkScorer {
essentialQueue.updateTop();
}
- private void scoreInnerWindowAsConjunction(LeafCollector collector, Bits acceptDocs, int max)
- throws IOException {
- assert firstEssentialScorer == allScorers.length - 1;
- assert firstRequiredScorer <= allScorers.length - 2;
- DisiWrapper lead1 = allScorers[allScorers.length - 1];
- assert essentialQueue.size() == 1;
- assert lead1 == essentialQueue.top();
-
- for (lead1.scorer.nextDocsAndScores(max, acceptDocs, docAndScoreBuffer);
- docAndScoreBuffer.size > 0;
- lead1.scorer.nextDocsAndScores(max, acceptDocs, docAndScoreBuffer)) {
-
- docAndScoreAccBuffer.copyFrom(docAndScoreBuffer);
-
- for (int i = allScorers.length - 2; i >= firstRequiredScorer; --i) {
-
- if (scorable.minCompetitiveScore > 0) {
- ScorerUtil.filterCompetitiveHits(
- docAndScoreAccBuffer,
- maxScoreSums[i],
- scorable.minCompetitiveScore,
- allScorers.length);
- }
-
- DisiWrapper scorer = allScorers[i];
- ScorerUtil.applyRequiredClause(docAndScoreAccBuffer, scorer.iterator, scorer.scorable);
- }
-
- scoreNonEssentialClauses(collector, docAndScoreAccBuffer, firstRequiredScorer);
- }
-
- for (int i = allScorers.length - 1; i >= firstRequiredScorer; --i) {
- allScorers[i].doc = allScorers[i].iterator.docID();
- }
- }
-
private void scoreInnerWindowMultipleEssentialClauses(
LeafCollector collector, Bits acceptDocs, int max) throws IOException {
DisiWrapper top = essentialQueue.top();
@@ -375,9 +337,15 @@ final class MaxScoreBulkScorer extends BulkScorer {
DisiWrapper scorer = allScorers[i];
assert scorable.minCompetitiveScore > 0
: "All clauses are essential if minCompetitiveScore is equal to zero";
+
ScorerUtil.filterCompetitiveHits(
buffer, maxScoreSums[i], scorable.minCompetitiveScore, allScorers.length);
- ScorerUtil.applyOptionalClause(buffer, scorer.iterator, scorer.scorable);
+
+ if (i >= firstRequiredScorer) {
+ ScorerUtil.applyRequiredClause(buffer, scorer.iterator, scorer.scorable);
+ } else {
+ ScorerUtil.applyOptionalClause(buffer, scorer.iterator, scorer.scorable);
+ }
scorer.doc = scorer.iterator.docID();
}