Versions Compared

Key

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


Image Added

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

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

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

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

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

...

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

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

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


엘라서틱 서치에서는 집계를 위해 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값으로 연산된 값을 볼수 있으며 활용할수 있습니다.집계값 획득은 선언된 key/values 방식으로 획득하여 활용 하면 되겠습니다.


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

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


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