在scripted_metric

时间:2019-02-19 14:54:55

标签: elasticsearch elasticsearch-aggregation

有什么办法可以从scripted_metric中获取存储桶的密钥? 我遇到一个问题,我需要从正在汇总的文档中获取一些特定数据。

例如,这是我正在处理的文档的示例:

{
    "attr1": "thing",
    "groups": [
        {
            "id": 1,
            "name": "foo"
        },
        {
            "id": 2,
            "name": "bar"
        },
        {
            "id": 3,
            "name": "baz"
        }
    ],
    "otherAttrs": true
}

图1 (文档结构)

我正在对不同的组ID进行术语汇总,但是在每个存储桶中,我想放置由bucket_key表示的组的名称(即ID)。

这是我正在使用的术语聚合的示例:

{
    "terms": {
        "execution_hint": "global_ordinals_hash",
        "field": "actors.groups.id",
        "min_doc_count": 1
    }
}

图2 (用于创建存储桶的术语聚合,我试图将名称设置为字段)

因此理想情况下,我的回复应如下所示:

{
    "...": "...",
    "buckets" : [
        {
            "key" : 1,
            "group_name": "foo",
            "doc_count" : 42684,
            "measure 0" : {
                "value" : 37180
            },
            "measure 3" : {
                "doc_count" : 37180,
                "measure 3" : { "value" : 68 }
            },
            "measure 4" : {
                "doc_count" : 3008,
                "measure 4" : {
                    "value" : 3008
                }
            }
        }
    ]
}

图3 (理想响应格式)

请注意,键与图1中的名称如何对应

因此,我目前正在收到类似于图3的响应(没有group_name),而且我一生都无法弄清楚如何提取名称字段,因为它位于要聚合的文档中。

由于我正在使用的文档的性质,这必须在存储桶聚合中发生,但是此属性不是聚合,它只是我需要从一个文档中提取的一个指标。

所以我解决这个问题的尝试是使用scripted_metric:

{
    "...":"...",
    "group_name": {
        "scripted_metric": {
            "map_script": {
                "lang": "painless",
                "source": """

                for (HashMap group : params._source.actor.groups) {
                    String groupId = < bucket_key_here >;
                    if (groupId != null && !groupId.isEmpty()) {
                        params._aggs.name = params._source.actor.groups[groupId].name;
                    }
                }

                """
            },
            "reduce_script": {
                "lang": "painless",
                "source": "return params._aggs.length > 0 ? params._aggs[0].name : null;"
            }
        }
    },
    "...":"..."
}

图4 (当前尝试使用scripted_metric来调出组名)

我无法弄清楚如何访问存储桶的键值,这意味着即使我使用_source访问要聚合的文档的JSON结构,也无法看到存储桶以确定哪个组是正确的名称。

>

在图1中注意,一个文档可能包含多个组。因此,我需要能够引用该键,以匹配相应ID中的名称。

请让我知道是否可以澄清或阐述任何使该问题更明确的内容。

致谢

0 个答案:

没有答案