집계 API
로그 : 한줄한줄 쌓이는 로그 페턴을
장애가 많이 일어나는 항목이 어디인지, ex 채소를 클ㄹ릭하게 되면 uri가 변함 (숫자)
그렇게 들어가는 시간을 로그로 기록하게 된다면 특정번호에 접속할 때 많은 시간이 걸리는 부분을 확인하고
속도를 향상시키는 작업을 할 수 있다.
메트릭스 : 지표표시
집계 API종류
엘라스틱서치의 집계는 크게 메트릭(metric) 집계(총합, 평균, 최소값, 최대값), 버킷(bucket) 집계(구간별로 구간의 대표값을 도출), 파이프라인 집계(특정 상황에 고정해놓고 메트릭 확인)로 분류되며, 집계의 대상을 추려낼 검색 조건을 검색 API에 담은 뒤 집계 조건을 추가해서 호출하는 방식으로 작동합니다.
- 메트릭 집계
- 문서에 대한 산술적인 연산을 수행: avg, max, min, sum 등
# 1. 메트릭 집계
GET kibana_sample_data_ecommerce/_search
{
"size": 0, // 결과 중에 n개만 보여주는 역할
"query": {
"term": {
"currency": {
"value": "EUR"
}
}
},
"aggs": {
"세금 포함 합계": {
"sum": { //실제 수행 할 집계의 종류
"field": "taxful_total_price"
}
},
"세금 포함 평균": {
"avg": {
"field": "taxful_total_price"
}
},
"세금 불포험 평균": {
"avg": {
"field": "taxless_total_price"
}
}
}
}
GET kibana_sample_data_ecommerce/_search
{
"size": 0, # 결과 중에 n개만 보여주는 역할
"query": {
"term": {
"currency": {
"value": "EUR"
}
}
},
"aggs": {
"my-sum-aggregation-name": {
"sum": {
"field": "taxless_total_price"
}
}
}
}
# stats - 지정한 필드의 평균, 최댓값, 최솟값, 합, 개수를 모두 계산해서 반환
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"term": {
"currency": {
"value": "EUR"
}
}
},
"aggs": {
"my-stats-aggregation-name": {
"stats": {
"field": "taxless_total_price"
}
}
}
}
# "extended_stats": 집계된 document에서 Numerical field에 대한 모든 통계값을 생성
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"term": {
"currency": {
"value": "EUR"
}
}
},
"aggs": {
"my-stats-aggregation-name": {
"extended_stats": {
"field": "taxless_total_price"
}
}
}
}
# cardinality - 지정한 필드가 가진 고유한 값의 개수를 계산해 반환한다.
# HyperLogLog++ 알고리즘 을 사용해 추정한 근사값이다.
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"term": {
"currency": {
"value": "EUR"
}
}
},
"aggs": {
"my-cardinality-aggregation-name": {
"cardinality": {
"field": "customer_id",
"precision_threshold": 3000
}
}
}
}
# percentiles, percentile_ranks
# 전체고객의 백분위를 보여줌
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"term": {
"currency": {
"value": "EUR"
}
}
},
"aggs": {
"my-cardinality-aggregation-name": {
"percentiles": {
"field": "taxless_total_price"
}
}
}
}
# 수치화된 데이터를 백분율로 환산
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"term": {
"currency": {
"value": "EUR"
}
}
},
"aggs": {
"my-cardinality-aggregation-name": {
"percentile_ranks": {
"field": "taxless_total_price",
"values": [50,180]
}
}
}
}
# meta
# meta tag를 이용해 request 시 집계에 대한 추가 데이터를 추가할 수 있다.
# 그리고 response 시 이 데이터를 얻을 수 있다.
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"term": {
"currency": {
"value": "EUR"
}
}
},
"aggs": {
"my-stats-aggregation-name": {
"extended_stats": {
"field": "taxless_total_price"
},
"meta": {
"dsc" : "taxless_total_price에 대한 통계량"
}
}
}
}
고유값 : 겹치지 않는 값
보조인덱스 : 카디널리티가 높은 사람
HyperLogLog++ 대충대충 살펴보면서 띄엄띄엄 살펴봄 : 시간을 절약
대용량데이터 중심으로 작동하기 대문에 전체탐색은 되도록 '지양'
'고유값'을 찾아도 완전 고유값이 아니라
ex 과자 10개정도 나누어~ 하고 10개 나눈후 3종류가 남으면 ㅇㅇ
근사치를 출력합니다.
threshold를 높일 수록 더 상세한 결과 값.
# cardinality - 지정한 필드가 가진 고유한 값의 개수를 계산해 반환한다.
# HyperLogLog++ 알고리즘 을 사용해 추정한 근사값이다.
# 대용량 데이터 중심으로 작동하기 때문에 전체 탐색은 되도록 '지양'합니다.
# '고유값'을 찾아도 완전 고유값이 아니라 근사치를 출력합니다.
# precision_threshold : 탐색을 위해 사용하는 메모리 용량 - 값이 클 수록 더 상세한 결과값이 나옵니다.
- bank의 모든 고객수는 몇 명인가요?
- bank들 중에서 최소 고객을 보유한 은행의 고객 수는 몇 명인가요? 은행은 어디인지도 같이 적어주세요.
- 불광지역에 있는 모든 은행들을 검색해보세요.
- 불광지역에 있는 모든 은행 고객수를 합하면 몇 명인가요?
bank의 모든 고객수는 몇 명인가요?
//sum
//전체검색 + sum
GET bank/_search
{
"query": {
"match_all": {}
},
"size" : 0, //앞에 거슬리는거 제거
"aggs": {
"bank의 모든고객수": {
"sum": {
"field": "customers"
}
}
}
}
bank들 중에서 최소 고객을 보유한 은행의 고객 수는 몇 명인가요?
GET bank/_search
{
"query": {
"match_all": {}
},
"size" : 0,
"aggs": {
"bank의 최소 고객수":{
"min": {
"field": "customers"
}
}
}
}
//은행은 어디인지도 같이 적어주세요.
GET bank/_search
{
"query": {
"match_all": {}
},
"size" : 0,
"aggs": {
"bank의 최소 고객수":{
"min": {
"field": "customers"
}
}
}
}
GET bank/_search
{
"query": {
"match": {
"customers": 100
}
}
}
//불광지역에 있는 모든 은행들을 검색해보세요.
GET bank/_search
{
"query": {
"match": {
"location": "불광"
}
}
}
//불광지역에 있는 모든 은행 고객수를 합하면 몇 명인가요?
GET bank/_search
{
"query": {
"match": {
"location": "불광"
}
},
"size":0,
"aggs": {
"불광 지역 모든 고객 수": {
"sum": {
"field": "customers"
}
}
}
}
# 불광지역에 있는 가장 고객이 적은 은행의 고객수, 모든 은행 고객수 - 1개의 응답으로 받아주세요
GET bank/_search
{
"size": 0,
"query": {
"match": {
"location": "불광"
}
},
"aggs": {
"불광 지역 모든 고객 수": {
"sum": {
"field": "customers"
}
},
"불광 지역 적은 고객 수": {
"min": {
"field": "customers"
}
}
}
}
# 집계 -> 해당 결과를 바탕으로 검색
# 1. 전체 은행 중에 방문고객이 상위 25% 이상인 은행들은 어디일까요?
GET bank/_search
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"상위 25% 이상 방문 고객을 가진 은행의 방문 고객 수": {
"percentiles": {
"field": "customers",
"percents": [
75
]
}
}
}
}
# 3964.25
# 범위(range)는 bool 쿼리 - must/must_not/should/filter 등의 API로 값을 검색
GET bank/_search
{
"query": {
"match": {
"customers": {
"gte" : 3964.25
}
}
}
}
GET bank/_search
{
"query": {
"bool": {
"must": [
{"range": {
"customers": {
"gte": 3964.25
}
}}
]
}
}
}
# 2. 5000명정도 방문하는 은행은 전체 점포 중 몇퍼센트 정도의 위치를 점하고 있을까요?
GET bank/_search
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"5000명 이상 방문 고객을 가진 은행의 방문 고객 수": {
"percentile_ranks": {
"field": "customers",
"values": [ 5000 ]
}
}
}
}
# 어느어느 은행인지도 찾아주세요.
GET bank/_search
{
"query": {
"bool": {
"must": [
{"range": {
"customers": {
"gte": 5000
}
}}
]
}
}
}
# 버킷집계 - 특정 구간을 전체로 쪼개서 경향성을 확인
# from -> 이상, (개구간), to -> 미만 (폐구간)
GET kibana_sample_data_flights/_search
GET kibana_sample_data_flights/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"distance-kilometers-range": {
"range": {
"field": "DistanceKilometers",
"ranges": [
{
"to": 5000
},
{
"from": 5000,
"to": 10000
},
{
"from": 10000
}
]
},
"aggs": {
"average-ticket-price": {
"avg": {
"field": "AvgTicketPrice"
}
}
}
}
}
}
# date_range 집계는 range 집계와 유사하나 date 타입 필드를 대상으로 사용한다는 점,
# from과 to에 간단한 날짜 시간 계산식을 사용할 수 있다는 점이 차이가 있습니다.
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"date-range-aggs": {
"date_range": {
"field": "order_date",
"ranges": [
{
"to": "now-10d/d"
},
{
"from": "now-10d/d",
"to": "now"
},
{
"from": "now"
}
]
}
}
}
}
# histogram 집계는 지정한 필드의 값을 기준으로 버킷을 나눈다는 점에서
# range 집계와 유사합니다.
# 다른 점은 버킷 구분의 경계 기준값을 직접 지정하는 것이 아니라
# 버킷의 간격을 지정해서 경계를 나눈다는 점입니다.
GET kibana_sample_data_flights/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"my-histogram": {
"histogram": {
"field": "DistanceKilometers",
"interval": 1000
}
}
}
}
# interval을 지정하면 해당 필드의 최솟값과 최댓값을 확인한 후
# 그 사이를 interval에 지정한 간격으로 쪼개서 버킷을 나눕니다.
# 특별히 지정하지 않으면 기본적으로 0을 기준으로 히스토그램의 계급을 나눕니다.
# 즉 interval이 1000이면 계급 구간은 [0, 1000), [1000, 2000), [2000, 3000) 등으로 생성됩니다.
# 이 위치를 조정하고 싶을 때는 offset을 사용할 수 있습니다.
GET kibana_sample_data_flights/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"my-histogram": {
"histogram": {
"field": "DistanceKilometers",
"interval": 1000,
"offset": 50
}
}
}
}
# 데이터 특성상 음수 데이터는 존재하지 않지만 구간을 나누는 기준 offset이 50이고
# interval이 1000이므로 [0, 50) 사이의 데이터가 소속되는 구간은 [-950, 50) 구간이 됩니다.
# calendar_interval에는 다음과 같은 값들을 지정할 수 있습니다.
# minute 또는 1m : 분 단위
# hour 또는 1h : 시간 단위
# day 또는 1d : 일 단위
# month 또는 1M : 월 단위
# quarter 또는 1q : 분기 단위
# year 또는 1y : 연 단위
# 각 구간에 평균 "field": "taxless_total_price"을 찾아서 코드를 완성해주세요
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"my-date-histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day"
}
}
}
}
#customers 수가 100명 이상 152명 미만인 구간의 문서를 검색해세요.
# 구간을 나누어서 버킷집계 하는 방법
# 1. range - 우리가 범위 설정
# 2. histogram - 구간의 간격만 설정
GET bank/_search
{
"size": 0,
"aggs": {
"100명이상 152명 미만": {
"range": {
"field": "customers",
"ranges": [
{
"from": 100,
"to": 152
}
]
}
}
}
}
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"customers": {
"gte": 100,
"lt": 152
}
}
}
]
} //범위는 match가 아니라 bool
}
}
# ??? 그냥 첨부터 밑에꺼 해도 되지 않나?
#500명 단위로 구간을 나누어서 숫자 범위로 문서 검색를 검색해보세요.
GET bank/_search
{
"size": 0,
"aggs": {
"500명 단위 고객수 구분": {
"histogram": {
"field": "customers",
"interval": 500,
"offset": 50
}
}
}
}
#월별로 구간을 나누어 검색해보세요.
1. date_range - 직접지정
2. date_histogram - calender_interval 1m
GET bank/_search
{
"size": 0,
"aggs": {
"개점월별 검색구간": {
"date_histogram": {
"field": "date",
"calendar_interval": "1M"
}
}
}
}
# date_histogram - calender_interval 1y
#년도별로 구간을 나누어 검색해보세요.
GET bank/_search
{
"size": 0,
"aggs": {
"연도별검색구간": {
"date_range": {
"field": "date",
"ranges": [
{
"from": "now-8y/d",
"to": "now-7y/d"
},
{
"from": "now-7y/d",
"to": "now-6y/d"
},
{
"from": "now-5y/d",
"to": "now-3y/d"
},
{
"from": "now-3y/d",
"to": "now"
}
]
}
}
}
}
GET bank/_search
{
"size": 0,
"aggs": {
"연도별 검색구간": {
"date_histogram": {
"field": "date",
"calendar_interval": "1y",
"format": "YY"
}
}
}
}
- 예시
- 가장 많이 접속하는 사용자 알아낼 수 있음
- 국가별로 어느 정도의 빈도로 서버에 접속하는지 등의 집계 수행 가능
Composite
1. 조회
2. 집계
3. 정렬
4. 필터링
pipeline (정수장)
1. 조회
2. 집계
3. 재집계
- 평균-total-quantitiy
- cumulative_sum 집계 (pipeline 집계) cumulative_sum 집계는 다른 집계의 값을 누적하여 합산합니다. buckets_path로 누적 합산할 집계의 이름을 지정합니다
# terms 집계는 각 샤드에서 size 개수만큼 term을 뽑아 빈도수를 셉니다.
# 버킷을 최대 몇 개까지 생성할 것인지를 size로 지정합니다.
GET kibana_sample_data_logs/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"my-terms-aggs": {
"terms": {
"field": "host.keyword",
"size": 10
}
}
}
}
GET kibana_sample_data_logs/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"composite-aggs": {
"composite": {
"size": 100,
"sources": [
{
"terms-aggs": {
"terms": {
"field": "host.keyword"
}
}
},
{
"date-histogram-aggs": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "day"
}
}
}
]
}
}
}
}
GET kibana_sample_data_logs/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"composite-aggs": {
"composite": {
"size": 100,
"sources": [
{
"terms-aggs": {
"terms": {
"field": "host.keyword"
}
}
},
{
"date-histogram-aggs": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "day"
}
}
}
],
"after": {
"terms-aggs": "cdn.elastic-elastic-elastic.org",
"date-histogram-aggs": 1675209600000
}
}
}
}
}
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"date-range-aggs": {
"date_range": {
"field": "order_date",
"ranges": [
{
"to": "now-10d/d"
},
{
"from": "now-10d/d",
"to": "now"
},
{
"from": "now"
}
]
},
"aggs": {
"평균 고객수": {
"avg": {
"field": "taxless_total_price"
}
}
}
}
}
}
GET kibana_sample_data_logs/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"합성쿼리": {
"composite": {
"size": 100,
"sources": [
{
"서버빈도별개수세기": {
"terms": {
"field": "host.keyword"
}
}
},
{
"날짜로재정렬": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
}
}
}
]
}
}
}
}
GET kibana_sample_data_logs/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"합성쿼리": {
"composite": {
"size": 100,
"sources": [
{
"서버빈도별개수세기": {
"terms": {
"field": "host.keyword"
}
}
},
{
"날짜로재정렬": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
}
}
}
],
"after": {
"서버빈도별개수세기": "cdn.elastic-elastic-elastic.org",
"날짜로재정렬": "2023-12-29"
}
}
}
}
}
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"daily-timestamp-bucket": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day"
},
"aggs": {
"daily-total-quantity-average": {
"avg": {
"field": "total_quantity"
}
},
"pipeline-sum": {
"cumulative_sum": {
"buckets_path": "daily-total-quantity-average"
}
}
}
}
}
}
POST kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"daily-timestamp-bucket": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day"
},
"aggs": {
"daily-total-quantity-average": {
"avg": {
"field": "total_quantity"
}
}
}
},
"max-total-quantity": {
"max_bucket": {
"buckets_path": "daily-timestamp-bucket>daily-total-quantity-average"
}
}
}
}
POST kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"daily-timestamp-bucket": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day"
},
"aggs": {
"daily-total-quantity-average": {
"avg": {
"field": "total_quantity"
}
}
}
},
"max-total-quantity": {
"max_bucket": {
"buckets_path": "daily-timestamp-bucket>daily-total-quantity-average"
}
}
}
}
위치 키워드 문자열 별로 버킷을 나누어 집계해보세요.
각 은행별로 고객 수를 집계한 다음 하위 집계를 수행해보세요.
각 은행별로 고객 수의 평균을 집계한 다음 하위 집계를 수행해보세요.
각 은행별로 총 고객 수와 고객 수 평균을 모두 집계합니다.
#불광지역에있는 은행당 고객 수
DELETE bank
# 1. 원래 있었던 bank 인덱스를 삭제하고 아래 데이터를 넣어주세요.\
POST /bank/_bulk
{"index":{"_index":"bank", "_id": "1"}}
{"date": "2018-06-01", "bank": "NH농협은행", "branch": "1호점", "location": "종각", "customers": 2314}
{"index":{"_index":"bank", "_id": "2"}}
{"date": "2017-06-01", "bank": "NH농협은행", "branch": "1호점", "location": "강남", "customers": 5412}
{"index":{"_index":"bank", "_id": "3"}}
{"date": "2017-07-10", "bank": "국민은행", "branch": "1호점", "location": "강남", "customers": 2543}
{"index":{"_index":"bank", "_id": "4"}}
{"date": "2018-07-15", "bank": "NH농협은행", "branch": "2호점", "location": "강남", "customers": 4456}
{"index":{"_index":"bank", "_id": "5"}}
{"date": "2019-08-07", "bank": "NH농협은행", "branch": "3호점", "location": "강남", "customers": 1562}
{"index":{"_index":"bank", "_id": "6"}}
{"date": "2020-08-18", "bank": "NH농협은행", "branch": "4호점", "location": "강남", "customers": 5724}
{"index":{"_index":"bank", "_id": "7"}}
{"date": "2020-09-02", "bank": "국민은행", "branch": "1호점", "location": "신촌", "customers": 1002}
{"index":{"_index":"bank", "_id": "8"}}
{"date": "2020-09-11", "bank": "국민은행", "branch": "1호점", "location": "양재", "customers": 4121}
{"index":{"_index":"bank", "_id": "9"}}
{"date": "2020-09-20", "bank": "NH농협은행", "branch": "3호점", "location": "홍제", "customers": 1021}
{"index":{"_index":"bank", "_id": "10"}}
{"date": "2020-10-01", "bank": "국민은행", "branch": "1호점", "location": "불광", "customers": 971}
{"index":{"_index":"bank", "_id": "11"}}
{"date": "2019-06-01", "bank": "NH농협은행", "branch": "2호점", "location": "종각", "customers": 875}
{"index":{"_index":"bank", "_id": "12"}}
{"date": "2018-06-01", "bank": "국민은행", "branch": "2호점", "location": "강남", "customers": 1506}
{"index":{"_index":"bank", "_id": "13"}}
{"date": "2020-09-02", "bank": "국민은행", "branch": "2호점", "location": "신촌", "customers": 3912}
{"index":{"_index":"bank", "_id": "14"}}
{"date": "2020-09-11", "bank": "국민은행", "branch": "2호점", "location": "양재", "customers": 784}
{"index":{"_index":"bank", "_id": "15"}}
{"date": "2020-10-01", "bank": "국민은행", "branch": "2호점", "location": "불광", "customers": 4513}
{"index":{"_index":"bank", "_id": "16"}}
{"date": "2020-10-01", "bank": "국민은행", "branch": "3호점", "location": "불광", "customers": 235}
{"index":{"_index":"bank", "_id": "17"}}
{"date": "2016-07-01", "bank": "기업은행", "branch": "1호점", "location": "불광", "customers": 971}
{"index":{"_index":"bank", "_id": "18"}}
{"date": "2017-10-01", "bank": "기업은행", "branch": "2호점", "location": "불광", "customers": 100}
{"index":{"_index":"bank", "_id": "19"}}
{"date": "2018-11-01", "bank": "기업은행", "branch": "3호점", "location": "불광", "customers": 151}
{"index":{"_index":"bank", "_id": "20"}}
{"date": "2020-10-01", "bank": "기업은행", "branch": "4호점", "location": "불광", "customers": 1302}
GET bank/_mapping
# 위치 키워드 문자열 별로 버킷을 나누어 집계해보세요. (terms)
GET bank/_search
{
"size": 0,
"aggs": {
"위치별 은행 개수": {
"value_count": {
"field": "location.keyword"
}
}
}
}
GET bank/_search
{
"size": 0,
"aggs": {
"위치별 은행 개수": {
"terms": {
"field": "location.keyword"
}
}
}
}
# 각 은행별로 고객 수를 집계한 다음 하위 집계를 수행해보세요.
# 은행별 -> 고객수
GET bank/_search
{
"size": 0,
"aggs": {
"은행별 지점 개수": {
"terms": {
"field": "bank.keyword"
},
"aggs": {
"총 고객 수": {
"sum": {
"field": "customers"
}
}
}
}
}
}
# 각 은행별로 고객 수의 평균을 집계한 다음 하위 집계를 수행해보세요.
GET bank/_search
{
"size": 0,
"aggs": {
"은행별 지점 개수": {
"terms": {
"field": "bank.keyword"
},
"aggs": {
"평균 고객 수": {
"avg": {
"field": "customers"
}
}
}
}
}
}
# 각 은행별로 총 고객 수와 고객 수 평균을 모두 집계합니다.
GET bank/_search
{
"size": 0,
"aggs": {
"은행별 지점 개수": {
"terms": {
"field": "bank.keyword"
},
"aggs": {
"평균 고객 수": {
"avg": {
"field": "customers"
}
},
"총 고객 수": {
"sum": {
"field": "customers"
}
}
}
}
}
}
# 불광 지역에 있는 국민 은행의 은행 당 고객수
# search - 불광 -> 국민은행 -> 고객수
GET bank/_search
{
"query": {
"bool": {
"must": [
{ "match": {
"location": "불광"
}
},
{
"match": {
"bank": "국민은행"
}
}
]
}
},
"size":0,
"aggs": {
"은행별 개수": {
"terms": {
"field": "bank.keyword"
},
"aggs": {
"총 고객 수": {
"sum": {
"field" : "customers"
}
}
}
}
}
}
# 은행의 개점년도 별로 > 은행별 고객수 합
# 1단계 - 은행의 개점년도 별로
GET bank/_search
{
"size": 0,
"aggs": {
"개점년도별 집계": {
"date_histogram": {
"field": "date",
"calendar_interval": "1y",
"format": "yyyy년"
},
"aggs": {
"연도별 은행 고객수": {
"sum": {
"field": "customers"
}
}
}
},
"연간 은행 방문 고객수 총합": {
"max_bucket": {
"buckets_path": "개점년도별 집계>연도별 은행 고객수"
}
}
}
}
# 은행의 개점년도 별로 > 은행별 고객수 합
# 1단계 - 은행의 개점년도 별로
GET bank/_search
{
"size": 0,
"aggs": {
"개점년도별 집계": {
"date_histogram": {
"field": "date",
"calendar_interval": "1y",
"format": "yyyy년"
},
"aggs": {
"연도별 은행 고객수": { "sum": {
"field": "customers"
}
}
}
},
"연간 은행 방문 고객수 총합": {
"max_bucket": {
"buckets_path": "개점년도별 집계>연도별 은행 고객수"
}
}
}
}
키바나를 통한 대시보드 만들기
- 데이터 분석과 시각화 툴(Business intelligence)
- 오픈소스 기반의 데이터 탐색 및 시각화 도구입니다.
- 엘라스틱 관리
- 보안, 스냅샷, 인덱스 관리, 개발자 도구 등을 제공합니다.
- 엘라스틱 중앙 허브
- 모니터링을 비롯해 엘라스틱 솔루션을 탐색하기 위한 포털로 사용할 수 있습니다.
시각화 기능
- 디스커버: 데이터를 도큐먼트 단위로 탐색해 구조와 관계 등을 확인. 데이터를 쿼리하고 필터링할 수 있고, 도큐먼트 구조를 검사할 수 있습니다.
- 시각화: 다양한 그래프 타입으로 데이터를 시각화.
- 대시보드: 그래프, 지도 등을 한 곳에서 확인하면서 다양한 인사이트를 제공.
- 캔버스와 Elasticsearch를 이용한 공항 보안 운영 모니터링
- 캔버스: 그래프와 이미지 등을 프레젠테이션 슬라이드처럼 구성.Canvas Samples (1).pdf
- Canvas: 인포그래픽 스타일의 생생한 프레젠테이션 만들기 | Elastic
- 맵스: 위치 기반 데이터를 지도 위에 표현.
- HOT(자주 불리워짐)
- WARM(그럭저럭 많이 불리워짐)
- COLD(거의 쓰이지 않음)
- FREEZE(사이트 관리 규칙 등 저장은 하고 있어야 하나 별로 불리울 일이 없는 데이터) 4개의 상태로 관리를 합니다
'Tech Stack > Elasticsearch' 카테고리의 다른 글
| 우리 FISA AI엔지니어링 - Elasticsearch - 4 Data view, pip line (0) | 2024.01.02 |
|---|---|
| 우리FISA AI 엔지니어링 Elasticsearch - 2 (1) | 2023.12.28 |
| 우리FISA AI 엔지니어링 Elasticsearch - 1 (1) | 2023.12.27 |