【问题标题】:elasticsearch Query: Sum + Case Equivalent?elasticsearch 查询:Sum + Case Equivalent?
【发布时间】:2015-08-13 15:04:20
【问题描述】:

我在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"
          }
        }
      }
    }
  }
}

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

【问题讨论】:

    标签: mysql sql elasticsearch elastic-stack


    【解决方案1】:

    因此,解决方案是使用脚本。首先,在您的 elasticsearch.yaml 文件中启用脚本:

    script.engine.groovy.inline.aggs: on
    

    然后,可以在脚本值上使用sum 运算符。因此,例如,这将等同于sqlcase/when 结果语句的sum(仅在字段值等于某值时求和,在此示例中,我只想对chrome 浏览器的实例求和):

    GET _search
    {
      "size": 0,
      "aggs": {
        "group_by_browser": {
          "terms": {
            "field": "browser"
          },"aggs" : {
            "intraday_return" : { "sum" : { "script" : "doc['browser'].value == 'chrome' ? 1 : 0" } }
        }
        }
      }
    }
    

    【讨论】:

    • 如果您只想对一系列数字求和,我喜欢这个答案。但是,平均值并不准确,因为 0 仅对分母有贡献。
    猜你喜欢
    • 2014-10-23
    • 2015-07-21
    • 2014-01-22
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多