我希望在弹性的嵌套数组中有一个键/值对的脚本聚合。返回的文件示例如下:
"hits": [
{
"_index": "testdan",
"_type": "year",
"_id": "AVtXirjYuoFS95t7pfkg",
"_score": 1,
"_source": {
"m_iYear": 2006,
"m_iTopicID": 11,
"m_People": [
{
"name": "Petrovic, Rade",
"value": 3.70370364
},
{
"name": "D. Kirovski",
"value": 3.70370364
}
]
}},
{
"_index": "testdan",
"_type": "year",
"_id": "AVtXirjYuoFS95t7pfkg",
"_score": 1,
"_source": {
"m_iYear": 2007,
"m_iTopicID": 11,
"m_People": [
{
"name": "Petrovic, Rade",
"value": 6.70370364
},
{
"name": "D. Kirovski",
"value": 2.70370364
}
]
}}
]
我想在每个文档中聚合m_Person中每个人的平均值,如下所示:
Petrovic,Rade = 3.70370364 + 6.70370364 / 2 = 7.05 D. Kirovski = 3.70370364 + 2.70370364 / 2 = 5.05
平均值的除法应按名称出现的年数计算。例如,一年可能不会只显示一个名称。
如果由于没有人的唯一身份证而更加困难,我计划为每个人添加一个ID,但是你会如何编写脚本呢,而不是返回所有人,并且需要在前面循环 - 最后,我可以有一系列的人和他们的平均数?
答案 0 :(得分:0)
您可以使用Kibana Scripted Fields来实现此类聚合。请参阅示例部分。这假设您使用的是Elasticsearch 5.0,因为脚本语言是无痛的。
答案 1 :(得分:0)
您可以非常轻松地使用嵌套聚合实现此目的。对于每一年,我们将汇总人们的姓名,然后计算每个人的平均价值。
{
"size": 0,
"aggs": {
"years": {
"terms": {
"field": "m_iYear"
},
"aggs": {
"names": {
"nested": {
"path": "m_People"
},
"aggs": {
"names": {
"terms": {
"field": "m_People.name"
},
"aggs": {
"average": {
"avg": {
"field": "m_People.value"
}
}
}
}
}
}
}
}
}
}