ElasticSearch는 RDMS가 아닙니다. DB가 아닙니다.
넓은 의미로는 데이터베이스라고 할 수는 있습니다. 데이터를 넣고 분석하고 삭제하는 등의 관리를 할 수 있으니까요. 하지만 RDBMS가 가진 많은 기능을 제공하지는 않고 그 중에 어낼리틱스 기능또한 제공되지 않는 것 중 하나입니다.
하지만 DB처럼 사용하려는 사용자 요구가 많고 엘라스틱서치 측에서도 계속해서 그런 어낼리틱스 기능을 지원하려고 하고 있습니다.
집계 쿼리(Aggregation Query)는 DB의 “group by”같은 것을 말합니다.
집계 쿼리를 사용할 때 주의할 것은
- 엘라스틱서치의 집계 쿼리는 부하가 심합니다.
- 집계하려는 필드가 색인에 들어있지 않은 경우는 더 심합니다.
쓰고 싶으믄 크지 않은 인덱스에 대해서 하고 가능하면 대상 필드에 색인을 걸어 두는 것이 좋습니다.
쿼리 예제
aggregation 쿼리의 예제입니다. “createDate”라는 날짜 포맷의 컬럼을 기준으로 몇개의 문서가 있는지 집계하는 쿼리입니다. range는 날짜 구간입니다. 아래와 같은 형식으로 쿼리를 작성해서 응용해서 쓰면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "query": { "range": { "createdDate": { "gt": "20220423", "lte": "20220523" } } }, "aggs": { "group_by_state": { "terms": { "field": "createdDate" } } } } |
위와 같이 하면 집계 결과와 검색결과가 같이 나오는데 검색결과에 모든 필드가 포함됩니다. 필요 없는 것을 빼고 비교적 간략하게 받으려면 _source를 지정해주면 조금 더 낫습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "query": { "range": { "createdDate": { "gt": "20220423", "lte": "20220523" } } }, "aggs": { "group_by_state": { "terms": { "field": "createdDate" } } }, "_source": [ "createdDate", "doc_id" ] } |
아예 hits에 결과를 안넣고 받으려면 size를 0으로 해주면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "size": 0, "query": { "range": { "createdDate": { "gt": "20220423", "lte": "20220523" } } }, "aggs": { "group_by_state": { "terms": { "field": "createdDate" } } } } |