Skip to content

Commit f972116

Browse files
committed
Fix max score tracking with field collapsing (#27122)
This change makes sure that we track score when sort is set to relevancy only. In this case we always track max score like normal search does. Closes #23840
1 parent f5c8562 commit f972116

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

core/src/main/java/org/elasticsearch/search/query/TopDocsCollectorContext.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,9 +283,10 @@ static TopDocsCollectorContext createTopDocsCollectorContext(SearchContext searc
283283
return new ScrollingTopDocsCollectorContext(searchContext.scrollContext(),
284284
searchContext.sort(), numDocs, searchContext.trackScores(), searchContext.numberOfShards());
285285
} else if (searchContext.collapse() != null) {
286+
boolean trackScores = searchContext.sort() == null ? true : searchContext.trackScores();
286287
int numDocs = Math.min(searchContext.from() + searchContext.size(), totalNumDocs);
287288
return new CollapsingTopDocsCollectorContext(searchContext.collapse(),
288-
searchContext.sort(), numDocs, searchContext.trackScores());
289+
searchContext.sort(), numDocs, trackScores);
289290
} else {
290291
int numDocs = Math.min(searchContext.from() + searchContext.size(), totalNumDocs);
291292
final boolean rescore = searchContext.rescore().isEmpty() == false;

core/src/test/java/org/apache/lucene/grouping/CollapsingTopDocsCollectorTests.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
import java.util.List;
5555
import java.util.Set;
5656

57+
import static org.hamcrest.core.IsEqual.equalTo;
58+
5759
public class CollapsingTopDocsCollectorTests extends ESTestCase {
5860
private static class SegmentSearcher extends IndexSearcher {
5961
private final List<LeafReaderContext> ctx;
@@ -82,12 +84,15 @@ interface CollapsingDocValuesProducer<T extends Comparable> {
8284
}
8385

8486
<T extends Comparable> void assertSearchCollapse(CollapsingDocValuesProducer<T> dvProducers, boolean numeric) throws IOException {
85-
assertSearchCollapse(dvProducers, numeric, true);
86-
assertSearchCollapse(dvProducers, numeric, false);
87+
assertSearchCollapse(dvProducers, numeric, true, true);
88+
assertSearchCollapse(dvProducers, numeric, true, false);
89+
assertSearchCollapse(dvProducers, numeric, false, true);
90+
assertSearchCollapse(dvProducers, numeric, false, false);
8791
}
8892

8993
private <T extends Comparable> void assertSearchCollapse(CollapsingDocValuesProducer<T> dvProducers,
90-
boolean numeric, boolean multivalued) throws IOException {
94+
boolean numeric, boolean multivalued,
95+
boolean trackMaxScores) throws IOException {
9196
final int numDocs = randomIntBetween(1000, 2000);
9297
int maxGroup = randomIntBetween(2, 500);
9398
final Directory dir = newDirectory();
@@ -118,14 +123,14 @@ private <T extends Comparable> void assertSearchCollapse(CollapsingDocValuesProd
118123
final CollapsingTopDocsCollector collapsingCollector;
119124
if (numeric) {
120125
collapsingCollector =
121-
CollapsingTopDocsCollector.createNumeric(collapseField.getField(), sort, expectedNumGroups, false);
126+
CollapsingTopDocsCollector.createNumeric(collapseField.getField(), sort, expectedNumGroups, trackMaxScores);
122127
} else {
123128
collapsingCollector =
124-
CollapsingTopDocsCollector.createKeyword(collapseField.getField(), sort, expectedNumGroups, false);
129+
CollapsingTopDocsCollector.createKeyword(collapseField.getField(), sort, expectedNumGroups, trackMaxScores);
125130
}
126131

127132
TopFieldCollector topFieldCollector =
128-
TopFieldCollector.create(sort, totalHits, true, false, false);
133+
TopFieldCollector.create(sort, totalHits, true, trackMaxScores, trackMaxScores);
129134

130135
searcher.search(new MatchAllDocsQuery(), collapsingCollector);
131136
searcher.search(new MatchAllDocsQuery(), topFieldCollector);
@@ -136,6 +141,11 @@ private <T extends Comparable> void assertSearchCollapse(CollapsingDocValuesProd
136141
assertEquals(totalHits, collapseTopFieldDocs.totalHits);
137142
assertEquals(totalHits, topDocs.scoreDocs.length);
138143
assertEquals(totalHits, topDocs.totalHits);
144+
if (trackMaxScores) {
145+
assertThat(collapseTopFieldDocs.getMaxScore(), equalTo(topDocs.getMaxScore()));
146+
} else {
147+
assertThat(collapseTopFieldDocs.getMaxScore(), equalTo(Float.NaN));
148+
}
139149

140150
Set<Object> seen = new HashSet<>();
141151
// collapse field is the last sort
@@ -186,14 +196,14 @@ private <T extends Comparable> void assertSearchCollapse(CollapsingDocValuesProd
186196
}
187197

188198
final CollapseTopFieldDocs[] shardHits = new CollapseTopFieldDocs[subSearchers.length];
189-
final Weight weight = searcher.createNormalizedWeight(new MatchAllDocsQuery(), false);
199+
final Weight weight = searcher.createNormalizedWeight(new MatchAllDocsQuery(), true);
190200
for (int shardIDX = 0; shardIDX < subSearchers.length; shardIDX++) {
191201
final SegmentSearcher subSearcher = subSearchers[shardIDX];
192202
final CollapsingTopDocsCollector c;
193203
if (numeric) {
194-
c = CollapsingTopDocsCollector.createNumeric(collapseField.getField(), sort, expectedNumGroups, false);
204+
c = CollapsingTopDocsCollector.createNumeric(collapseField.getField(), sort, expectedNumGroups, trackMaxScores);
195205
} else {
196-
c = CollapsingTopDocsCollector.createKeyword(collapseField.getField(), sort, expectedNumGroups, false);
206+
c = CollapsingTopDocsCollector.createKeyword(collapseField.getField(), sort, expectedNumGroups, trackMaxScores);
197207
}
198208
subSearcher.search(weight, c);
199209
shardHits[shardIDX] = c.getTopDocs();

0 commit comments

Comments
 (0)