距离查询 geo_distance
查找地理点位于一个中心点到指定距离范围内的文档。
例子 查询200km半径内的位置
PUT /my_locations
{
"mappings": {
"_doc": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
}
PUT /my_locations/_doc/1
{
"pin" : {
"location" : {
"lat" : 40.12,
"lon" : -71.34
}
}
}
然后可以使用 geo_distance 过滤器执行以下简单查询:
GET /my_locations/_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "200km",
"pin.location" : {
"lat" : 40,
"lon" : -70
}
}
}
}
}
}
接受的查询格式
1. properties 方式
GET /my_locations/_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "12km",
"pin.location" : {
"lat" : 40,
"lon" : -70
}
}
}
}
}
}
2. 数组方式
GET /my_locations/_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "12km",
"pin.location" : [-70, 40]
}
}
}
}
}
3. 字符串方式
GET /my_locations/_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "12km",
"pin.location" : "40,-70"
}
}
}
}
}
4. Geo Hash方式
GET /my_locations/_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "12km",
"pin.location" : "drm3btev3e86"
}
}
}
}
}
参数说明
geo_distance
- distance 以指定位置为中心的圆的半径。落在这个圆圈中的点被认为是匹配的。可以用各种单位指定距离。请参见距离单位。
- distance_type 如何计算距离。可以是
arc
(默认)或plane
平面(更快,但在长距离和靠近两极时不准确)。 - _name 用于标识查询的可选名称字段
- validation_method 设置为
IGNORE_MALFORMED
以接受具有无效纬度或经度的地理点,设置为COERCE
以另外尝试并推断正确的坐标(默认为STRICT
)
Ignore Unmapped
在查询具有不同mapping的多个索引时,ignore_unmapped 选项将忽略未映射的字段。当设置为 false(默认值)时,如果字段未映射,查询将抛出异常。