집계
06 Mar 2019
집계 쿼리의 형식
POST /<index_name>/<type_name>/_search
{
"aggs": {},
"query": {},
"size": 0
}
query 요소를 명시하지 않으면 집계는 주어진 인덱스와 타입에 있는 모든 도큐먼트를 반환합니다(match_all 쿼리와 같다.). 집계 결과를 얻는 데 관심이 있는 경우, 집계 결과와 함께 결과가 표시되지 않도록 size를 0으로 설정해야합니다.
elasticsearch가 지원하는 집계는 네가지 타입으로 구분할 수 있습니다.
- Bucket 집계
- Metric 집계
- Matrix 집계
- Pipeline 집계
Bucket 집계
Bucket 집계는 컨텍스트에 있는 각 도큐먼트가 어떤 버킷에 속해 있는지 결정해 평가합니다. 개별 버킷 키와 버킷에 속하는 도큐먼트가 있는 버킷 집합을 갖습니다.
- 문자열 데이터
-
Terms 집계
특정 필드에서 고유한 값으로 데이터를 분할하거나 그룹화하는데 유용합니다.
GET bigginsight/userReport/_search { "aggs": { "byCategory": { "terms": { "field": "category", "size": 15 # 반환될 Terms 버킷의 최대 개수 } } }, "size": 0 }
-
- 숫자열 데이터
-
Histogram 집계
데이터를 숫자 필드 기반의 여러 버킷으로 분할할 수 있습니다. 각 분할 범위는 쿼리 입력에 지정할 수 있습니다.
GET bigginsight/_search?size=0 { "aggs": { "byUsage": { "histogram": { "field": "usage", "interval": 1000 # bucket 분할 간격 } } }, "size": 0 }
-
Range 집계
크기가 다른 버킷을 만들 수 있습니다.
GET bigginsight/_search?size=0 { "aggs": { "byUsage": { "range": { "field": "usage", "ranges": [ { "to": 1024 }, { "from": 1024, "to": 102400 }, { "from": 102400 } # { "key": "a", "to": 1024 }, # { "key": "b", "from": 1024, "to": 102400 }, # { "key": "c", "from": 102400 }, ] } } }, "size": 0 }
-
Metric 집계
필드에서 숫자 타닙으로 동작하며, 주어진 컨텍스트에서 숫자 필드의 집계값을 계산하는데 사용합니다.
-
Sum 예시
GET bigginsight/_search { "aggregations": { "download_sum": { "sum": { "field": "downloadTotal" } } }, "size": 0 }
-
Average 집계
GET bigginsight/_search { "aggregations": { "download_average": { "avg": { "field": "downloadTotal" } } }, "size": 0 }
-
Stats 집계
단일 요청에서 도큐먼트의 합계, 평균, 최소, 최대, 개수를 계산합니다.
extended_stats 집계는 stats 집계 결과에 추가 통계 정보를 더해 반환합니다.
GET bigginsight/_search { "aggregations": { "download_stats": { "stats": { "field": "downloadTotal" } } }, "size": 0 }
-
Cardinality 집계
특정 필드의 고유한 값의 개수를 찾는데 유용합니다. 예를 들어 주간, 원간 순 방문자수를 찾을 수 있습니다.
GET bigginsight/_search { "aggregations": { "unique_visitors": { "cardinality": { "field": "username" } } }, "size": 0 }
Matrix 집계
여러 필드에서 동작하고 쿼리 컨텍스트 내의 모든 도큐먼트에 걸쳐 메트릭을 계산합니다.
Pipeline 집계
다른 타입의 집계 결과를 다시 집계할 수 있는 상위 레벨의 집계입니다.
복잡한 집계
필터 데이터 집계
집계를 적용하기 전에 일부 필터를 적용하는 작업을 적용할 수 있습니다.
GET bigginsight/userReport/_search
{
"query": {
"term": {
"customer": "Linkedin"
}
},
"aggs": {
"byCategory": {
"terms": {
"field": "category"
}
}
},
"size": 0
}
중첩 집계
Bucket 집계 안에서 Metric 집계를 중첩해 사용하면 각 버킷 내에서 Metric 집계를 계산할 수 있습니다.
GET bigginsight/userReport/_search
{
"query": {
"bool": {
"must": [
{ "term": { "customer": "Linkedin" }},
{ "range": { "time": { "gte": 1000, "lte": "2000" }}}
]
}
},
"aggs": {
"byUsers": {
"terms": {
"field": "username",
"order": { "total_usage": "desc" }
}
}
"aggs": {
"total_usage": {
"sum": { "field": "usage" }
}
}
},
"size": 0
}
Date Histgram 집계
Date Histogram 집계를 사용해 날짜 필드에 버킷을 만들 수 있습니다.
GET /bigginsight/useageReport/_search?size=0
{
"aggs": {
"counts_over_time": {
"date_histogram": {
"field": "time",
"interval": "1d",
"time_zone": "+505:30" # timezone 설정
}
}
}
}
지리 정보 데이터 버킷팅
-
Geo distance 집계
Geo distance 집계를 사용하면 거리에 대한 버킷을 만들 수 있습니다.
GET bigginsight/usageReport/_search?size=0 { "aggs": { "within_radius": { "geo_distance": { "field": "location", "origin": { "lat": "32.1212", "lon": "32.123223" }, "ranges": [ { "to": 5 } ] } } } }
-
GeoHash grid 집계
GeoHash 시스템은 세계 지도를 다른 정밀도를 가진 직사각형 영역으로 구성된 격자무늬로 분리합니다.
{ "aggs": { "geo_hash": { "geohash_grid": { "field": "location", "precision": 7 # 1 ~ 12(낮을수록 더 넓은 지리학상의 영역을 나타냅니다.) } } } }
Pipeline 집계
다른 집계 결과를 토대로 다시 집계할 수 있습니다.
- Parent Pipeline 집계: 다른 집계 안에 Pipeline 집계를 중첩해 사용
- Sibling Pipeline 집계: Pipeline이 완료된 원본 집계의 형제로 사용