Skip to content

Commit 8204eba

Browse files
authored
Fix Max Score Propagation in RankDocsQuery (#114716) (#114725)
Fix rank doc query when some segments have no ranked docs
1 parent 60443be commit 8204eba

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

server/src/main/java/org/elasticsearch/search/retriever/rankdoc/RankDocsQuery.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,10 @@ public Explanation explain(LeafReaderContext context, int doc) throws IOExceptio
107107

108108
@Override
109109
public Scorer scorer(LeafReaderContext context) {
110-
// Segment starts indicate how many docs are in the segment,
111-
// upper equalling lower indicates no documents for this segment
112-
if (segmentStarts[context.ord] == segmentStarts[context.ord + 1]) {
113-
return null;
114-
}
110+
/**
111+
* We return a scorer even if there are no ranked documents within the segment.
112+
* This ensures the correct propagation of the maximum score.
113+
*/
115114
return new Scorer(this) {
116115
final int lower = segmentStarts[context.ord];
117116
final int upper = segmentStarts[context.ord + 1];

server/src/test/java/org/elasticsearch/search/retriever/rankdoc/RankDocsQueryBuilderTests.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,23 @@ public void testRankDocsQueryEarlyTerminate() throws IOException {
195195
assertThat(col.totalHits.value, equalTo((long) topSize));
196196
assertEqualTopDocs(col.scoreDocs, rankDocs);
197197
}
198+
199+
{
200+
// A single rank doc in the last segment
201+
RankDoc[] singleRankDoc = new RankDoc[1];
202+
singleRankDoc[0] = rankDocs[rankDocs.length - 1];
203+
RankDocsQuery q = new RankDocsQuery(
204+
reader,
205+
singleRankDoc,
206+
new Query[] { NumericDocValuesField.newSlowExactQuery("active", 1) },
207+
new String[1],
208+
false
209+
);
210+
var topDocsManager = new TopScoreDocCollectorManager(1, null, 0);
211+
var col = searcher.search(q, topDocsManager);
212+
assertThat(col.totalHits.value, lessThanOrEqualTo((long) (2 + rankDocs.length)));
213+
assertEqualTopDocs(col.scoreDocs, singleRankDoc);
214+
}
198215
}
199216
}
200217
}

0 commit comments

Comments
 (0)