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

Elasticsearch geo_point 按距离搜索


如果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参数需要提供当前坐标点。