diff --git a/docs/changelog/130924.yaml b/docs/changelog/130924.yaml new file mode 100644 index 0000000000000..09b0f3b90533c --- /dev/null +++ b/docs/changelog/130924.yaml @@ -0,0 +1,6 @@ +pr: 130924 +summary: Check field data type before casting when applying geo distance sort +area: Search +type: bug +issues: + - 129500 diff --git a/server/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java b/server/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java index 61d20fa72e262..3c5033355b826 100644 --- a/server/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java @@ -599,7 +599,13 @@ private IndexGeoPointFieldData fieldData(SearchExecutionContext context) { throw new IllegalArgumentException("failed to find mapper for [" + fieldName + "] for geo distance based sort"); } } - return context.getForField(fieldType, MappedFieldType.FielddataOperation.SEARCH); + IndexFieldData indexFieldData = context.getForField(fieldType, MappedFieldType.FielddataOperation.SEARCH); + if (indexFieldData instanceof IndexGeoPointFieldData) { + return (IndexGeoPointFieldData) indexFieldData; + } + throw new IllegalArgumentException( + "unable to apply geo distance sort to field [" + fieldName + "] of type [" + fieldType.typeName() + "]" + ); } private Nested nested(SearchExecutionContext context) throws IOException { diff --git a/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java b/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java index 17a9fb5974176..5bef1f4769cff 100644 --- a/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java @@ -23,6 +23,7 @@ import org.elasticsearch.index.mapper.GeoPointFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NestedPathFieldMapper; +import org.elasticsearch.index.mapper.NumberFieldMapper; import org.elasticsearch.index.query.GeoValidationMethod; import org.elasticsearch.index.query.MatchAllQueryBuilder; import org.elasticsearch.index.query.MatchNoneQueryBuilder; @@ -99,6 +100,9 @@ public static GeoDistanceSortBuilder randomGeoDistanceSortBuilder() { @Override protected MappedFieldType provideMappedFieldType(String name) { + if (name.equals("double")) { + return new NumberFieldMapper.NumberFieldType(name, NumberFieldMapper.NumberType.DOUBLE); + } return new GeoPointFieldMapper.GeoPointFieldType(name); } @@ -531,6 +535,12 @@ public void testBuildInvalidPoints() throws IOException { ); assertEquals("illegal longitude value [-360.0] for [GeoDistanceSort] for field [fieldName].", ex.getMessage()); } + { + GeoDistanceSortBuilder sortBuilder = new GeoDistanceSortBuilder("double", 0.0, 180.0); + sortBuilder.validation(GeoValidationMethod.STRICT); + IllegalArgumentException ex = expectThrows(IllegalArgumentException.class, () -> sortBuilder.build(searchExecutionContext)); + assertEquals("unable to apply geo distance sort to field [double] of type [double]", ex.getMessage()); + } } /**