边界查询 geo_bounding_box
查找地理点位于指定矩形中的文档。
示例 查询位于指定矩形中的文档
- 输入 geo_point 类型的索引数据
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
}
}
}
- 查询位于指定矩形中的文档。
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"pin.location" : {
"top_left" : {
"lat" : 40.73,
"lon" : -74.1
},
"bottom_right" : {
"lat" : 40.01,
"lon" : -71.12
}
}
}
}
}
}
}
多种查询方式示例
1. properties 方式
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"pin.location" : {
"top_left" : {
"lat" : 40.73,
"lon" : -74.1
},
"bottom_right" : {
"lat" : 40.01,
"lon" : -71.12
}
}
}
}
}
}
}
top_left : 左上角
bottom_right : 右下角
2. 数组方式
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"pin.location" : {
"top_left" : [-74.1, 40.73],
"bottom_right" : [-71.12, 40.01]
}
}
}
}
}
}
Array 格式为 [经度, 纬度]
3. 字符串方式
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"pin.location" : {
"top_left" : "40.73, -74.1",
"bottom_right" : "40.01, -71.12"
}
}
}
}
}
}
String 格式为 "经度, 纬度"
4. Well-Know Text (WKT)
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"pin.location" : {
"wkt" : "BBOX (-74.1, -71.12, 40.73, 40.01)"
}
}
}
}
}
}
54. Geo Hash
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"pin.location" : {
"top_left" : "dr5r9ydj2y73",
"bottom_right" : "drj7teegpus6"
}
}
}
}
}
}
6. 顶点
边界框的顶点也可以使用简单的 top、left、bottom 和 right 来单独设置值。
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"pin.location" : {
"top" : 40.73,
"left" : -74.1,
"bottom" : 40.01,
"right" : -71.12
}
}
}
}
}
}
type
bounding box执行的类型默认设置为memory,即在内存中检查doc是否在bounding box范围内。在某些情况下,indexed 选项会执行得更快
tip
注意,在这种情况下不支持多值类的geo_point, 且geo_point的mapping中必须为indexed=true。
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"pin.location" : {
"top_left" : {
"lat" : 40.73,
"lon" : -74.1
},
"bottom_right" : {
"lat" : 40.10,
"lon" : -71.12
}
},
"type" : "indexed"
}
}
}
}
}
参数说明
Ignore Unmapped
在查询具有不同mapping的多个索引时,ignore_unmapped 选项将忽略未映射的字段。当设置为 false(默认值)时,如果字段未映射,查询将抛出异常。
精度说明
地理点的精度有限,并且在索引时间内始终向下舍入。在查询期间,边界框的上边界向下舍入,而下边界向上舍入。因此,由于舍入误差,下边界上的点(边界框的底部和左边缘)可能无法进入边界框。同时,查询可能会选择上边界(顶部和右边缘)旁边的点,即使它们稍微位于边缘之外。纬度上的舍入误差应小于 4.20e-8 度,经度上的舍入误差应小于 8.39e-8 度,这意味着即使在赤道上也小于 1 厘米的误差。