elasticsearch 經緯度查詢
阿新 • • 發佈:2017-12-07
elasticsearch 經緯度查詢curl -XPUT "http://localhost:9200/shop/" -d '{
"mappings": {
"shop": {
"properties": {
"name": {
"type": "string"
},
"location": {
"type": "geo_point",//經緯度類型
"lat_lon": true,
"fielddata": {
"format": "compressed", //壓縮模式,節省內存
"precision": "3m"
}
}
}
}
}
}';
curl -XPUT http://localhost:9200/shop/shop/1 -d'
{"name": "北京", "location" : "39.9047253699,116.4072154982"}
';
curl -XPUT http://localhost:9200/shop/shop/2 -d'
{"name": "順義", "location" : "40.1299127031,116.6569478577"}
';
curl -XPUT http://localhost:9200/shop/shop/3 -d'
{"name": "天津", "location" : "39.0850853357,117.1993482089"}
';
curl -XPUT http://localhost:9200/shop/shop/4 -d'
{"name": "上海", "location" : "31.2304324029,121.4737919321"}
';
curl -XGET "http://localhost:9200/shop/shop/_search?pretty" -d '{
"query": {
"filtered": {
"filter": {
"geo_distance": {
"distance": "28km",
"type": "indexed",
"distance_type": "sloppy_arc",
"location": {
"lat": 39.9682060617,
"lon": 116.4107280170
}
}
}
}
},
"sort": [ //按距離排序
{
"_geo_distance": {
"location": {
"lat": 39.9682060617,
"lon": 116.4107280170
},
"order": "asc",
"unit": "km",
"distance_type": "sloppy_arc" //推薦適應此模式 plane 不準,精度太差
}
}
]
}'
再舉一個更加實際的例子
curl -XGET "http://localhost:9200/shop/shop/_search?pretty" -d '{
"query" : {
"function_score" : {
"query" : {
"bool" : {
"filter" : {
"geo_distance": {
"distance": "28km",
"type": "indexed",
"distance_type": "sloppy_arc",
"location": {
"lat": 39.9682060617,
"lon": 116.4107280170
}
}
}
}
},
"functions" : [ {
"script_score" : {
"script" : {
"inline" : "return 0"
}
}
},{
"gauss": { //按舉例遠近打分
"location": {
"origin": "39.9682060617,116.4107280170",
"scale": "5km",
"offset": "0",
"decay": 0.5
}
},
"weight": "1"
} ],
"score_mode" : "sum",
"boost_mode" : "replace"
}
}
}'
此時你會看到北京的得分是0.25分,因為差5公裏,衰減0.5, 北京距此坐標7公裏,所以取值0.25.
elasticsearch 經緯度查詢