Elasticsearch groupby查询

时间:2017-11-22 05:45:10

标签: tsql elasticsearch

我在其中一个elasticsearch索引中有这个映射: {FirmID,UserID,ShareID}

数据是这样的:

FirmID  UserID  ShareID
f1      u1      1
f1      u1      2
f1      u2      3
f1      u2      4
f2      u3      5
f2      u3      6
f2      u3      7
f2      u4      8
f3      u5      9
f3      u5      10

我想获得每个公司中每个用户的FirmID,UserID,Last Share ID(最大值),份额数。 TSql查询如下:

select FirmID, 
UserID, 
Max(ShareID) as LastShareID,
Count(ShareID) as NumberOfShares
from tblShares
group by FirmID, UserID

FirmID  UserID  LastShareID NumberOfShares
f1      u1      2           2
f1      u2      4           2
f2      u3      7           3
f2      u4      8           1
f3      u5      10          2

但我需要生成elasticsearch查询。任何人都可以在ES中给我正确的查询以获得相同的结果吗?

1 个答案:

答案 0 :(得分:0)

首先,您需要为您的类型定义映射。由于您希望在字符串字段上执行聚合,因此您需要将它们定义为关键字

{
   "mappings": {
     "mytype": {
       "properties": {
         "firmId": { 
           "type": "keyword"
          },
          "userId": {
           "type": "keyword"
          }
        }
      }
    }
  }
}

然后您可以索引数据。来自sql的多个字段分组可以作为Elasticsearch中的嵌套聚合来实现。所以firstId的第一级组,userId的第二级组,然后我们需要添加一些指标。文档计数是开箱即用的,因此我们只需要添加 max 聚合。所以整个查询应该如下所示:

{
  "aggs": {
    "firm_agg": {
      "terms": {
        "field": "firmId"
      },
       "aggs": {
        "user_agg": {
          "terms": {
            "field": "userId"
          },
          "aggs" : {
            "last_share_id" : { "max" : { "field" : "shareId" } }
           }
        }
      }
    }
  }
}

您的结果将被嵌套,因此在f1存储桶中,将有u1和u2,依此类推。

{
   "aggregations":{
      "firm_agg":{
         "doc_count_error_upper_bound":0,
         "sum_other_doc_count":0,
         "buckets":[
            {
               "key":"f1",
               "doc_count":4,
               "user_agg":{
                  "doc_count_error_upper_bound":0,
                  "sum_other_doc_count":0,
                  "buckets":[
                     {
                        "key":"u1",
                        "doc_count":1,
                        "last_share_id":{
                           "value":2.0
                        }
                     },
                     {
                        "key":"u2",
                        "doc_count":1,
                        "last_share_id":{
                           "value":4.0
                        }
                     }
                  ]
               }

   ...
}