Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

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

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

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


Image Added

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

예를 들어 키워드 검색을 '원피스' 라고 한후 관련상품 카테고리중 의류에는 300개 , 기타에는 100개

라는 집계정보를 다시 제공함으로 사용자에게 범위를 점점 좁혀 갈수 있게 선택을 하는 기능입니다.

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

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

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

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

사용되기 때문에 성능적 비효율과는 별개로 집계결과를 검색조건과 일치하기가 쉽지 않습니다.2번의 연산을 구현하는 과정중 구현단계에 필터거는 조건을 실수 하여 집계 정보가 다를수 있습니다. 


엘라서틱 서치에서는 집계를 위해 Aggregation 기능을 제공하며 사용하는 방법은

  • Filter → Aggregation 

검색을 위해 필터를 적용한 검색옵션에서 집계정보를 추가함으로 ,  

...

필터 조건과 집계정보가 각각이 아닌, 필터 조건을 사용하여 집계 처리를 하기 때문에

실수가 없고 더 구현레벨이 더 단순합니다.

  • Filter → Aggregation 


검색 조건을 건후, 집계정보는 연속해서 마지막에 걸어주면 되며집계정보의 구현 선언은 검색 필터 이후에 원하는 집계처리를 선언하면 되며

다음과 같은 다양한 집계처리 선언이 가능합니다검색에서 일반적으로 가장 많이 사용되는 집계 샘플을 다음과 같이 준비하였습니다.

집계 연산 정의

Code Block
themeEmacs
//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")
            )
        )
);
  • 최소 최대가격 범위 : 검색 결과가 가진 가격범위 스크롤바에 활용됩니다.
  • 카테고리별 집계 : 카테고리 결과내 재검색에서 사용되며, 카테고리로 범위를 축소할때 사용됩니다.
  • 태그 나열 : 검색에의해 나열된 연관 태그를 나열해줌으로, 태그를 통한 컬렉션 점프를 할수 있습니다.


집계 연산 사용

Code Block
themeEmacs
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관련 key값으로 연산된 값을 볼수 있으며 활용할수 있습니다.