ElasticStack 기본 쿼리 및 집계

8 분 소요

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” } } } }

카테고리:

업데이트:

댓글남기기