2.X/1. Getting Started

1-01-13. Analytics

drscg 2017. 10. 1. 12:07

Finally, we come to our last business requirement: allow managers to run analytics over the employee directory. Elasticsearch has functionality called aggregations, which allow you to generate sophisticated analytics over your data. It is similar to GROUP BY in SQL, but much more powerful.

이제 마지막 요구 사항을 처리해 보자. 요구 사항은 관리자가 전체 직원 임명 사전을 분석할 수 있도록 해 주는 것이다. Elasticsearch는 aggregation 이라는 기능을 가지고 있는데, 이것으로 데이터에 대한 정교한 분석을 할 수 있다. SQL의 GROUP BY 와 유사하나, 더욱 강력하다.

For example, let’s find the most popular interests enjoyed by our employees:

예를 들어, 직원들이 즐기는 가장 인기 있는 취미를 찾아보자.

GET /megacorp/employee/_search
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}

Ignore the syntax for now and just look at the results:

지금은 문법은 무시하고 결과만 보자.

{
   ...
   "hits": { ... },
   "aggregations": {
      "all_interests": {
         "buckets": [
            {
               "key":       "music",
               "doc_count": 2
            },
            {
               "key":       "forestry",
               "doc_count": 1
            },
            {
               "key":       "sports",
               "doc_count": 1
            }
         ]
      }
   }
}

We can see that two employees are interested in music, one in forestry, and one in sports. These aggregations are not precalculated; they are generated on the fly from the documents that match the current query. If we want to know the popular interests of people called Smith, we can just add the appropriate query into the mix:

두 사람은 music에, 한 사람은 forestry에, 다른 한 사람은 sports에 관심 있다는 것을 알 수 있다. 이 aggregation은 미리 계산된 것이 아니다. 이것은 현재의 query와 일치하는 document로부터, 즉석에서 만들어낸 것이다. "smith" 라 불리는 사람들에게 인기 있는 취미를 알고 싶다면, 적절한 query를 추가하기만 하면 된다.

GET /megacorp/employee/_search
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}

The all_interests aggregation has changed to include only documents matching our query:

all_interests aggregation은 query에 일치하는 document만을 포함하도록 변경되었다.

  ...
  "all_interests": {
     "buckets": [
        {
           "key": "music",
           "doc_count": 2
        },
        {
           "key": "sports",
           "doc_count": 1
        }
     ]
  }

Aggregations allow hierarchical rollups too. For example, let’s find the average age of employees who share a particular interest:

계층적인 aggregation도 가능하다. 예를 들어, 특정 취미를 공유하는 직원들의 평균 나이를 찾아보자.

GET /megacorp/employee/_search
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}

The aggregations that we get back are a bit more complex, but still fairly easy to understand:

aggregation의 결과는 약간 복잡하다. 하지만, 꽤 이해하기 쉽다.

  ...
  "all_interests": {
     "buckets": [
        {
           "key": "music",
           "doc_count": 2,
           "avg_age": {
              "value": 28.5
           }
        },
        {
           "key": "forestry",
           "doc_count": 1,
           "avg_age": {
              "value": 35
           }
        },
        {
           "key": "sports",
           "doc_count": 1,
           "avg_age": {
              "value": 25
           }
        }
     ]
  }

The output is basically an enriched version of the first aggregation we ran. We still have a list of interests and their counts, but now each interest has an additional avg_age, which shows the average age for all employees having that interest.

결과는 기본적으로 우리가 처음에 실행했던 aggregation의 강화된 버전이다. 여전히, 취미의 목록과 수를 가지고 있지만, 지금은 해당 취미를 가지고 있는 모든 직원들의 평균 나이를 보여주는 avg_age 를 추가적으로 가지고 있다.

Even if you don’t understand the syntax yet, you can easily see how complex aggregations and groupings can be accomplished using this feature. The sky is the limit as to what kind of data you can extract!

아직 문법을 이해하지 못해도, 이 기능을 사용하여 매우 복잡한 aggregation과 분류를 해낼 수 있는 방법을 쉽게 알 수 있다. 추출할 수 있는 데이터의 종류에는 한계가 없다!

'2.X > 1. Getting Started' 카테고리의 다른 글

1-01-11. Phrase Search  (0) 2017.10.01
1-01-12. Highlighting Our Searches  (0) 2017.10.01
1-01-14. Tutorial Conclusion  (0) 2017.10.01
1-01-15. Distributed Nature  (0) 2017.10.01
1-01-16. Next Steps  (0) 2017.10.01