You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

검색 결과의 집계기능은 검색 기능 수행과 동시에 이루어지게 되며 

결과내 재검색이란 기능을 사용할수 있게합니다.

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

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


이러한 기능 구현을 위해 , 다음과 같이 각각 2번의 연산을 한후 결합을 한다고하면

  1. 필터 조건 검색 컬렉션
  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값으로 연산된 값을 볼수 있으며 활용할수 있습니다.






  • No labels