在elasticsearch中投影文档中与正则表达式匹配的所有字段的总和

时间:2016-05-25 21:46:54

标签: elasticsearch

在Elasticsearch中,我知道我可以使用{"fields":["fieldA", "fieldB", ..]}指定我想从与查询匹配的文档中返回的字段。

但是,如何返回与特定正则表达式匹配的所有字段的总和(作为新字段)?

例如,如果我的文档如下所示:

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

我希望每个文档都匹配_1_的所有统计信息的总和?

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节点,然后再尝试此操作。