带总和的聚合弹性搜索查询

时间:2021-03-10 10:53:36

标签: elasticsearch elasticsearch-5

这是我当前的数据。我想要一个聚合查询以根据输入/输出类型返回数量的变体 ID 总和。

hits: {
   total: {
   value: 5,
   relation: "eq",
   },
   max_score: 1,
   hits: [
   {
       _index: "transactions",
       _type: "_doc",
       _id: "out2391",
       _score: 1,
       _source: {
           date: "2021-03-08",
           transactionId: 2391,
           brandId: 1112,
           outletId: 121222,
           variantId: 1321,
           qty: 1,
           closing: 10,
           type: "out",
       }
   ],
},

我想要返回输入/输出变量数量总和的结果

[{
   variantId: 1321,
   in: sum(qty),
   out: sum(qty)
},
{
   variantId: 13211,
   in: sum(qty),
   out: sum(qty)
}
]

1 个答案:

答案 0 :(得分:1)

提取测试文档

POST test_shaheer/_doc
{
  "date": "2021-03-08",
  "transactionId": 2391,
  "brandId": 1112,
  "outletId": 121222,
  "variantId": 1321,
  "qty": 1,
  "closing": 10,
  "type": "out"
}
POST test_shaheer/_doc
{
  "date": "2021-03-08",
  "transactionId": 2391,
  "brandId": 1112,
  "outletId": 121222,
  "variantId": 1321,
  "qty": 1,
  "closing": 10,
  "type": "out"
}
POST test_shaheer/_doc
{
  "date": "2021-03-08",
  "transactionId": 2391,
  "brandId": 1112,
  "outletId": 121222,
  "variantId": 1321,
  "qty": 5,
  "closing": 10,
  "type": "in"
}
POST test_shaheer/_doc
{
  "date": "2021-03-08",
  "transactionId": 2391,
  "brandId": 1112,
  "outletId": 121222,
  "variantId": 1321,
  "qty": 2,
  "closing": 10,
  "type": "in"
}

要实现您需要的嵌套 aggregations ,首先按变体 ID 分组,然后按类型对每个变体 ID 进行分组,最后对每个类型中的 qty 字段求和。

查询

POST test_shaheer/_search
{
  "size": 0, 
  "aggs": {
    "variant_ids": {
      "terms": {
        "field": "variantId",
        "size": 10
      },
      "aggs": {
        "types": {
          "terms": {
            "field": "type.keyword",
            "size": 10
          },
          "aggs": {
            "qty_sum": {
              "sum": {
                "field": "qty"
              }
            }
          }
        }
      }
    }
  }
}

注意大小 0 不显示结果。

回复

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "variant_ids" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 1321,
          "doc_count" : 4,
          "types" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "in",
                "doc_count" : 2,
                "qty_sum" : {
                  "value" : 7.0
                }
              },
              {
                "key" : "out",
                "doc_count" : 2,
                "qty_sum" : {
                  "value" : 2.0
                }
              }
            ]
          }
        }
      ]
    }
  }
}