검색 결과의 집계기능은 검색 기능 수행과 동시에 이루어지게 되며
결과내 재검색이란 기능을 사용할수 있게합니다.
예를 들어 키워드 검색을 '원피스' 라고 한후 관련상품 카테고리중 의류에는 300개 , 기타에는 100개
라는 집계정보를 다시 제공함으로 사용자에게 범위를 점점 좁혀 갈수 있게 선택을 하는 기능입니다.
이러한 기능 구현을 위해 , 다음과 같이 각각 2번의 연산을 한후 결합을 한다고하면
- 필터 조건 검색 컬렉션
- 필터 조건 집계 정보
2번의 연산을 구현하는 과정중 구현단계에 필터거는 조건을 실수 하여 집계 정보가 다를수 있습니다.
엘라서틱 서치에서는 집계를 위해 Aggregation 기능을 제공하며 사용하는 방법은
- Filter → Aggregation
검색을 위해 필터를 적용한 검색옵션에서 집계정보를 추가함으로 ,
검색 결과를 반환할때 검색컬렉션과 집계정보를 구분하여 각각 내려 줍니다.
검색 조건을 건후, 집계정보는 연속해서 마지막에 걸어주면 되며
검색에서 일반적으로 가장 많이 사용되는 집계 샘플을 다음과 같이 준비하였습니다.
집계 연산 정의
//Paging var searchDes = new SearchDescriptor<SearchGoods>() .From(page) .Size(limit); // Filter기능은 3장 참고 //Aggregations(검색 결과 집계 처리) searchDes.Aggregations(aggs => aggs .Average("average_per_price", avg => avg.Field(p => p.price)) .Max("max_per_price", avg => avg.Field(p => p.price)) .Min("min_per_price", avg => avg.Field(p => p.price)) .Terms("category1_cnt", st => st .Field(p => p.category1.Suffix("keyword")) .MinimumDocumentCount(1) .Size(100000) .ShardSize(100) .ExecutionHint(TermsAggregationExecutionHint.Map) .Missing("na") .Order(o => o .KeyAscending() .CountDescending() ) .Meta(m => m .Add("foo", "bar") ) ) .Terms("category2_cnt", st => st .Field(p => p.category2.Suffix("keyword")) .MinimumDocumentCount(1) .Size(100000) .ShardSize(100) .ExecutionHint(TermsAggregationExecutionHint.Map) .Missing("na") .Order(o => o .KeyAscending() .CountDescending() ) .Meta(m => m .Add("foo", "bar") ) ) .Terms("tag_cnt", st => st .Field(p => p.tags.Suffix("keyword")) .MinimumDocumentCount(1) .Size(100000) .ShardSize(100) .ExecutionHint(TermsAggregationExecutionHint.Map) .Missing("na") .Order(o => o .KeyAscending() .CountDescending() ) .Meta(m => m .Add("foo", "bar") ) ) );
- 최소 최대가격 범위 : 검색 결과가 가진 가격범위 스크롤바에 활용됩니다.
- 카테고리별 집계 : 카테고리 결과내 재검색에서 사용되며, 카테고리로 범위를 축소할때 사용됩니다.
- 태그 나열 : 검색에의해 나열된 연관 태그를 나열해줌으로, 태그를 통한 컬렉션 점프를 할수 있습니다.
집계 연산 사용
var agg = engine_result.Aggregations; var category1_aggs = agg.Terms("category1_cnt"); var category2_aggs = agg.Terms("category2_cnt"); var tag_aggs = agg.Terms("tag_cnt"); var minPrice = agg.ValueCount("min_per_price").Value
집계는 다소 동적인 컬렉션 항목으로, 집계연산 선언명령이 있다고 하면
관련 key값으로 연산된 값을 볼수 있으며 활용할수 있습니다.