gpt4 book ai didi

ElasticSearch:从 Painless 脚本中的嵌套字段计算 arcDistance

转载 作者:行者123 更新时间:2023-12-02 22:19:13 30 4
gpt4 key购买 nike

我需要在 Painless 脚本中计算弧距,但在这种情况下还没有找到访问地理 API 的方法,即:

  • 第一个点作为参数传递给脚本 - 这意味着我只获得原始值
  • 第二点是从嵌套文档中读取的 - 这意味着我无法使用 doc[myGeoField].value API 读取该字段

在这两种情况下,我都无法实例化一个 org.elasticsearch.index.fielddata.ScriptDocValues.GeoPoints,这将使我能够访问 .arcDistance() 方法.

我也无法使用 org.elasticsearch.common.geo.GeoUtils 类,它不是 whitelisted在无痛中。

是否有任何其他选项可以在脚本中计算弧距?

注意:由于此处解释太长的原因,我必须为这个用例使用脚本 - 在查询/过滤器中执行它不是一个选项。

最佳答案

由于 Elastic 的设计选择不当,您尝试做的事情似乎是不可能的。

我试图做同样的事情(仅使用 planeDistance),并最终在 Painless 中实现了 planeDistance。

arcDistance 和 planeDistance 等方法似乎莫名其妙地在 GeoPoints 中实现了仅类,不在 GeoPoint 中,尽管这会更有意义。此外,这些方法 only work for the first element在 GeoPoints 列表中。

我真的希望有人能纠正我,尽管我对 Painless 的体验一直很痛苦。如果您不希望经常更改它,我建议您使用更成熟的东西,例如 Java 插件。 Painless 调试起来很痛苦,完全没有工具,也没有任何文档。他们还弃用了 Groovy 和 Python,就好像 Painless 是一个不错的替代品一样。

不过,这里是用于完成的以英里为单位的距离代码(planeDistance 的版本,如果您不需要非常精确的距离,请使用它):

double lat1 = location1.lat;
double lon1 = location1.lon;
double lat2 = location2.lat;
double lon2 = location2.lon;
double to_radian = 0.01745329251; /* PI / 180 */
double earth_radius_in_miles = 3959;

double x = (lon2 - lon1) * to_radian * Math.cos((lat2 + lat1) / 2.0 * to_radian);
double y = (lat2 - lat1) * to_radian;
double distanceInMiles = Math.sqrt(x * x + y * y) * earth_radius_in_miles;

关于ElasticSearch:从 Painless 脚本中的嵌套字段计算 arcDistance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43212514/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com