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용 컬럼을 만들고 그것을 사용하도록 하자.