Elasticsearch Geotile聚合:size限制下按距离筛选近邻分组的方案
Elasticsearch Geotile聚合保留最近分组解决方案
要实现仅保留离指定点最近的Geotile分组,无需调整geotile_grid的默认size,可以通过**bucket_sort聚合结合脚本计算距离**来过滤排序后的bucket,具体实现如下:
核心思路
- 先用
geo_bounding_box过滤目标区域内的文档,减少聚合计算量; - 执行
geotile_grid聚合生成初始tile分组; - 通过
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
相关产品推荐
相关产品推荐

