【问题标题】:Pass a map as a param to an Elasticsearch groovy script将地图作为参数传递给 Elasticsearch groovy 脚本
【发布时间】:2016-03-30 18:20:26
【问题描述】:

我已将用户的纬度/经度作为 Elasticsearch 中文档的字段之一编入索引。现在,最初的要求是按输入距离对用户进行排序,为此,我使用了以下排序:

"sort": [
    {
        "_geo_distance": {
            "user.location": {
                "lat": 39,
                "lon": -83
            },
            "order": "asc",
            "distance_type" : "plane"
        }
    }
]

但是,现在要求已更改,我们已将用户的办公代码添加到索引中。对于其中少数代码,距离是使用 Google 的行驶距离 API(目前在 Elasticsearch 中无法实现)计算的,并且在对用户进行排序时,必须考虑这些行驶距离,而不是 Elasticsearch 计算的距离。

其中一个替代方法是将 user.officecode 的地图和行驶距离作为参数传递给脚本,并在执行距离英里计算之前查找此地图。如果用户的 user.officecode 存在于地图中,则返回它的值,否则继续进行 Elasticsearch 距离计算。

我的问题是,应该以什么格式传入地图。如何在外部构建地图并将其设置为参数。

我正在使用 Elasticsearch 1.7 并使用 Transport Client 连接到 Elasticsearch 集群。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

    标签: elasticsearch groovy params


    【解决方案1】:

    目前,我使用的是以下 Elasticsearch 排序:

    "sort": {
        "_script": {
            "script": "(office_code==null || office_code.isEmpty() || lot_code.indexOf(doc['user.officecode'].value) == -1 || office_code_distance==null || office_code_distance.isEmpty())?(doc[distanceFieldName].isEmpty()?null:(Math.round(doc[distanceFieldName].distanceInMiles(lat,lon)*100)/100.0)):office_code_distance.get(office_code.indexOf(doc['user.officecode'].value))",
            "type": "number",
            "params": {
                "distanceFieldName":"user.location",
                "lat": 39,
                "lon": -83,
                "office_code": ["259000"],
                "office_code_distance": [57]
            },
            "order" : "asc"
        }
    }
    

    不确定这是一个正确的解决方案,但它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2011-09-16
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多