我在elasticsearch
中有一些数据,我发现很难创建我需要获取某些数据的查询。
我的数据组织方式如此(如果我以csv
格式显示):
campaignid, sellerid, action
A, mike, sell
A, mike, buy
A, mike, buy
A, joe, sell
A, joe, sell
A, joe, sell
B, mike, sell
B, mike, sell
B, mike, sell
B, alice, buy
B, alice, buy
我想得到这个结果集:
campaignid, sellerid, sales, buys
A, mike, 1, 2
A, joe, 3, 0
B, mike, 3, 0
B, alice, 0, 2
在我熟悉的SQL
中,我会将其写为:
SELECT campaignid, sellerid, SUM(CASE WHEN action='sell' THEN 1 ELSE 0 END) as sales, SUM(CASE WHEN action='buy' THEN 1 ELSE 0 END) as buys
GROUP BY campaignid, sellerid
我很难在弹性搜索中获得相同的效果。我已经设法使用this page的帮助按组计算数据。
但我迷失了如何获得我想要的数据(事情的总和情况)。这就是我想出的:
GET _search
{
"size": 0,
"aggs": {
"group_by_campaignid": {
"terms": {
"field": "campaignid"
},
"aggs": {
"group_by_sellerid": {
"terms": {
"field": "sellerid"
}
}
}
}
}
}
任何人都可以帮忙写出我想要的查询吗?感谢。
答案 0 :(得分:0)
因此,解决方案是使用脚本。首先,在elasticsearch.yaml
文件中启用脚本:
script.engine.groovy.inline.aggs: on
然后,可以在脚本值上使用sum
运算符。例如,这相当于sum
中case/when
结果语句的sql
(仅在字段值等于某事时才总结,在此示例中,我想要仅汇总Chrome浏览器的实例):
GET _search
{
"size": 0,
"aggs": {
"group_by_browser": {
"terms": {
"field": "browser"
},"aggs" : {
"intraday_return" : { "sum" : { "script" : "doc['browser'].value == 'chrome' ? 1 : 0" } }
}
}
}
}