一、介紹
ES中特有的類型geo_point,是用來存儲地圖類型的。店鋪推薦、地圖搜索和外賣平臺等,實現(xiàn)目標距離你多少米,就是用這個數(shù)據(jù)類型做出來的。
其中,ES支持的地圖檢索方式有以下幾種;
geo_distance:直線距離檢索,如給定點A,要求返回地圖上距離點A三千米的店鋪
geo_bounding_box:以兩個點確定一個矩形,獲取在矩形內(nèi)的全部數(shù)據(jù)
geo_polygon:以多個點,確定多邊形,獲取多邊形內(nèi)的全部數(shù)據(jù)
本文則以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 添加索引數(shù)據(jù)
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 執(zhí)行ES搜索
搜索條件:
【query中的參數(shù)】
location:指定定位的經(jīng)緯度,一般取用戶定位點的經(jīng)緯度。
lat:緯度。
lon:經(jīng)度。
distance:距離指定定位的最遠距離,即本次搜索結(jié)果必須在指定定位點到該距離之間。
distance_type:arc表示圓形范圍

【sort】中的參數(shù)
location:指定定位的經(jīng)緯度,一般取用戶定位點的經(jīng)緯度。
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"
}
}
]
}
執(zhí)行搜索,得到搜索結(jié)果:
根據(jù)前面的搜索條件,執(zhí)行搜索后得到是按照當(dāng)前定位點的經(jīng)緯度,查詢距離3km以內(nèi)的所有店鋪,由近及遠的排序的結(jié)果。
location:每個店鋪所在的經(jīng)緯度。
sort:每個店鋪距離當(dāng)前定位點的距離。前面搜索條件我們設(shè)置了單位為米,所以這里就是距離1810米的意思。

三、結(jié)語
至于geo_bounding_box和geo_polygon的搜索方式我就不展開舉例了,操作起來也大同小異,有興趣的可以研究。文章來源:http://www.zghlxwxcb.cn/news/detail-637998.html
根據(jù)經(jīng)緯度查詢結(jié)果并排序這個業(yè)務(wù)已經(jīng)很常見了,既然ES提供了這個便捷,不妨使用一下,當(dāng)然還有其他的辦法可以實現(xiàn)這個效果,大家可以根據(jù)自己實際情況選型吧。文章來源地址http://www.zghlxwxcb.cn/news/detail-637998.html
到了這里,關(guān)于用ES實現(xiàn)根據(jù)經(jīng)緯度由近及遠推薦店鋪的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!