有什么办法可以从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中的名称。
请让我知道是否可以澄清或阐述任何使该问题更明确的内容。
致谢