2.X/4. Aggregations

4-02. Aggregation Test-Drive

drscg 2017. 9. 24. 11:33

We could spend the next few pages defining the various aggregations and their syntax, but aggregations are truly best learned by example. Once you learn how to think about aggregations, and how to nest them appropriately, the syntax is fairly trivial.

다음 몇 페이지에서, 다양한 aggregation과 그 문법에 대해 이야기할 것이다. 그러나, aggregation은 예제로 배우는 것이 제일 좋다. aggregation에 대해 생각하는 방법과, 적절하게 중첩시키는 방법을 배우기만 하면, 문법은 매우 간단하다.

Note

A complete list of aggregation buckets and metrics can be found at the Elasticsearch Reference. We’ll cover many of them in this chapter, but glance over it after finishing so you are familiar with the full range of capabilities.

aggregation bucket과 metric의 전체 목록은 Elasticsearch Reference에서 볼 수 있다. 이 장에서 그것들 중 많은 부분을 다루겠지만, 기능의 전체 범위에 익숙해지기 위해, 그것들을 죽 훑어보자

So let’s just dive in and start with an example. We are going to build some aggregations that might be useful to a car dealer. Our data will be about car transactions: the car model, manufacturer, sale price, when it sold, and more.

자. 예제를 시작해 보자. 자동차 판매상에게 유용한 몇 가지 aggregation을 만들어 볼 것이다. 데이터는 자동차 모델, 제조업체, 판매가, 판매 시기 등의 자동차 거래에 대한 것이다.

First we will bulk-index some data to work with:

먼저, 작업할 약간의 데이터를 색인하자.

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

Now that we have some data, let’s construct our first aggregation. A car dealer may want to know which color car sells the best. This is easily accomplished using a simple aggregation. We will do this using a terms bucket:

이제, 데이터가 준비되었으니, 첫 번째 aggregation을 만들어보자. 자동차 판매상은 가장 잘 팔린 자동차가 어떤 색상인지 알고 싶어한다. 이것은, 간단한 aggregation을 사용하여, 쉽게 할 수 있다. terms bucket을 사용할 것이다.

GET /cars/transactions/_search
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color"
            }
        }
    }
}

aggregation은 최상위의 aggs 매개변수(더 긴 aggregations 도 동작한다.) 아래에 위치한다.

원하는 aggregation의 이름을 붙인다. 이 예에서는 popular_colors

마지막으로, terms tpye의 단일 bucket을 정의한다.

Aggregations are executed in the context of search results, which means it is just another top-level parameter in a search request (for example, using the /_search endpoint). Aggregations can be paired with queries, but we’ll tackle that later in Scoping Aggregations.

aggregation은 검색 결과의 문맥내에서 실행된다. 즉, 검색 request에서 또 다른 최상위 단계 매개변수(예: 마지막에 _search 를 사용)이다. aggregation은 query와 짝을 이룰 수 있다. 이것은 나중에 Scoping Aggregations에서 이야기하겠다.

Note

You’ll notice that we set the size to zero. We don’t care about the search results themselves and returning zero hits speeds up the query. Setting size: 0 is the equivalent of using the count search type in Elasticsearch 1.x.

size 를 0 로 설정한 것을 주목하자. 검색 결과 자체에는 관심이 없고 query의 속도를 올리기 위해 hit를 반환하지 않는다. size: 0 은 elasticsearch 1.x 에서 count search_type을 사용하는 것과 동일하다.

Next we define a name for our aggregation. Naming is up to you; the response will be labeled with the name you provide so that your application can parse the results later.

다음으로, aggregation에 대한 이름을 정의한다. 이름은 여러분이 결정하면 된다. 나중에 응용프로그램이 결과를 분석할 수 있도록, response는 여러분이 제공한 이름으로 표시될 것이다.

Next we define the aggregation itself. For this example, we are defining a single terms bucket. The terms bucket will dynamically create a new bucket for every unique term it encounters. Since we are telling it to use the color field, the terms bucket will dynamically create a new bucket for each color.

다음으로, aggregation 그 자체를 정의한다. 이 예에서, 단일 terms bucket을 정의하고 있다. termsbucket은, 유일한 단어를 만날 때마다, 동적으로 새로운 bucket을 생성한다. color field를 사용했기 때문에, terms bucket은 각 색상에 대해 동적으로 새로운 bucket을 생성한다.

Let’s execute that aggregation and take a look at the results:

aggregation을 실행하고, 그 결과를 살펴보자.

{
...
   "hits": {
      "hits": [] 
   },
   "aggregations": {
      "popular_colors": { 
         "buckets": [
            {
               "key": "red", 
               "doc_count": 4 
            },
            {
               "key": "blue",
               "doc_count": 2
            },
            {
               "key": "green",
               "doc_count": 2
            }
         ]
      }
   }
}

size 매개변수를 사용했기 때문에, 검색 결과는 반환되지 않는다.

popular_colors aggregation은 aggregations field의 일부로 반환된다.

각 bucket의 key 는 color field에서 발견된 유일한 단어에 해당한다. 또한, 해당 단어를 가지고 있는 document의 수를 나타내는, doc_count 를 항상 포함한다.

각 bucket의 수는 이 색상을 가지고 있는 document 수를 나타낸다.

The response contains a list of buckets, each corresponding to a unique color (for example, red or green). Each bucket also includes a count of the number of documents that "fell into" that particular bucket. For example, there are four red cars.

response는 bucket의 목록을 가지고 있고, 각 bucket은 유일한 색상(red, green 등)에 대응한다. 또한, 각 bucket은 특정 bucket에 "해당하는" document의 수를 포함한다. 예를 들면, 붉은 색상의 자동차는 4대가 있다.

The preceding example is operating entirely in real time: if the documents are searchable, they can be aggregated. This means you can take the aggregation results and pipe them straight into a graphing library to generate real-time dashboards. As soon as you sell a silver car, your graphs would dynamically update to include statistics about silver cars.

위의 예는 완전히 실시간으로 작동한다. document가 검색이 가능하면, aggregation도 가능하다. 즉, aggregation 결과를, 실시간으로 대시보드를 생성하는 그래프 라이브러리에 즉시, 보낼 수 있다. 은색 자동차를 팔자마자, 은색 자동차에 대한 통계를 포함하도록, 그래프는 동적으로 업데이트될 것이다.

Voila! Your first aggregation!

여러분의 첫 번째 aggregation이 여기까지이다.

'2.X > 4. Aggregations' 카테고리의 다른 글

4-01-2. Metrics  (0) 2017.09.24
4-01-3. Combining the Two  (0) 2017.09.24
4-02-1. Adding a Metric to the Mix  (0) 2017.09.24
4-02-2. Buckets Inside Buckets  (0) 2017.09.24
4-02-3. One Final Modification  (0) 2017.09.24