검색과 동시에 집계처리를 하는 방법을 살펴봅시다.

집계기능이 검색 결과에 항상 있어야하는것은 검색내 재검색을 위한 기능으로

중요한 요소중 하나입니다.


검색 결과의 집계기능은 ,검색 기능 수행과 동시에 이루어지게 되며  결과내 재검색이란 기능을 사용할수 있게합니다.

이러한 기능 구현을 위해 , 일반적으로 다음과 같이 각각 2번의 연산을 각각한후 결합하게됩니다.

  1. 필터 조건 검색 컬렉션
  2. 필터 조건 집계 정보

여기서 두번의 연산과정중 첫번째 필터조건(Where) 을 사용하여 원하는 집계결과를 내어야합니다.

다양한 집계처리를 위해 각각 다른 Group By 조건이 사용되게 되며 집계조건에 따라 복수개의 연산이

사용되기 때문에 성능적 비효율과는 별개로 집계결과를 검색조건과 일치하기가 쉽지 않습니다.


엘라서틱 서치에서는 집계를 위해 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/values 방식으로 획득하여 활용 하면 되겠습니다.


검색에서의 집계는 summary 라고 불릴수도 있으며

엘라스틱 서치에서는 Aggreagation 이라는 용어가 사용이 됩니다.


more info : https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/writing-aggregations.html


  • No labels