2017-11-22 23 views
0

: {FirmID、ユーザーID、ShareID}ElasticsearchのGROUPBYクエリ

データは、このようなものです:

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(max)、各企業の各ユーザーのシェア数。 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で正しい結果を得るための正しいクエリを与えることができますか?

答えて

0

まず、タイプのマッピングを定義する必要があります。 文字列フィールドで集計を実行する場合は、キーワードとして定義する必要があります。

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

次に、データのインデックスを作成できます。 SQLからの複数のフィールドグループは、Elasticsearchでネストされた集約として実現できます。だから、firmIdの第1レベルのグループ、userIdの第2レベルのグループ、そしていくつかの指標を追加する必要があります。文書数はボックスの外に記載されているので、最大集約を追加するだけです。だから、全体のクエリは次のようになります。

{ 
    "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 
         } 
        } 
        ] 
       } 

    ... 
}