如果ES索引的字段类型为:geo_point,我们就可以按距离搜索文档。
下面以搜索附近店铺为例子介绍具体用法。
1.创建店铺索引
PUT /shops
{
"mappings": {
"properties": {
"id": { // 店铺Id
"type": "integer"
},
"title": { // 店铺名
"type": "text"
},
"location": { // 店铺经纬度
"type": "geo_point"
}
}
}
}
2.按距离搜索
通过geo_distance搜索指定距离内的文档。
例子:
GET /shops/_search
{
"query": { // query查询
"bool": { // 布尔组合查询
"must": {
"match_all": {} // 这里不设置其他查询条件,所以匹配全部文档
},
"filter": { // 因为地理信息搜索不打算参与相关度计算,所以使用filter包裹geo_distance
"geo_distance": { // geo_distance按距离搜索
"distance": "1km", // 设置搜索距离为1千米
"location": { // 搜索location字段存储的经纬度和当前经纬度之间的距离。
"lat": 39.889916, // 当前纬度
"lon": 116.379547 // 当前经度
}
}
}
}
}
}
搜索当前经纬度和location字段存储的经纬度之间的距离在1千米范围之内的所有文档。
geo_distance参数说明:
- distance - 设置搜索距离,常用距离单位:km(千米)、m(米)
- 当前经纬度坐标点。
提示:既然要计算距离,肯定需要知道两个坐标点才能计算,所以geo_distance参数需要提供当前坐标点。