gpt4 book ai didi

Elasticsearch 基于条件求和

转载 作者:行者123 更新时间:2023-12-03 01:26:21 25 4
gpt4 key购买 nike

我有这个模拟数据,我想按 name 分组,然后有一个 total 字段,它是 value 字段的总和 仅当状态为 won

[{
name: 'Foo',
value: 12,
status: 'won'
},
{
name: 'Foo',
value: 2,
status: 'lost'
},
{
name: 'Foo',
value: 10,
status: 'won'
},
{
name: 'Bar',
value: 4,
status: 'won'
}]

我能够按名称分组并获得值字段的总和,但还没有弄清楚如何只对获胜的案例求和。

aggs: {
by_name: {
terms: {
field: 'name'
},
aggs: {
total_value: {
sum: {
field: 'value' // What I want is value if status == 'won'
}
}
}
}

我想要的结果应该是这样的:

[{
name: 'Foo',
total_value: 22 // Currently 24
}, {
name: 'Bar',
total_value: 4
}]

这似乎是一个常见的用例,但虽然我发现了很多关于过滤的信息,但不是这个特殊情况。

最佳答案

好的,我找到了两种方法来做到这一点。

1。使用脚本

ES 支持各种脚本语言,但内置了对 Painless 的支持:

aggs: {
by_name: {
terms: {
field: 'name'
},
aggs: {
total_value: {
sum: {
script: {
lang: 'painless',
source:doc['status'].value == 'won' ? doc['value'] : 0"
}
}
}
}
}

2。使用嵌套分组/聚合

在我的用例中,我还需要将所有赢的和输的作为单个字段加起来,以获得更像这样的结果集:

[{
name: 'Foo',
total_won_value: 22,
total_won: 2
total_lost_value: 2,
total_lost: 1
}, {
...
}

虽然这可以通过一些脚本来完成,但我怀疑(虽然这必须进行测试)使用嵌套聚合来实现它的性能更高。

aggs: {
by_name: {
terms: {
field: 'name'
},
aggs: {
by_status: {
terms: {
field: 'status'
},
aggs: {
total_value_by_status: {
sum: {
field: 'value'
}
}
}
}
}
}
}

第二种方法的缺点是解析结果有点困难,尤其是在 AppSync 模板之类的东西中。

关于Elasticsearch 基于条件求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com