适用于Elasticsearch文档中字段总和的常规脚本

时间:2016-05-26 15:33:03

标签: elasticsearch groovy

这个问题是this question的后续问题。

如果我的文件是这样的话:

{"documentid":1,
"documentStats":[ {"foo_1_1":1}, {"foo_2_1":5}, {"boo_1_1":3} ]
}

在script_field中使用的正确groovy脚本是什么,用于返回与特定模式匹配的每个文档的所有documentStats的总和(例如,包含_1_

2 个答案:

答案 0 :(得分:1)

我不知道ES,但在纯粹的Groovy中你会这样做:

document.documentStats.collectMany { Map entry ->
  // assumes each entry has a single key and a single int value
  def item = entry.entrySet()[0]
  item.key.contains('_1_') ? [item.value] : []
}.sum()

希望这有帮助。

答案 1 :(得分:1)

与提到的问题类似,有一个单行程与你的新结构做同样的事情:

{
    "query" : {
        ...
    },
    "script_fields" : {
        "sum" : {
            "script" : "_source.documentStats.findAll{ it.keySet()[0] =~'_1_' }.collect{it.values()}.flatten().sum()"
        }
    }
}