Elasticsearch 查询经纬度报错 couldn’t validate latitude/ longitude values

应用服务返回错误日志,如下:

1
{"error":{"root_cause":[{"type":"query_shard_exception","reason":"couldn't validate latitude/ longitude values","index_uuid":"xxx","index":"xxxx"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"xxxx","node":"xxxx","reason":{"type":"query_shard_exception","reason":"couldn't validate latitude/ longitude values","index_uuid":"xxxx","index":"xxxxxx","caused_by":{"type":"query_validation_exception","reason":"Validation Failed: 1: [geo_distance] center point latitude is invalid: 116.629758;"}}}]},"status":400}

es服务错误日志,如下:

1
2
3
4
5
org.elasticsearch.transport.RemoteTransportException: [indices:data/read/search[phase/query]]
Caused by: org.elasticsearch.index.query.QueryShardException: couldn't validate latitude/ longitude values
...
Caused by: org.elasticsearch.index.query.QueryValidationException: Validation Failed: 1: [geo_distance] center point latitude is invalid: 116.629758;
....

原因调查:

因为测试人员经纬度写错导致,需要使用elasticsearch 工具类GeoUtils check经纬度的范围。

org.elasticsearch.common.geo.GeoUtils#isValidLongitude

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/** Maximum valid latitude in degrees. */
public static final double MAX_LAT = 90.0;
/** Minimum valid latitude in degrees. */
public static final double MIN_LAT = -90.0;
/** Maximum valid longitude in degrees. */
public static final double MAX_LON = 180.0;
/** Minimum valid longitude in degrees. */
public static final double MIN_LON = -180.0;

/** Returns true if latitude is actually a valid latitude value.*/
public static boolean isValidLatitude(double latitude) {
if (Double.isNaN(latitude) || Double.isInfinite(latitude) || latitude < GeoUtils.MIN_LAT || latitude > GeoUtils.MAX_LAT) {
return false;
}
return true;
}

org.elasticsearch.common.geo.GeoUtils#isValidLatitude

1
2
3
4
5
6
7
/** Returns true if longitude is actually a valid longitude value. */
public static boolean isValidLongitude(double longitude) {
if (Double.isNaN(longitude) || Double.isInfinite(longitude) || longitude < GeoUtils.MIN_LON || longitude > GeoUtils.MAX_LON){
return false;
}
return true;
}