gpt4 book ai didi

elasticsearch - 计算多值字段位置的距离

转载 作者:行者123 更新时间:2023-11-29 02:55:18 24 4
gpt4 key购买 nike

在我的 ElasticSearch 索引中,location 是一个 MultiValueField。当我为涉及位置的文档编写自定义评分公式时,我希望脚本选择最接近查询点的位置。

所以,我有我的评分公式的这一部分:

...
if (!doc['location'].empty && doc['location'].values.length > 1) {
least_distance = 10000;
foreach (loc_index: doc['location'].values) {
temp_distance = loc_index.distance(lat, lng);
if (temp_distance < least_distance) {
least_distance = temp_distance;
}
...

这不是最优雅的(我是 mvel 和 ES 的新手),但从概念上讲,我首先检查 doc['location'] 是否确实有多个位置,如果有,则通过每个位置计算距离,并跟踪到目前为止找到的最小距离。

当我这样做时,ElasticSearch 返回错误:

Query Failed [Failed to execute main query]]; nested: PropertyAccessException[[Error: unable to resolve method: org.elasticsearch.common.geo.GeoPoint.distance(java.lang.Double, java.lang.Double)

我认为这意味着它不想在 GeoPoint 上执行 .distance(),出于某种原因,这与我通过执行 doc['location'] 可能获得的字段不同。

我对这种情况的解释是否正确,有人知道解决方法吗?有没有一种方法可以使用 ElasticSearch 仅计算距离(理想情况下无需实际计算两个坐标之间的距离的所有算术)?

最佳答案

这里的问题是调用 .values 会给出 GeoPoint() 对象的列表。有一个解决方法,尽管我们需要做一些额外的工作来引入适当的 Java 类。我们需要两个点的纬度和经度。

import org.elasticsearch.common.geo.GeoDistance;   
import org.elasticsearch.common.unit.DistanceUnit;
base_point = doc['base_location'].value;

if (!doc['location'].empty && doc['location'].values.length > 1) {
foreach (loc_index: doc['location'].values) {
distance = GeoDistance.PLANE.calculate(loc_index.lat, loc_index.lon, base_point.lat, base_point.lon, DistanceUnit.MILES);
}
}

我们可以得到可枚举 here 描述的不同单位的结果.我们还可以使用不同的计算方法(如 ARC),描述 here .

关于elasticsearch - 计算多值字段位置的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20959712/

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