在Elasticsearch中,我知道我可以使用{"fields":["fieldA", "fieldB", ..]}
指定我想从与查询匹配的文档中返回的字段。
但是,如何返回与特定正则表达式匹配的所有字段的总和(作为新字段)?
例如,如果我的文档如下所示:
{"documentid":1,
"documentStats":{
"foo_1_1":1,
"foo_2_1":5,
"boo_1_1:3
}
}
我希望每个文档都匹配_1_
的所有统计信息的总和?
答案 0 :(得分:1)
您可以定义一个名为script_field
的人工字段,其中包含一个小的Groovy脚本,它将为您完成这项工作。
因此,在查询之后,您可以添加script_fields
部分,如下所示:
{
"query" : {
...
},
"script_fields" : {
"sum" : {
"script" : "_source.documentStats.findAll{ it.key =~ '_1_'}.collect{it.value}.sum()"
}
}
}
脚本的作用只是检索名称与documentStats
匹配的_1_
中的所有字段,并将其所有值相加,在这种情况下,您将得到4。
确保elasticsearch.yml
中的enable dynamic scripting并重新启动ES节点,然后再尝试此操作。