You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch Geotile聚合:size限制下按距离筛选近邻分组的方案

Elasticsearch Geotile聚合保留最近分组解决方案

要实现仅保留离指定点最近的Geotile分组,无需调整geotile_grid的默认size,可以通过**bucket_sort聚合结合脚本计算距离**来过滤排序后的bucket,具体实现如下:

核心思路

  1. 先用geo_bounding_box过滤目标区域内的文档,减少聚合计算量;
  2. 执行geotile_grid聚合生成初始tile分组;
  3. 通过bucket_sort聚合,利用脚本计算每个tile中心点到指定坐标的距离,按距离升序排序后保留指定数量的最近分组。

查询示例

{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": { "lat": 40.73, "lon": -74.1 },
        "bottom_right": { "lat": 40.717, "lon": -73.99 }
      }
    }
  },
  "aggs": {
    "tiles": {
      "geotile_grid": {
        "field": "location",
        "precision": 10 // 根据需求调整精度,精度越高tile越小
      },
      "aggs": {
        "sort_by_distance": {
          "bucket_sort": {
            "sort": [
              {
                "_script": {
                  "type": "number",
                  "script": {
                    "source": "doc['location'].arcDistance(params.target_lat, params.target_lon)",
                    "params": {
                      "target_lat": 40.72, // 指定的目标点纬度
                      "target_lon": -74.0 // 指定的目标点经度
                    }
                  },
                  "order": "asc"
                }
              }
            ],
            "size": 100 // 保留最近的100个tile分组,按需调整
          }
        }
      }
    }
  }
}

关键说明

  • arcDistance方法用于计算地理坐标间的球面距离(单位:米),也可使用planeDistance计算平面距离(性能稍高但精度略低);
  • bucket_sort的size仅控制最终返回的最近分组数量,不会影响geotile_grid聚合的初始计算量,避免了调整geotile_grid的size带来的性能开销;
  • 若需获取每个tile的具体距离值,可以额外添加一个script_metric聚合来存储计算出的距离。

内容的提问来源于stack exchange,提问作者phuc16102001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:22