有没有办法使用聚合桶的键
值作为子聚合中的参数?
有一个像这样的索引:
{
"id": 152,
"description": "cool stuff",
"datesWithTotal" : [
{
"date" : "2014-02-02T00:00:00",
"total" : 47.2
},
{
"date" : "2014-02-03T00:00:00",
"total" : 51.2
},
{
"date" : "2014-02-04T00:00:00",
"total" : 56.4
}
]
}
我想执行一个 date_histogram
聚合和一个子聚合,它将根据当前的 parentbucket.key
值执行一些操作
{
"aggs": {
"histo": {
"date_histogram": {
"field": "datesWithTotal.date",
"interval": "1d"
},
"aggs": {
"script-test": {
"scripted_metric": {
"init_script": "_agg['sum'] = 0",
"map_script": "_agg.sum += (PARENTBUCKET.KEY == 'somevalue' ? 1 : 0)",
"combine_script": "return _agg.sum"
}
}
}
}
}
}
我已经以这种方式使用了一些脚本,但每个脚本都没有使用父级的任何内容,只是普通的整数参数。
最佳答案
这只是一个想法。我已经对其进行了快速测试,但无论出于何种原因,都没有输出我认为应该输出的内容。也许它会给你一些进一步的想法,或者你可以让它以我迄今为止无法做到的方式工作:
{
"aggs": {
"histo": {
"date_histogram": {
"field": "datesWithTotal.date",
"interval": "1d"
},
"aggs": {
"doesIncludeDate": {
"terms": {
"script": "new Date(doc[\"datesWithTotal.date\"].value).format(\"yyyy-MM-dd\")",
"valueType": "string",
"include": {
"pattern": "2014-02-04"
}
},
"aggs": {
"script-test": {
"scripted_metric": {
"init_script": "_agg['sum'] = 0",
"map_script": "_agg.sum += 1",
"combine_script": "return _agg.sum"
}
}
}
},
"doesNotIncludeDate": {
"terms": {
"script": "new Date(doc[\"datesWithTotal.date\"].value).format(\"yyyy-MM-dd\")",
"valueType": "string",
"exclude": {
"pattern": "2014-02-04"
}
},
"aggs": {
"script-test": {
"scripted_metric": {
"init_script": "_agg['sum'] = 0",
"map_script": "_agg.sum += 0",
"combine_script": "return _agg.sum"
}
}
}
}
}
}
}
}
我们的想法是使用一个带有include
的terms
聚合和一个带有exclude
的terms
来获得与您的父存储桶键匹配或不匹配的存储桶。对于那些匹配的脚本,请将您的脚本与 _agg.sum += 1
一起使用,对于另一个,请使用 _agg.sum += 0
。
当然,所有这些都是针对您拥有的非常具体的脚本:日期是否为 X。如果脚本更复杂,它将没有用。而且我不认为您可以从脚本访问父 key (或者我还没有找到这样做的方法)。
关于elasticsearch - 使用从父聚合获取的参数的子聚合脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27857512/