一尘不染

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

elasticsearch

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

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

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

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

我想要_1_每个文档匹配的所有统计信息的总和?


阅读 318

收藏
2020-06-22

共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并重新启动ES节点。

2020-06-22