cyb*_*bat 2 elasticsearch elasticsearch-aggregation
我有这个模拟数据,我想对其进行分组,然后只有当状态为 时,它name才有一个字段,该字段是字段total的总和。valuewon
[{
name: 'Foo',
value: 12,
status: 'won'
},
{
name: 'Foo',
value: 2,
status: 'lost'
},
{
name: 'Foo',
value: 10,
status: 'won'
},
{
name: 'Bar',
value: 4,
status: 'won'
}]
Run Code Online (Sandbox Code Playgroud)
我能够按名称分组并获取值字段的总和,但尚未弄清楚如何仅对获胜案例进行求和。
aggs: {
by_name: {
terms: {
field: 'name'
},
aggs: {
total_value: {
sum: {
field: 'value' // What I want is value if status == 'won'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想要的结果应该是这样的:
[{
name: 'Foo',
total_value: 22 // Currently 24
}, {
name: 'Bar',
total_value: 4
}]
Run Code Online (Sandbox Code Playgroud)
这似乎是一个常见的用例,但虽然我找到了很多有关过滤的信息,但不是这个特殊情况。
好的,我找到了两种方法来做到这一点。
ES 支持各种脚本语言,但内置了对Painless的支持:
aggs: {
by_name: {
terms: {
field: 'name'
},
aggs: {
total_value: {
sum: {
script: {
lang: 'painless',
source:doc['status'].value == 'won' ? doc['value'] : 0"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的用例中,我还需要将所有获胜和失败作为单个字段进行总计,以获得更像这样的结果集:
[{
name: 'Foo',
total_won_value: 22,
total_won: 2
total_lost_value: 2,
total_lost: 1
}, {
...
}
Run Code Online (Sandbox Code Playgroud)
虽然这可以通过一些脚本来完成,但我怀疑(这必须经过测试)它通过嵌套聚合来实现这一点的性能更高。
aggs: {
by_name: {
terms: {
field: 'name'
},
aggs: {
by_status: {
terms: {
field: 'status'
},
aggs: {
total_value_by_status: {
sum: {
field: 'value'
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二种方法的缺点是解析结果有点困难,尤其是在 AppSync 模板之类的情况下。
| 归档时间: |
|
| 查看次数: |
4495 次 |
| 最近记录: |