ElasticSearch는 RDMS가 아닙니다. 즉, DB가 아닙니다.
하지만 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" } } } } |