Elasticsearch--地理搜索

目录

地理位置索引

空间搜索映射定义

elasticsearch中使用geo_point类型定义地理位置。

示例

下面是一些示例数据:

location字段是geo_point类型的,可以使用字符串,数字或者一个对象来提供经纬度。注意使用字符串和数组来提供经纬度时,经度和纬度参数有不同的顺序。最后一条记录使用地理散列值,详细描述见http://en.wikipedia.org/wiki/Geohash

使用坐标进行查询的方式有多种

基于距离的排序

按照与给定地点的距离进行排序。

{
    "query":{
        "match_all":{

        }
    },
    "sort":[
        {
            "_geo_distance":{
                "location":"48.1312, 2.356",
                "unit":"km"
            }
        }
    ]
}

使用_geo_distance表明按照距离进行排序,unit的值有:km(公里),mi(英里)。

边界框过滤

当需要在地图上显示结果,或者允许用户标记地图区域来搜索时,非常有用

{
    "filter":{
        "geo_bounding_box":{
            "location":{
                "top_left":"52.346, -1.962",
                "bottom_right":"48.155, 2.356"
            }
        }
    }
}

通过提供左上和右下坐标,形成一个矩形区域。Elasticsearch会自动计算出该区域,并返回位于该区域中的点的数据记录。

距离的限制

把结果限定为离基准点一个选定的距离之内。

{
    "filter":{
        "geo_distance":{
            "location":"48.656, 2.355",
            "distance":"500km"
        }
    }
}

任意地理形状搜索

Elasticsearch使用geo_shape来定义自定义形状。
映射如下:

{
    "poi":{
        "properties":{
            "name":{
                "type":"string",
                "index":"not_analyzed"
            },
            "location":{
                "type":"geo_shape"
            }
        }
    }
}

上面定义了一个poi索引类型,location字段使用geo_shape类型(不同的es版本写法略有不同)。

geo_shape类型字段的结构语法被称为GeoJson.它允许我们定义各种地理类型。

一个点的第一个元素是经度,第二个元素是纬度。

{
    "location":{
        "type":"point",
        "coordinates":[
            -0.265,
            51.5646
        ]
    }
}

包络线

一个包络线(Envelope)通过提供左上和右下两个坐标定义一个框。

{
"type":"envelope",
"coordinates":[[-0.265, 51.5646],[56.166, 4.621]]
}

多边形

一个多边形通过一个连接点的列表来创建。数组中的第一个点和最后一个点必须是一样的,保证闭合。

{
"type":"polygon",
"coordinates":[
    [-0.265, 51.5646],[56.166, 4.621],
    [6.255, 5.5646],[6.166, 9.621],
    [3.274, 34.566],[12.386, 6.741],
    [-0.265, 51.5646],[56.166, 4.621]
    ]
}

多个多边形



multipolygon形状包含多个多边形,除了有多个多边形还可以包含多个被排除的形状。

比如查询某个区域中是否有数据时,可以使用多边形定义这个区域,elasticsearch就能返回该区域内的数据。
下面是一个查询用法:

把形状保存到索引中

形状的定义很复杂,但是形状不会经常改变。在索引中定义形状,并在查询中使用它们。
映射定义如下:

索引下面数据:

查询语句如下:

{
    "filter":{
        "geo_shape":{
            "location":{
                "index_shape":{
                    "index":"countries",
                    "type":"country",
                    "path":"area",
                    "id":1
                }
            }
        }
    }
}

比较最近这两个查询,shape变成了indexed_shape。需要告诉elasticsearch去哪里找这个形状。

猜你喜欢

转载自www.cnblogs.com/51zone/p/9853818.html
今日推荐