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.