Skip to content

Commit c0c1a7a

Browse files
Apply boost only once for distance_feature query (#63767)
Currently if distance_feature query contains boost, it incorrectly gets applied twice: in AbstractQueryBuilder::toQuery and we also pass this boost to Lucene's LongPoint.newDistanceFeatureQuery. As a result we get incorrect scores. This fixes this error to ensure that boost is applied only once. Closes #63691
1 parent 179c6d4 commit c0c1a7a

File tree

3 files changed

+15
-4
lines changed

3 files changed

+15
-4
lines changed

docs/reference/release-notes/7.10.asciidoc

+11
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
[[release-notes-7.10.1]]
2+
== {es} version 7.10.1
3+
4+
[[bug-7.10.1]]
5+
[float]
6+
=== Bug fixes
7+
8+
Search::
9+
* Apply boost only once for distance_feature query {es-pull}63767[#63767]
10+
11+
112
[[release-notes-7.10.0]]
213
== {es} version 7.10.0
314

server/src/main/java/org/elasticsearch/index/query/DistanceFeatureQueryBuilder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ protected Query doToQuery(QueryShardContext context) throws IOException {
112112
if (fieldType == null) {
113113
return Queries.newMatchNoDocsQuery("Can't run [" + NAME + "] query on unmapped fields!");
114114
}
115-
return fieldType.distanceFeatureQuery(origin.origin(), pivot, boost, context);
115+
// As we already apply boost in AbstractQueryBuilder::toQuery, we always passing a boost of 1.0 to distanceFeatureQuery
116+
return fieldType.distanceFeatureQuery(origin.origin(), pivot, 1.0f, context);
116117
}
117118

118119
String fieldName() {

server/src/test/java/org/elasticsearch/index/query/DistanceFeatureQueryBuilderTests.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,11 @@ protected void doAssertLuceneQuery(DistanceFeatureQueryBuilder queryBuilder,
7878
String fieldName = expectedFieldName(queryBuilder.fieldName());
7979
Object origin = queryBuilder.origin().origin();
8080
String pivot = queryBuilder.pivot();
81-
float boost = queryBuilder.boost;
8281
final Query expectedQuery;
8382
if (fieldName.equals(GEO_POINT_FIELD_NAME)) {
8483
GeoPoint originGeoPoint = (origin instanceof GeoPoint)? (GeoPoint) origin : GeoUtils.parseFromString((String) origin);
8584
double pivotDouble = DistanceUnit.DEFAULT.parse(pivot, DistanceUnit.DEFAULT);
86-
expectedQuery = LatLonPoint.newDistanceFeatureQuery(fieldName, boost, originGeoPoint.lat(), originGeoPoint.lon(), pivotDouble);
85+
expectedQuery = LatLonPoint.newDistanceFeatureQuery(fieldName, 1.0f, originGeoPoint.lat(), originGeoPoint.lon(), pivotDouble);
8786
} else { // if (fieldName.equals(DATE_FIELD_NAME))
8887
MapperService mapperService = context.getMapperService();
8988
DateFieldType fieldType = (DateFieldType) mapperService.fieldType(fieldName);
@@ -95,7 +94,7 @@ protected void doAssertLuceneQuery(DistanceFeatureQueryBuilder queryBuilder,
9594
} else { // NANOSECONDS
9695
pivotLong = pivotVal.getNanos();
9796
}
98-
expectedQuery = LongPoint.newDistanceFeatureQuery(fieldName, boost, originLong, pivotLong);
97+
expectedQuery = LongPoint.newDistanceFeatureQuery(fieldName, 1.0f, originLong, pivotLong);
9998
}
10099
assertEquals(expectedQuery, query);
101100
}

0 commit comments

Comments
 (0)