地理位置距离(geo_distance)查询

过滤仅包含与一个地理位置坐标在指定距离内匹配的文档。假设有以下映射和索引文档:

PUT /my_locations
{
    "mappings": {
        "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
                    }
                }
            }
        }
    }
}

接受的格式

geo_point类型可以接受地理坐标点的不同表示方式非常相似,过滤器也可以接受它:

作为 lat lon 属性
GET /my_locations/_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "12km",
                    "pin.location" : {
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}
作为 lat lon 数组

格式为[lon, lat],注意,此处 lon/lat 的顺序是为了符合GeoJSON

GET /my_locations/_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "12km",
                    "pin.location" : [-70, 40]
                }
            }
        }
    }
}
作为 lat lon 字符串

格式为lat,lon

GET /my_locations/_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "12km",
                    "pin.location" : "40,-70"
                }
            }
        }
    }
}
geohash
GET /my_locations/_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "12km",
                    "pin.location" : "drm3btev3e86"
                }
            }
        }
    }
}

选项

以下是过滤器上允许的选项:

distance

以指定位置为圆心的圆的半径。 落入这个圆内的点被认为是匹配的。 可以用各种单位指定distance。参考距离单位

distance_type

如何计算距离。可以是arc(弧形。默认值),也可以是plane(平面。计算更快,但在长距离和接近极点时不准确)。

_name

可选,用来标识查询名称的字段。

validation_method

设置为IGNORE_MALFORMED以接受无效的纬度或经度值的 geo point,设置为COERCE以尝试推断正确的纬度或经度。(默认为 STRICT)。

geo_point 类型

过滤器要求在相关字段中设置geo_point类型。

一个文档包含多个位置

geo_distance过滤器可以处理每个文档的多个位置/坐标点。 一旦单个位置/坐标点与过滤器匹配,该文档就将包含在过滤器中。

忽略未映射的字段 (ignore unmapped)

如果ignore_unmapped选项设置为true,将忽略未映射的字段,并且此查询不会匹配任何文档。 这在查询可能具有不同映射的多个索引时非常有用。 当设置为false(默认值)时,如果字段未映射,查询将抛出异常。