一架梯子,一头程序猿,仰望星空!

Elasticsearch geo 按距离排序


根据地理信息搜索文档之后,返回多个文档数据的时候,很多业务场景都希望根据距离由近到远排序。

下面是按距离排序的例子

GET /shops/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": { // 按距离搜索
          "distance": "1km", // 搜索1千米范围
          "location": { // 搜索字段为location
            "lat": 39.889916, // 当前纬度
            "lon": 116.379547 // 当前经度
          }
        }
      }
    }
  },
  "sort": [ // 设置排序条件
    {
      "_geo_distance": { // _geo_distance代表根据距离排序
        "location": { // 根据location存储的经纬度计算距离。
          "lat": 39.889916, // 当前纬度
          "lon": 116.379547 // 当前经度
        },
        "order": "asc" // asc 表示升序,desc 表示降序
      }
    }
  ]
}

说明:

按距离排序条件,需要再次设置当前经纬度坐标,这样ES才知道计算距离的参考坐标。