0

我有一些数据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

我正在努力在弹性搜索中获得等价物。我已经设法使用此页面的帮助按组计算数据。

但是我不知道如何获取我想要的数据(事情的总和)。这就是我想出的:

GET _search
{
  "size": 0,
  "aggs": {
    "group_by_campaignid": {
      "terms": {
        "field": "campaignid"
      },
      "aggs": {
        "group_by_sellerid": {
          "terms": {
            "field": "sellerid"
          }
        }
      }
    }
  }
}

任何人都可以帮助编写我想要的查询吗?谢谢。

4

1 回答 1

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" } }
    }
    }
  }
}
于 2015-08-13T16:15:42.357 回答