Skip to content

Commit e5ab09f

Browse files
authored
Aggregations/HL Rest client fix: missing scores (#32774)
Significance score doubles were being parsed as long. Existing tests did not catch this because SignificantLongTermsTests and SignificantStringTermsTests did not set the score. Fixed these and also added integration test. Thanks for the report/fix, Blakko Closes #32770
1 parent 00b006f commit e5ab09f

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

client/rest-high-level/src/test/java/org/elasticsearch/client/SearchIT.java

+30
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@
5959
import org.elasticsearch.search.aggregations.BucketOrder;
6060
import org.elasticsearch.search.aggregations.bucket.range.Range;
6161
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregationBuilder;
62+
import org.elasticsearch.search.aggregations.bucket.significant.SignificantTerms;
63+
import org.elasticsearch.search.aggregations.bucket.significant.SignificantTermsAggregationBuilder;
64+
import org.elasticsearch.search.aggregations.bucket.significant.heuristics.PercentageScore;
6265
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
6366
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
6467
import org.elasticsearch.search.aggregations.matrix.stats.MatrixStats;
@@ -267,6 +270,33 @@ public void testSearchWithTermsAgg() throws IOException {
267270
assertEquals(2, type2.getDocCount());
268271
assertEquals(0, type2.getAggregations().asList().size());
269272
}
273+
274+
public void testSearchWithSignificantTermsAgg() throws IOException {
275+
SearchRequest searchRequest = new SearchRequest();
276+
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
277+
searchSourceBuilder.query(new MatchQueryBuilder("num","50"));
278+
searchSourceBuilder.aggregation(new SignificantTermsAggregationBuilder("agg1", ValueType.STRING)
279+
.field("type.keyword")
280+
.minDocCount(1)
281+
.significanceHeuristic(new PercentageScore()));
282+
searchSourceBuilder.size(0);
283+
searchRequest.source(searchSourceBuilder);
284+
SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync);
285+
assertSearchHeader(searchResponse);
286+
assertNull(searchResponse.getSuggest());
287+
assertEquals(Collections.emptyMap(), searchResponse.getProfileResults());
288+
assertEquals(0, searchResponse.getHits().getHits().length);
289+
assertEquals(0f, searchResponse.getHits().getMaxScore(), 0f);
290+
SignificantTerms significantTermsAgg = searchResponse.getAggregations().get("agg1");
291+
assertEquals("agg1", significantTermsAgg.getName());
292+
assertEquals(1, significantTermsAgg.getBuckets().size());
293+
SignificantTerms.Bucket type1 = significantTermsAgg.getBucketByKey("type1");
294+
assertEquals(1, type1.getDocCount());
295+
assertEquals(1, type1.getSubsetDf());
296+
assertEquals(1, type1.getSubsetSize());
297+
assertEquals(3, type1.getSupersetDf());
298+
assertEquals(1d/3d, type1.getSignificanceScore(), 0d);
299+
}
270300

271301
public void testSearchWithRangeAgg() throws IOException {
272302
{

server/src/main/java/org/elasticsearch/search/aggregations/bucket/significant/ParsedSignificantTerms.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ static <B extends ParsedBucket> B parseSignificantTermsBucketXContent(final XCon
175175
bucket.subsetDf = value;
176176
bucket.setDocCount(value);
177177
} else if (InternalSignificantTerms.SCORE.equals(currentFieldName)) {
178-
bucket.score = parser.longValue();
178+
bucket.score = parser.doubleValue();
179179
} else if (InternalSignificantTerms.BG_COUNT.equals(currentFieldName)) {
180180
bucket.supersetDf = parser.longValue();
181181
}

server/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificantLongTermsTests.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ protected InternalSignificantTerms createTestInstance(String name,
5757
Set<Long> terms = new HashSet<>();
5858
for (int i = 0; i < numBuckets; ++i) {
5959
long term = randomValueOtherThanMany(l -> terms.add(l) == false, random()::nextLong);
60-
buckets.add(new SignificantLongTerms.Bucket(subsetDfs[i], subsetSize, supersetDfs[i], supersetSize, term, aggs, format));
60+
SignificantLongTerms.Bucket bucket = new SignificantLongTerms.Bucket(subsetDfs[i], subsetSize,
61+
supersetDfs[i], supersetSize, term, aggs, format);
62+
bucket.updateScore(significanceHeuristic);
63+
buckets.add(bucket);
6164
}
6265
return new SignificantLongTerms(name, requiredSize, 1L, pipelineAggregators, metaData, format, subsetSize,
6366
supersetSize, significanceHeuristic, buckets);

server/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificantStringTermsTests.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ protected InternalSignificantTerms createTestInstance(String name,
5050
Set<BytesRef> terms = new HashSet<>();
5151
for (int i = 0; i < numBuckets; ++i) {
5252
BytesRef term = randomValueOtherThanMany(b -> terms.add(b) == false, () -> new BytesRef(randomAlphaOfLength(10)));
53-
buckets.add(new SignificantStringTerms.Bucket(term, subsetDfs[i], subsetSize, supersetDfs[i], supersetSize, aggs, format));
53+
SignificantStringTerms.Bucket bucket = new SignificantStringTerms.Bucket(term, subsetDfs[i], subsetSize,
54+
supersetDfs[i], supersetSize, aggs, format);
55+
bucket.updateScore(significanceHeuristic);
56+
buckets.add(bucket);
5457
}
5558
return new SignificantStringTerms(name, requiredSize, 1L, pipelineAggregators, metaData, format, subsetSize,
5659
supersetSize, significanceHeuristic, buckets);

0 commit comments

Comments
 (0)