최근 엘라스틱서치 8버전이 공개되었습니다. 공개된 ML모델적용을 손쉽게 할 수 있다고 합니다. 이번 포스팅에서는 자바, 특히 스프링 부트를 이용한 Elasticsearch (엘라스틱서치) aggregation (어그리게이션) 사용방법과 관련 내용에 대해서 소개드리려고 합니다. 우선 어그리게이션이 무엇인지 알아보겠습니다.
어그리게이션(Aggregation)
Aggregation은 검색결과에 다양한 연산을 적용해서 출력하는 기능을 지원하기 위해 개발된 모듈입니다. 버킷(bucket) 어그리게이션과 메트릭(metric) 어그리게이션, 파이프라인(Pipeline) 어그리게이션이 있습니다.
- 버킷 어그리게이션 (bucket aggregation)
- Terms, Filter, Range, Histogram, Global, IP range, Missing 등... 의 기능이 버킷 어그리게이션에 속합니다. 추가로 서브 어그리게이션을 통해서 추가 연산 작업을 진행할 수 있습니다.
- 메트릭 어그리게이션 (metric aggregation)
- Sum, Min, Max, Avg, Rate, Top hits, Percentiles 등... 의 기능이 매트릭 어그리게이션에 속합니다.
- 파이프라인 어그리게이션 (Pipeline aggregation)
- Average buchet, Bucket script, Max bucket, Normailze 등...의 기능이 파이프라인 어그리게이션에 속합니다.
더 자세한 내용과 종류는 링크된 공식 홈페이지에서 확인바랍니다.
사용하기
이제는 Spring boot를 이용하여 해당 기능을 사용해보도록 하겠습니다. 물론 쿼리를 이용하여 사용합니다. 우선 스프링부트에서 엘라스틱 서치를 사용하기 위한 세팅을 진행합니다. 관련 세팅은 이전 글로 대체하도록 하겠습니다.
https://kingname.tistory.com/225
세팅을 마쳤다면 아래 Histogram, Sum 을 이용한 예제를 보고 사용하시면 됩니다. 질문이 있으시다면 댓글 부탁드립니다.
public void getHistogram(String keyword) throws Exception {
String aggName = "histogram";
LocalDate to = LocalDate.now().minusDays(1);
LocalDate from = to.minusWeeks(7);
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyyMMdd");
SearchSourceBuilder searchSourceBuilder = getDateRangeQuery(keyword, aggName, from.format(pattern), to.format(pattern));
SearchResponse searchResponse = elasticsearchRepository.search("keyword-*", searchSourceBuilder);
Histogram histogram = searchResponse.getAggregations().get(aggName);
for (Histogram.Bucket bucket : histogram.getBuckets()) {
Sum countAggs = bucket.getAggregations().get("count");
log.info("{} , {} ", bucket.getKeyAsString(), countAggs.getValue());
}
}
private SearchSourceBuilder getDateRangeQuery(String keyword, String aggName, String from, String to) {
String rangeField = "date"; // 기간 설정 필드명
String sumField = "count"; // 더할 필드명
int intervalDay = 7;
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("keyword", keyword))
.must(QueryBuilders.rangeQuery(rangeField).from(from).to(to));
DateHistogramAggregationBuilder aggregations = AggregationBuilders.dateHistogram(aggName)
.field(rangeField)
.fixedInterval(DateHistogramInterval.days(intervalDay))
.subAggregation(AggregationBuilders.sum(sumField).field(sumField))
.order(BucketOrder.key(false)); // 날짜 정렬 방법
return SearchSourceBuilder.searchSource().query(queryBuilder).aggregation(aggregations).size(0);
}
위 예시는 Histogram, Sum 인터페이스를 이용하여 데이터를 가져와 사용하였습니다. 해당 코드는 라이브러리 버전에 따라 메소드명이 달라지거나 없을 수 있습니다.
이상으로 Java를 이용한 elasticsearch aggregation 사용방법에 대해서 코드를 통해서 알아보았습니다. (추후 내용 추가)