跳到主要内容

距离查询 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(默认值)时,如果字段未映射,查询将抛出异常。