一、介绍
ES中特有的类型geo_point,是用来存储地图类型的。店铺推荐、地图搜索和外卖平台等,实现目标距离你多少米,就是用这个数据类型做出来的。
其中,ES支持的地图检索方式有以下几种;
geo_distance:直线距离检索,如给定点A,要求返回地图上距离点A三千米的店铺
geo_bounding_box:以两个点确定一个矩形,获取在矩形内的全部数据
geo_polygon:以多个点,确定多边形,获取多边形内的全部数据
本文则以geo_distance为例说明。
二、举例说明
2.1 新建ES索引
PUT /map
{
"settings": {
"number_of_replicas": 3,
"number_of_shards": 5
}
, "mappings": {
"properties": {
"name":
{
"type": "text"
}
,"location":
{
"type": "geo_point"
}
}
}
}
2.2 添加索引数据
PUT /map/_doc/1
{
"name":"天安门",
"location":
{
"lon":116.403981,
"lat":39.914492
}
}
PUT /map/_doc/2
{
"name":"海淀公园",
"location":
{
"lon":116.302509,
"lat":39.991152
}
}
PUT /map/_doc/3
{
"name":"北京动物园",
"location":
{
"lon":116.343184,
"lat":39.947468
}
}
2.3 执行ES搜索
搜索条件:
【query中的参数】
location:指定定位的经纬度,一般取用户定位点的经纬度。
lat:纬度。
lon:经度。
distance:距离指定定位的最远距离,即本次搜索结果必须在指定定位点到该距离之间。
distance_type:arc表示圆形范围
【sort】中的参数
location:指定定位的经纬度,一般取用户定位点的经纬度。
order:距离排序,asc正序,desc则是倒序。
unit:距离单位,m就是米,km就是千米。
GET map/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"filter": [
{"geo_distance":{
"distance":"3000km",
"location":{
"lat":22.818481786041648,
"lon":108.37950959102159
},
"distance_type":"arc"
}}
]
}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 22.818481786041648,
"lon": 108.37950959102159
},
"order": "asc",
"unit": "m"
}
}
]
}
执行搜索,得到搜索结果:
根据前面的搜索条件,执行搜索后得到是按照当前定位点的经纬度,查询距离3km以内的所有店铺,由近及远的排序的结果。
location:每个店铺所在的经纬度。
sort:每个店铺距离当前定位点的距离。前面搜索条件我们设置了单位为米,所以这里就是距离1810米的意思。
三、结语
至于geo_bounding_box和geo_polygon的搜索方式我就不展开举例了,操作起来也大同小异,有兴趣的可以研究。文章来源:https://www.toymoban.com/news/detail-637998.html
根据经纬度查询结果并排序这个业务已经很常见了,既然ES提供了这个便捷,不妨使用一下,当然还有其他的办法可以实现这个效果,大家可以根据自己实际情况选型吧。文章来源地址https://www.toymoban.com/news/detail-637998.html
到了这里,关于用ES实现根据经纬度由近及远推荐店铺的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!