elasticsearch中使用scripted_metric进行排序

发布于 2022-09-12 12:56:03 字数 1415 浏览 15 评论 0

一个用户拥有id,mobile,nickname以及一个huanbi数组。现在已经可以通过scripted_metric将符合条件的huanbi数据汇总到一起,但是在最终reduce阶段的时候尝试进行排序未得到想要的结果,虽然使用java脚本指定要求排序,但是最终出来的结果依旧是乱序,望大神指点迷津。(mapping及代码在下面)

mapping:

{
  "dgcrm-allinone" : {
    "mappings" : {
      "properties" : {
        "huanbi" : {
          "type" : "nested",
          "properties" : {
            "evaluation" : {
              "type" : "keyword"
            },
            "finalizationScore" : {
              "type" : "integer"
            },
            "id" : {
              "type" : "integer"
            },
            "sumScore" : {
              "type" : "integer"
            }
          }
        },
        "id" : {
          "type" : "long"
        },
        "mobile" : {
          "type" : "keyword"
        },
        "nickname" : {
          "type" : "keyword"
        }
      }
    }
  }
}

脚本如下:
POST /dgcrm-allinone/_search?filter_path=aggregations

{
  "aggs":{
    "allHuanbi":{
      "scripted_metric": {
        "init_script": "state.huanbi=new ArrayList();",
        "map_script": "for(item in params._source.huanbi){state.huanbi.add(item);}",
        "combine_script": "return state;", 
        "reduce_script": "ArrayList finalResult = new ArrayList();for(s in states){finalResult.add(s)}Collections.sort(finalResult, Collections.reverseOrder());return finalResult;"
      }
    }
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮萍、无处依 2022-09-19 12:56:03

还是我自己来吧.

{
  "aggs":{
    "allHuanbi":{
      "scripted_metric": {
        "init_script": "state.huanbi=[]",
        "map_script": "for(item in params._source.huanbi){state.huanbi.add(item);}",
        "combine_script": "return state.huanbi", 
        "reduce_script": "ArrayList huanbis=new ArrayList();for(stateI in states){for(s in stateI){huanbis.add(s)}}huanbis.sort(Comparator.comparing(h->h.get('id'), Comparator.nullsLast(Comparator.naturalOrder())));return huanbis;"
      }
    }
  }
}

如果想逆序排列的话要么把naturalOrder改成reverseOrder,还有一种就是把naturalOrder()变成naturalOrder().reversed()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文