ElasticStack 기본 쿼리 및 집계
step Aggregation —
DELETE bank
PUT bank/_bulk {“index”: {“_id”: “1”}} {“date”: “2019-06-01”, “line”: “1호선”, “station”: “종각”, “passangers”: 2314} {“index”: {“_id”: “2”}} {“date”: “2019-06-01”, “line”: “2호선”, “station”: “강남”, “passangers”: 5412} {“index”: {“_id”: “3”}} {“date”: “2019-07-10”, “line”: “2호선”, “station”: “강남”, “passangers”: 6221} {“index”: {“_id”: “4”}} {“date”: “2019-07-15”, “line”: “2호선”, “station”: “강남”, “passangers”: 6478} {“index”: {“_id”: “5”}} {“date”: “2019-08-07”, “line”: “2호선”, “station”: “강남”, “passangers”: 5821} {“index”: {“_id”: “6”}} {“date”: “2019-08-18”, “line”: “2호선”, “station”: “강남”, “passangers”: 5724} {“index”: {“_id”: “7”}} {“date”: “2019-09-02”, “line”: “2호선”, “station”: “신촌”, “passangers”: 3912} {“index”: {“_id”: “8”}} {“date”: “2019-09-11”, “line”: “3호선”, “station”: “양재”, “passangers”: 4121} {“index”: {“_id”: “9”}} {“date”: “2019-09-20”, “line”: “3호선”, “station”: “홍제”, “passangers”: 1021} {“index”: {“_id”: “10”}} {“date”: “2019-10-01”, “line”: “3호선”, “station”: “불광”, “passangers”: 971}
GET bank/_mapping GET bank/_settings
step Aggregation
DELETE bank
PUT _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/_search/
Metrics 집계
bank의 모든 고객수
bank들 중에서 최소 고객수를 보유한 bank의 고객수
GET bank/_search { “size”: 0, “aggs”: { “all_cust”: { “sum”: { “field”: “customers” } }, “min_bank” : { “min”: { “field”: “customers” } } } }
불광지역에 있는 모든 은행들 검색
GET bank/_search { “query”: { “match”: { “location”: “불광” } } }
불광지역에 있는 모든 은행들의 고객수 검색
GET bank/_search { “size”: 0, “query”: { “match”: { “location”: “불광” } }, “aggs”: { “customers_count”: { “sum”: { “field”: “customers” } } } }
GET bank/_search { “size”: 0, “aggs”: { “cust_status”: { “stats”: { “field”: “customers” } } } }
불광 지역 내에 있는 은행들의 고객수 기초 통계 데이터 검색
GET bank/_search { “size”: 0, “query”: { “match”: { “location”: “불광” } }, “aggs”: { “customers_count”: { “stats”: { “field”: “customers” } } } }
GET bank/_settings GET bank/_mapping
cardinality
branch 필드 값의 종류 분포값 검색
GET bank/_search { “size”: 0, “aggs”: { “uniq_branch”:{ “cardinality”: { “field”: “branch.keyword” } } } }
branch를 키워드로 봐야함
오류
GET bank/_search { “size”: 0, “aggs”: { “uniq_branch”:{ “cardinality”: { “field”: “branch” } } } }
## GET bank/_search { “size”: 0, “aggs”: { “cust_percent”: { “percentiles”: { “field”: “customers”, “percents”: [ 1, 5, 25, 50, 75, 95, 99 ] } } } }
percentiles : 값들을 백분위별로 집계
구간 설정 편집 가능, default : 1, 5, 25, 50, 75, 95, 99
GET bank/_search { “size”: 0, “aggs”: { “cust_percent”: { “percentiles”: { “field”: “customers”, “percents”: [25, 50, 75] } } } }
GET bank/_search { “size”: 0, “aggs”: { “cust_per”: { “percentile_ranks”: { “field”: “customers”, “values”: [100, 5724] } } } }
Bucket Aggregation —
customers 수가 100 이상 152명 미만인 구간의 문서 검색
from <= 데이터 범위 < to
GET bank/_search { “size”: 20, “aggs”: { “cust_range”: { “range”: { “field”: “customers”, “ranges”: [ { “from”: 100, “to”: 152 } ] } } } }
GET bank/_search { “size”: 20, “aggs”: { “cust_range”: { “range”: { “field”: “customers”, “ranges”: [ { “to”: 1000 }, { “from”: 1000, “to”: 4000 }, { “from”: 5000 } ] } } } }
히스토그램 적용해서 숫자 범위로 검색
“min_doc_count”: 1 - 검색되는 doc 수가 0개인 경우 검색 결과에서 skip 옵션, 검색 문서가 1나 이상 -> 구간별로 최소 1개 포함되고 있는 문서 검색
GET bank/_search { “aggs”: { “cust_his”: { “histogram”: { “field”: “customers”, “interval”: 500, “min_doc_count”: 1 } } } }
날짜 히스토그램
연도별 카운트 가능
GET bank/_search { “size”: 0, “aggs”: { “date_his”: { “date_histogram”: { “field”: “date”, “interval”: “year”, “format”: “yyyy-MM-dd” } } } }
term aggregation
GET bank/_mapping
각 지역에 은행이 몇개 있는지 검색 (키워드 별로 구분)
location keyword 문자열 별로 버킷을 나누어 집계 ..
GET bank/_search { “size”: 0, “aggs”: { “loc”: { “terms”: { “field”: “location.keyword” } } } }
sub - 집계
1단계 - bank 별 집계
2단계 - bank 별 집계 후 고객수 집계
3단계 - bank 별 집계 후 고객수 집계 또는 고객수 평균 집계
GET bank/_mapping
1단계
GET bank/_search { “size”: 0, “aggs”: { “bank_name”: { “terms”: { “field”: “bank.keyword” } } } }
2단계 - bank 별 집계 후 고객수 집계
GET bank/_search { “size”: 0, “aggs”: { “bank_name”: { “terms”: { “field”: “bank.keyword” }, “aggs”: { “sum_cust”: { “sum”: { “field”: “customers” } } } } } }
3단계 - bank 별 집계 후 고객수 집계 또는 고객수 평균 집계
GET bank/_search { “size”: 0, “aggs”: { “bank_name”: { “terms”: { “field”: “bank.keyword” }, “aggs”: { “avg_cust”: { “avg”: { “field”: “customers” } } } } } }
4단계 - bank 별 집계 후 총 고객수와 고객수 평균 둘다 집계
GET bank/_search { “size”: 0, “aggs”: { “bank_name”: { “terms”: { “field”: “bank.keyword” }, “aggs”: { “avg_cust”: { “avg”: { “field”: “customers” } }, “sum_cust”: { “sum”: { “field”: “customers” } } } } } }
Pipeline aggregation#
다른 집계의 결과를 입력으로 받아서 새로운 연산
1단계 : 년도별로 집계
2단계 : 년도별 집계 후 년도별 은행 고객수 합 집계
GET bank/_search { “size”: 0, “aggs”: { “y”: { “date_histogram”: { “field”: “date”, “interval”: “year”, “format”: “yyyy-MM-dd” }, “aggs”: { “sum_cust”: { “sum”: { “field”: “customers” } } } }, “sum_cust_all”: { “sum_bucket”: { “buckets_path”: “y>sum_cust” } } } }
bank 별 집계 후 bank 별 고객수 평균 집계된 결과값으로 고객수 평균 집계
GET bank/_search { “size”: 0, “aggs”: { “y”: { “terms”: { “field”: “bank.keyword” }, “aggs”: { “avg_cust”: { “avg”: { “field”: “customers” } } } }, “sum_cust”: { “avg_bucket”: { “buckets_path”: “y>avg_cust” } } } }
step - emp index
외부 csv 파일 import -> 검색으로 indexing 여부 확인
GET emp/_search
ENAME이 SMITH인 사원 정보 검색
GET emp/_search { “size”: 0, “query”: { “match”: { “ENAME”: “SMITH” } } } ——————————-MISSION!!!———————————————————- #? SALESMAN 직원들만 검색 GET emp/_search { “query”: { “match”: { “JOB”: “SALESMAN” } } } #? 부서 번호가 30번 직원들 검색 GET emp/_search { “query”: { “match”: { “DEPTNO”: 30 } } }
GET emp/_search { “query”: { “bool”: { “must”: [ { “match”: { “DEPTNO”: 30 } } ], “must_not”: [ { “match”: { “JOB”: “SALESMAN” } } ] } } }
#? 부서 번호가 30번, 단 JOB이 SALESMAN 직원들 제외 검색??
Pclass가 3, 생존한 사람들(Survived = 1)인 사람들 검색 ?
GET emp/_search { “query”: { “bool”: { “must”: [ { “match”: { “DEPTNO”: 30 } } ], “filter”: [ { “bool”:{ “must_not”: [ { “match”: { “JOB”: “SALESMAN” } } ] } } ] } } }
#? 부서별로 집계 GET emp/_search { “aggs”: { “dept_agg”: { “terms”: { “field”: “DEPTNO” } } } } #? emp의 각 field 별 type 확인 GET emp/_mapping GET bank/_mapping
#? JOB별로 집계 GET emp/_search { “size”: 0, “aggs”: { “job_terms”: { “terms”: { “field”: “JOB” } } } } #? JOB별 SAL 평균 집계?
GET emp/_search { “size”: 0, “aggs”: { “job_terms”: { “terms”: { “field”: “JOB” }, “aggs”: { “avg_sal”: { “avg”: { “field”: “SAL” } } } } } }
#? JOB별로 SAL 합을 구한 후 모든 SAL 합 집계와 평균 구하기
GET emp/_search { “size”: 0, “aggs”: { “job_terms”: { “terms”: { “field”: “JOB” }, “aggs”: { “sum_sal”: { “sum”: { “field”: “SAL” } } } }, “bucket_sum_emp”: { “sum_bucket”: { “buckets_path”: “job_terms>sum_sal” } }, “bucket_avg_emp”: { “avg_bucket”: { “buckets_path”: “job_terms>sum_sal” } } } }
—————————-Aggregation Review using Titanic Dataset————————————–
- PassengerId : 승객 번호
- Survived : 생존여부(1: 생존, 0 : 사망)
- Pclass : 승선권 클래스(1 : 1st, 2 : 2nd ,3 : 3rd)
- Name : 승객 이름
- Sex : 승객 성별
- Age : 승객 나이
- SibSp : 동반한 형제자매, 배우자 수
- Patch : 동반한 부모, 자식 수
- Ticket : 티켓의 고유 넘버
- Fare 티켓의 요금
- Cabin : 객실 번호
- Embarked : 승선한 항구명(C : Cherbourg, Q : Queenstown, S : Southampton)
GET titanic
GET titanic/_search
성별에 따른 요금(Fare) 합 구하기
GET titanic/_search { “size”: 0, “aggs”: { “titanic_terms”: { “terms”: { “field”: “Sex” }, “aggs”: { “sum_fare”: { “sum”: { “field”: “Fare” } } } }, “sum_fare_all”: { “sum_bucket”: { “buckets_path”: “titanic_terms>sum_fare” } } } }
성별로 집계
GET titanic/_search { “aggs”: { “titanic_agg”: { “terms”: { “field”: “Sex” } } } }
성별(Sex)에 따른 나이의 합 집계와 평균 구하기
GET titanic/_search { “size”: 0, “aggs”: { “titanic_terms”: { “terms”: { “field”: “Sex” }, “aggs”: { “sum_age”: { “sum”: { “field”: “Age” } } } }, “bucket_sum_age”: { “sum_bucket”: { “buckets_path”: “titanic_terms>sum_age” } }, “bucket_avg_age”: { “avg_bucket”: { “buckets_path”: “titanic_terms>sum_age” } } } }
—————————-Basic Query Review using Titanic Dataset————————————–
- PassengerId : 승객 번호
- Survived : 생존여부(1: 생존, 0 : 사망)
- Pclass : 승선권 클래스(1 : 1st, 2 : 2nd ,3 : 3rd)
- Name : 승객 이름
- Sex : 승객 성별
- Age : 승객 나이
- SibSp : 동반한 형제자매, 배우자 수
- Patch : 동반한 부모, 자식 수
- Ticket : 티켓의 고유 넘버
- Fare 티켓의 요금
- Cabin : 객실 번호
- Embarked : 승선한 항구명(C : Cherbourg, Q : Queenstown, S : Southampton)
GET titanic/_search
#? titanic의 각 field 별 type 확인 GET titanic/_mapping
Pclass가 3, 생존한 사람들(Survived = 1)인 사람들 검색 ?
GET titanic/_search { “query”: { “bool”: { “must”: [ { “match”: { “Pclass”: 3 } } ], “filter”: [ { “bool”:{ “must_not”: [ { “match”: { “Survived”: 0 } } ] } } ] } } }
titanic에 탑승한 모든 고객수
GET titanic/_search { “size”: 0, “aggs”: { “all_passenger”: { “sum”: { “field”: “PassengerId” } } } }
댓글남기기