[Elasticsearch] 집계된 테스트 데이터
34614 단어 ElasticsearchSearch
집계된 테스트 데이터(Aggregation Test-Drive)
우리는 각종 집합과 그들의 문법을 배울 것이지만, 가장 좋은 학습 방법은 역시 예를 통해서이다.일단 집합에 대해 어떻게 생각하고, 그것들에 대해 어떻게 적절하게 끼워 넣는지 알게 되면 문법 자체는 어렵지 않다.
우리 하나의 예부터 시작합시다.우리는 자동차 거래상에게 쓸모가 있을지도 모르는 집합을 세울 것이다.데이터는 자동차 거래에 관한 것이다. 자동차 모델, 제조업체, 판매 가격, 판매 시간 및 기타 관련 데이터이다.
우선 대량 인덱스(Bulk-Index)를 통해 데이터를 추가합니다.POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
이제 데이터가 좀 생겼으니 집합을 만듭니다.자동차 거래상은 어떤 색깔의 차가 가장 잘 팔리는지 알고 싶어 할지도 모른다.이것은 간단한 집합을 통해 완성할 수 있다.terms 통 사용:GET /cars/transactions/_search?search_type=count
{
"aggs" : {
"colors" : {
"terms" : {
"field" : "color"
}
}
}
}
검색 결과에 관심이 없으니까, search_type은count입니다. 속도가 더 빠릅니다.집합은 맨 윗부분의aggs 매개 변수 아래에서 작동합니다. (물론 더 긴aggregations를 사용할 수도 있습니다.)그리고 이 집합에 colors라는 이름을 붙였다.마지막으로, 우리는terms 형식의 통을 정의했습니다. 이것은 color 필드를 대상으로 합니다.
집합은 검색 결과를 상하문으로 하는 것입니다. 이것은 검색 요청 (예:/_search 단점 사용) 의 또 다른 최상위 매개 변수 (Top-level Parameter) 를 의미합니다.집합은 조회와 동시에 사용할 수 있다는 점은 다음 범위 집합(Scoping Aggregations)에서 소개합니다.
이어서 우리는 모임을 위해 이름을 하나 지었다.명명 규칙은 네가 결정한 것이다.집합의 응답은 이 이름으로 표시되기 때문에 응용 프로그램에서 이름에 따라 집합 결과를 얻을 수 있고 그것들을 조작할 수 있습니다.
그리고 우리는 집합 자체를 정의하기 시작했다.예를 들어, 우리는terms 형식의 통을 정의했다.terms통은 반복되지 않는 단어마다 동적으로 새 통을 만듭니다.우리가 겨냥한 것은color 필드이기 때문에,terms통은 모든 색깔에 동적으로 새 통을 만들 것입니다.
이 집합을 실행하여 그 결과를 봅시다.{
...
"hits": {
"hits": []
},
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4
},
{
"key": "blue",
"doc_count": 2
},
{
"key": "green",
"doc_count": 2
}
]
}
}
}
왜냐하면 저희가 사용하는 search_type은count이기 때문에 검색 결과가 되돌아오지 않습니다.모든 통의 키는 color 필드에서 반복되지 않는 단어를 찾습니다.그것 은 동시에 doc_ 하나 를 포함하고 있다count, 이 단어를 포함하는 문서의 수를 나타냅니다.
응답은 모든 통이 반복되지 않는 색깔(예를 들어 빨간색이나 녹색)에 대응하는 통 목록을 포함합니다.통마다 이 통에 떨어지는 문서의 수량도 포함되어 있다.예를 들면, 빨간색 차 네 대가 있다.
앞의 예는 완전 실시간 (Real-Time) 입니다. 만약 문서가 검색 가능하다면, 그것들은 집합될 수 있습니다.이것은 얻은 집합 결과를 그래픽 라이브러리에 넣어서 실시간 대시보드(Dashboard)를 생성할 수 있다는 것을 의미한다.일단 네가 은색 자동차 한 대를 팔면 도형에서 은색 자동차에 대한 통계 데이터가 동태적으로 갱신될 것이다.
봐라!너의 첫 번째 집합!
지표 추가(Metric)
앞의 예에서 우리는 모든 통의 문서 수량을 알 수 있다.그러나 통상적으로 우리의 응용은 그 문서들을 바탕으로 하는 더욱 복잡한 지표 (Metric) 를 필요로 한다.예를 들어 통당 자동차의 평균 가격은 얼마입니까?
이 정보를 얻기 위해서, 우리는 ES가 어떤 필드를 위해 어떤 지표를 계산해야 하는지 알려야 한다.이것은 지표를 통에 끼워 넣어야 한다.지표는 통에 있는 문서의 값을 바탕으로 상응하는 통계 정보를 계산한다.
평균값을 계산하는 지표를 추가합니다.GET /cars/transactions/_search?search_type=count
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
우리는 이 지표를 포함하기 위해 새로운aggs 등급을 추가했다.그리고 이 지표에 이름을 붙였다: avg_price.마지막으로 이 지표의 작용을 정의한 필드는price...
보시다시피 우리는 앞의 예에 새로운aggs 등급을 추가했습니다.이 새로운 집합 등급은 우리로 하여금 avg 지표를terms통에 끼워 넣게 할 수 있다.이것은 우리가 모든 색깔을 위해 평균치를 계산할 수 있다는 것을 의미한다.
마찬가지로, 우리는 지표에 이름 (avg_price) 을 붙여서 우리가 장래에 그 값을 얻을 수 있도록 해야 한다.마지막으로, 우리는 지표 자체(avg)와 이 지표가 작용하는 필드(price)를 지정했다.{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"avg_price": {
"value": 32500
}
},
{
"key": "blue",
"doc_count": 2,
"avg_price": {
"value": 20000
}
},
{
"key": "green",
"doc_count": 2,
"avg_price": {
"value": 21000
}
}
]
}
}
...
}
현재 응답에 avg_가 하나 더 있습니다price 요소.
비록 얻은 응답은 약간의 변화일 뿐이지만, 얻은 데이터는 많이 증가했다.이전에 우리는 빨간색 자동차가 네 대밖에 없다는 것을 알았다.지금 우리는 빨간색 자동차의 평균 가격이 32500칼이라는 것을 알게 되었다.이 데이터들은 네가 직접 보고서에 삽입할 수 있다.
배럴 내의 배럴(Buckets inside Buckets)
당신이 서로 다른 플러그인 모드를 사용하기 시작할 때, 집합의 강력한 능력이 나타날 수 있다.앞의 예에서, 우리는 하나의 지표를 어떻게 통에 끼워 넣는지 이미 알고 있으며, 그것의 기능은 이미 매우 강력하다.
그러나 진정으로 감동적인 분석 기능은 다른 통에 박힌 통에서 비롯된다.이제 각 색상의 자동차 제조업체 분포 정보를 찾는 방법을 살펴보겠습니다.GET /cars/transactions/_search?search_type=count
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"make": {
"terms": {
"field": "make"
}
}
}
}
}
}
이때 재미있는 일이 일어났다.우선, 앞의 avg_를 알아차릴 수 있을 것이다price 지표는 전혀 변화가 없다.하나의 집합된 모든 등급은 여러 개의 지표나 통을 가질 수 있다.avg_price 지표는 우리에게 모든 자동차 색깔의 평균 가격을 알려주었다.모든 색깔을 위한 통과 지표는 각각 독립적이다.
이 성질은 당신의 응용에 있어서 매우 중요하다. 왜냐하면 당신은 항상 서로 관련이 있지만 완전히 다른 지표를 수집해야 하기 때문이다.집합은 데이터에 대해 한 번 훑어보면 필요한 모든 정보를 얻을 수 있다.
또 다른 중요한 것은 새로운 집합make를 추가하는 것입니다. 이것은 terms 형식의 통입니다. (colors라는 terms통에 박혀 있습니다.)이것은 우리가 데이터 집합에 따라 중복되지 않는 (color,make) 조합을 만들 수 있다는 것을 의미한다.
응답을 살펴보겠습니다. (응답 시간이 너무 길어서 생략됨):{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"make": {
"buckets": [
{
"key": "honda",
"doc_count": 3
},
{
"key": "bmw",
"doc_count": 1
}
]
},
"avg_price": {
"value": 32500
}
},
...
}
이 응답은 다음과 같은 정보를 제공합니다.
POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
GET /cars/transactions/_search?search_type=count
{
"aggs" : {
"colors" : {
"terms" : {
"field" : "color"
}
}
}
}
{
...
"hits": {
"hits": []
},
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4
},
{
"key": "blue",
"doc_count": 2
},
{
"key": "green",
"doc_count": 2
}
]
}
}
}
GET /cars/transactions/_search?search_type=count
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"avg_price": {
"value": 32500
}
},
{
"key": "blue",
"doc_count": 2,
"avg_price": {
"value": 20000
}
},
{
"key": "green",
"doc_count": 2,
"avg_price": {
"value": 21000
}
}
]
}
}
...
}
GET /cars/transactions/_search?search_type=count
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"make": {
"terms": {
"field": "make"
}
}
}
}
}
}
{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"make": {
"buckets": [
{
"key": "honda",
"doc_count": 3
},
{
"key": "bmw",
"doc_count": 1
}
]
},
"avg_price": {
"value": 32500
}
},
...
}
마지막 수정(One Final Modification)
새로운 화제를 계속 토론하기 전에, 문제를 명확하게 설명하기 위해서 우리는 이 예에 대해 마지막 수정을 할 것이다.제조업체당 최소 및 최대 가격을 계산하기 위해 두 가지 지표를 추가합니다.
GET /cars/transactions/_search?search_type=count
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": { "avg": { "field": "price" }
},
"make" : {
"terms" : {
"field" : "make"
},
"aggs" : {
"min_price" : { "min": { "field": "price"} },
"max_price" : { "max": { "field": "price"} }
}
}
}
}
}
}
min과max에 대한 플러그인을 하기 위해 다른aggs 등급을 추가해야 합니다.
다음과 같은 응답을 받았습니다(생략됨).
{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"make": {
"buckets": [
{
"key": "honda",
"doc_count": 3,
"min_price": {
"value": 10000
},
"max_price": {
"value": 20000
}
},
{
"key": "bmw",
"doc_count": 1,
"min_price": {
"value": 80000
},
"max_price": {
"value": 80000
}
}
]
},
"avg_price": {
"value": 32500
}
},
...
모든make통 아래에min과max의 지표가 많아졌다.
이제 다음과 같은 정보를 얻을 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Embulk를 사용하여 ElasticCloud로 보내기Embulk에서 ElasticCloud에 보낼 수 있을까라고 생각비망록도 겸해 기술을 남깁니다 Embulk 설치 ElasticCloud (14 일 체험판) brew라면 아래 명령 입력 파일 만들기 파일 내용 seed...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.