2017-11-22 3 views
0

나는 elasticsearch 지표 중 하나에서이 매핑이 있습니다 {FirmID, 사용자 ID, ShareID}Elasticsearch GROUPBY 쿼리

데이터는이 같은 것입니다 : 나는 FirmID을 얻고 싶은

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 

을, 사용자 ID, 마지막 공유 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에서 올바른 쿼리를 제공하여 동일한 결과를 얻을 수 있습니까?

답변

0

시작하려면 유형에 대한 매핑을 정의해야합니다. 문자열 필드에서 집계를 실행하려면 키워드으로 정의해야합니다.

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

그런 다음 색인을 생성 할 수 있습니다. SQL의 여러 필드 그룹화는 Elasticsearch에서 중첩 집계로 수행 할 수 있습니다. 따라서 firmId의 첫 번째 수준 그룹, userId의 두 번째 수준 그룹, 그리고 몇 가지 메트릭을 추가해야합니다. 문서 수는 즉시 제공되므로 최대 집계 만 추가하면됩니다. 그래서 전체 쿼리는 다음과 같아야합니다, 등등이 U1과 U2 될 것이다 F1 버킷 내부 있도록

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

당신의 결과는 중첩됩니다.

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

    ... 
}