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

Elasticsearch geo_bounding_box 按矩形范围搜索


ES中通过geo_bounding_box搜索,在地图画一个矩形,搜索矩形范围内的坐标点。

例如:

在地图画一个矩形,把矩形范围内的店铺找出来。

GET /shops/_search
{
  "query": {
    "bool": { // 布尔组合查询
      "must": {
        "match_all": {} // 这里设置其他搜索条件,直接搜索所有文档
      },
      "filter": { // 地理信息搜索不打算参与相关度评分,所以使用filter包裹起来。
        "geo_bounding_box": { // geo_bounding_box实现按矩形范围搜索
          "location": { // 店铺的坐标点保存在location字段中
            "top_left": { // 设置矩形的左上角坐标
              "lat": 40.73, // 纬度
              "lon": -74.1 // 经度
            },
            "bottom_right": { // 设置矩形的右下角坐标
              "lat": 40.717,
              "lon": -73.99
            }
          }
        }
      }
    }
  },
  "sort": [ // 设置排序条件
    {
      "_geo_distance": { // _geo_distance代表按距离排序
        "location": { // 计算 location保存的坐标和当前坐标的距离
          "lat": 40, // 当前纬度
          "lon": -70 // 当前经度
        },
        "order": "asc" // 根据距离升序排序
      }
    }
  ]
}

说明:

按矩形范围搜索店铺,如果需要对搜索的结果按距离排序,需要指定一个当前参考坐标,否则ES无法计算距离,也就是无法按距离排序。