【问题标题】:How to output in ElasticSearch distance for same location that chosen by geo_distance from multiple locations如何以 ElasticSearch 距离输出由 geo_distance 从多个位置选择的相同位置
【发布时间】:2017-03-31 08:47:42
【问题描述】:

我有多个地点:

  • 文档 1 -

    “联系人”:[ { “地址”: { “地理位置”:{ “隆”:-73.5409, “纬度”:41.2512 } } } ]

  • 文档 2 -

    {“联系人”:[ { “地址”: { “地理位置”:{ “隆”:-73.7055, “纬度”:40.6744 } } }, { “地址”: [ { “地理位置”:{ “隆”:-73.9325, “纬度”:40.7482 } }, { “地理位置”:{ “隆”:-87.9921, “纬度”:42.9959 } }, { “地理位置”:{ “隆”:-95.4563, “纬度”:29.8775 } } ] } ] }

geo_distance 按最近的位置查找两个文档。

"geo_distance": {
"distance": "275mi",
"distance_type": "plane",
"contact.address.geolocation": {
    "lat": 42,
    "lon": -71
    },
"unit": "mi"
}

}

但是当我添加脚本字段以输出纬度、经度和距离时

"script_fields": {
"distance_value": {
    "script": "doc.containsKey('contact.address.geolocation') ? doc['contact.address.geolocation'].value ? doc['contact.address.geolocation'].arcDistanceInMiles(42.2882,-71.0474)  : null : null"
    },
"geolocation": {
    "script": "doc.containsKey('contact.address.geolocation') ? doc['contact.address.geolocation'].value : null"
    }
}

它从文档 2 中输出随机地理位置元素。 对于文件 1,它是 147 英里 但是对于文档 2,它是 1601 英里,因为它与 geo_distance 过滤器中的位置不同。

如何打印与 geo_distance 中相同的值?我想显示我的观点的距离。

我试过这个脚本:

"script_fields": {
"distance_value": {
    "script": "if (doc.containsKey('contact.address.geolocation')==false) return null; min = 40000; for(e in doc['contact.address.geolocation']){ c=0; if(e!=null) c = e.arcDistanceInMiles(42.2882,-71.0474); if(c<min) min=c;}; return min;"
    }
}

它给出了错误 没有方法签名:org.elasticsearch.common.geo.GeoPoint.arcDistanceInMiles() 适用于参数类型:(java.lang.Double, java.lang.Double) 此外,我认为它不会遍历所有地理定位字段。

【问题讨论】:

  • 它是这样工作的,因为您的 contact 字段没有嵌套,因此在地理位置地址中没有“顺序”,其中一个匹配,但脚本将采用第一个执行计算。您需要遍历每个位置并按距离对其进行排序。
  • 我尝试在脚本中迭代以计算所有距离,但它对我不起作用。你能帮忙举个脚本的例子吗?我无法在任何地方找到这样的人。谢谢。
  • 用您想出的新脚本更新您的问题,我们将从那里开始
  • 为什么突然有resume字段?
  • 这是错字。对不起。固定。

标签: elasticsearch groovy geolocation


【解决方案1】:

我发现只有一种方法可以输出与过滤器中相同的距离 - 添加“排序”元素:

"sort": [ 
    "_score",
    {
        "_geo_distance": {
            "contact.address.geolocation": [
                 -71,
                 42
            ],
        "order": "asc",
        "unit": "mi"
        }
    }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 2013-03-07
    • 1970-01-01
    • 2017-04-20
    • 2012-08-18
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多