OpenSearch 1.0中如何在Painless脚本内计算地理距离(解决distanceInKm方法报错问题)
解决OpenSearch Painless脚本中地理距离计算的报错问题
你遇到的问题是因为旧版本的distanceInKm方法已经不再被OpenSearch的Painless脚本支持了。现在要计算地理坐标之间的距离,需要使用arcDistance或者planeDistance方法,这两个方法返回的是米为单位的距离,如果你需要公里的话,除以1000就可以了。
正确的脚本写法
1. 使用球面距离(更准确,适合长距离)
arcDistance(lat, lon)方法计算的是两点之间的球面距离,这是大多数场景下推荐的方式:
return doc["location"].arcDistance(38.7819, -77.19) / 1000;
2. 使用平面距离(计算更快,适合短距离)
如果你的数据集中的点都集中在一个小区域,也可以用planeDistance(lat, lon),计算速度更快但精度稍低:
return doc["location"].planeDistance(38.7819, -77.19) / 1000;
完整的排序代码块
把正确的脚本替换到你的排序配置里,就像这样:
"sort": { "_script": { "type": "number", "order": "asc", "script": { "source": "return doc[\"location\"].arcDistance(38.7819, -77.19) / 1000;" } } }
为什么之前的代码报错?
你看到的dynamic method [org.opensearch.index.fielddata.ScriptDocValues.GeoPoints, distanceInKm/2] not found错误,是因为OpenSearch更新了Painless脚本的API,旧的distanceInKm方法已经被移除,替换成了以米为单位的arcDistance和planeDistance方法,这样更统一也更灵活(可以自己转换单位)。
内容的提问来源于stack exchange,提问作者Mike Baranczak
相关产品推荐
相关产品推荐

