본문으로 건너뛰기

9. Aggregation(집계)

기본사용

집계의 가장 기본형. 여기서 group_by_category라는 것은 내가 정하는 임의 문자이다.
지정하고 싶은데로 지정하면 된다.

GET /my-index/_search
{
"size": 0,
"aggs": {
"group_by_category": {
"terms": {
"field": "category"
}
}
}
}

결과는 다음과 같이 반환된다. 버킷 안에 key가 두가지가 있고 각 Key들의 카운트 값이 반환된다.

{
"took": 1,
"timed_out": false,
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"hits": []
},
"aggregations": {
"group_by_category": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 1,
"buckets": [
{
"key": "Tutorials",
"doc_count": 3
},
{
"key": "Analysis",
"doc_count": 1
}
]
}
}
}

CQL에 태워서는 어떻게 사용하나?

이런식으로 사용한다.

  • 어떤 특정 테이블의 created_by를 기준으로 집계를 내고, 집계의 종류와 숫자를 알고 싶을 때
SELECT * FROM keyspacename.tablename WHERE es_query = '{"size": 0,"aggs": {"grouping_name": {"terms": {"field": "created_by","size": 10}}}}' AND es_options='indices=material*;' ALLOW FILTERING;

결과는 이런식으로 나온다. (홍길동 작성자가 144건, 춘향이 작성자가 48건)

 tablename.key | tablename.count
-------------+---------------
홍길동 | 144
춘향이 | 48

(2 rows)

위에를 보면 SELECT * FROM 이렇게 아스타리스크를 사용했을경우 저렇게 컬럼명이 잡혀서 나온다는 것이다.

이번에는 임의의 컬럼명으로 해본다.

SELECT created_by_key, created_by_cnt FROM keyspacename.tablename WHERE es_query = '{"size": 0,"aggs": {"grouping_name": {"terms": {"field": "created_by","size": 10}}}}' AND es_options='indices=material*;' ALLOW FILTERING;

결과는 이렇다. (내가 정해준 임의의 컬럼명으로 잡혀 나온다)

 tcreated_by_key | created_by_cnt
-------------+---------------
홍길동 | 144
춘향이 | 48

(2 rows)

즉, 컬럼값을 정해주면 그 컬럼값으로, agg의 bucket의 key와 count값을 얻을 수 있다.

자바에서 맵핑 하려면?

원래 있던 테이블에, agg용으로 빈 컬럼을 이것저것 많이 추가하면 테이블이 꾀나 지저분 해질것이다.

agg용으로 테이블을 하나 새롭게 만들고, 그곳에 agg용 컬럼들을 모두 몰아 넣는다.

그리고 자바에서 그 컬럼들의 이름으로 맵핑을 시켜주면 된다.

  • 임의의 컬럼을 agg대상의 테이블과 같은 컬럼에 넣지 않아도 된다.
  • 리엑티브 카산드라는 실제로 존재하는 테이블에 한해서만 맵핑을 해준다.(컬럼이 존재하지 않으면 에러가 발생한다.)
  • 자바의 Map이나 List형으로 맵핑하는것은 불가능하다.(Chat GPT답변)
  • 기존의 테이블에 agg맵핑용 컬럼을 많이 만들면 지저분해 지니, 새로운 테이블에 agg용 컬럼을 만들고 그것을 사용하도록 하자.