Geo Distance Query(地理距离查询)

dsfs

过滤仅包含距离地理位置特定距离内的命中的文档。 假设以下映射和索引文档:

 PUT /my_locations
{
    "mappings": {
        "location": {
            "properties": {
                "pin": {
                    "properties": {
                        "location": {
                            "type": "geo_point"
                        }
                    }
                }
            }
        }
    }
}

PUT /my_locations/location/1
{
    "pin" : {
        "location" : {
            "lat" : 40.12,
            "lon" : -71.34
        }
    }
}

然后可以使用 geo_distance 过滤器执行以下简单查询:

GET /my_locations/location/_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "200km",
                    "pin.location" : {
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}

Accepted Formats (接受格式)

以同样的方式,geo_point 类型可以接受地理点的不同表示,过滤器也可以接受它:

Lat Lon As Properties (Lat Lon作为属性)

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

Lat Lon As Array (Lat Lon作为阵列)

Format in [lon, lat], note, the order of lon/lat here in order to conform with GeoJSON.

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

Lat Lon As String(Lat Lon作为字符串)

Format in lat,lon.   

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

Geohash(地理散列)

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

Options(选项)

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

| **distance**(距离) | 以指定位置为中心的圆的半径。 落入此圈子的点被认为是匹配的。 距离可以用各种单位指定。 看 the section called “Distance Unitsedit”. | | distance_type(距离类型) | 如何计算距离。 可以是弧(默认)或平面(更快,但长距离不准确,靠近极点)。 | | optimize_bbox(优化bbox) | 是否在距离检查之前首先运行边框检查使用优化。 默认在内存检查中执行的内存。 也可以使用索引值来使用索引值检查(在这种情况下确保geo_pointtype索引lat lon),否则禁用边界框优化。[~~2.2~~] | | _name(名称) | 可选名称字段来标识查询。 | | **ignore_malformed**(忽略格式错误) | [~~<sub>5.0.0</sub>~~] 设置为 true 以接受无效纬度或经度的地理点(默认值为假)。 | | **validation_method**(验证方法) | 设置为 IGNORE_MALFORMED 以接受无效纬度或经度的地理点,设置为 COERCE 以额外尝试推断正确的坐标(默认为 STRICT)。 |

geo_point Type(geo_point类型)

过滤器需要在相关字段上设置 geo_point 类型。

Multi Location Per Document(每个文档的多个位置)

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

Ignore Unmapped(忽略未映射)

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