ElasticSearch 실전 시리즈 5: ElasticSearch의 집합 조회 기초 사용 강좌의 도량(Metric) 집합

9241 단어 ElasticSearch
Title: ElasticSearch 실전 시리즈 4: ElasticSearch의 집합 조회 기초 사용 강좌의 도량(Metric) 집합

앞말


전편에서는 ElasticSearch 실전 시리즈 3: ElasticSearch의 JAVA API 사용 강좌를 소개하고, ElasticSearch Java API 기반의 문법, 기본적인 첨삭 수정(SQL 문장에 대응)을 소개하였으며, 이번 편에서는 ElasticSearch 집합 조회의 JAVA API와 DSL 문장 사용을 소개하였다.

ElasticSearch Aggregation


집합 프레임워크는 검색 검색을 바탕으로 집합 데이터를 제공하는 데 도움이 된다.이것은 집합이라고 불리는 간단한 구축 블록을 바탕으로 복잡한 데이터 요약을 구축하기 위해 조합할 수 있다.집합은 하나의 문서에 정보를 분석하는 작업 단원을 만드는 것으로 볼 수 있다.수행된 컨텍스트는 이 문서 세트가 무엇인지를 정의합니다(예: 검색 요청이 수행된 질의/필터의 컨텍스트에서 톱 레벨 집합이 수행됨).많은 서로 다른 유형의 집합이 있는데, 모든 집합은 자신의 목적과 출력을 가지고 있다.이러한 유형을 더 잘 이해하기 위해 일반적으로 그것들을 네 개의 주요 가족으로 나누기 쉽다.
  • Metric:

  • 문서의 집합을 추적하고 계산합니다.이러한 값은 일반적으로 문서의 필드에서 추출되지만 (필드 데이터 사용) 스크립트를 사용하여 생성할 수도 있습니다.
  • Bucketing:

  • 모든 저장소는 키와 문서 조건과 연결되어 있는 저장소 집합을 생성합니다.집합을 수행하면 컨텍스트의 각 문서에 대해 모든 스토리지 배럴 조건이 평가되고 조건이 일치하면 해당 문서는 [드롭] 관련 스토리지 배럴로 간주됩니다.집합 프로세스가 끝날 때, 우리는 하나의 저장 통 목록을 얻을 것이다. - 모든 저장 통에는 속하는 문서가 하나 있다.
  • Matrix:

  • 여러 필드를 조작하고 요청한 문서 필드에서 추출한 값에 따라 행렬 결과의 집합을 생성합니다.Metric과 Bucketing과 달리 이 집합은 스크립트를 지원하지 않습니다!
  • Pipeline:

  • 그것은 다른 집합의 출력과 관련된 Metric을 집합합니다.
    각 스토리지 통은 문서 세트를 효과적으로 정의하므로 (모든 파일이 해당 스토리지 통에 속함) 스토리지 통 수준에서 연관된 집합이 잠재적으로 있을 수 있으며 이러한 집합은 해당 스토리지 통의 컨텍스트에서 수행됩니다.이것이 바로 집합의 진정한 힘이다. 집합은 끼워 넣을 수 있다!
    메모리 통 집합은 하위 집합 (스토리지 통 또는 지표) 을 가질 수 있다.하위 집합은 부모 집합으로 생성된 저장소 통을 계산합니다.중첩 집합의 수준/깊이에는 경도 제한이 없습니다. 중합을 부모 집합에 중첩할 수 있습니다. 이 모 집합 자체는 다른 더 높은 집합의 하위 집합입니다.집합은 더블 데이터의 표시 형식에 사용된다.따라서 절대치가 큰 다중 헤더를 실행할 때 결과는 비슷한 2^53일 수 있다.

    메트릭 집선


    수치 지표 집합은 특수한 유형의 지표 집합으로 수치를 출력할 수 있다.일부 집합은 단일 수치 도량(예를 들어 avg)을 출력하고single-valuenumericmetricsaggregation이라고 불리며, 다른 집합은 여러 개의 도량(예를 들어stats)을 생성하고multi-valuenumericmetricsaggregation이라고 부른다.이러한 값이 일부 저장소 집합의 직접 하위 집합 (일부 저장소 집합은 모든 저장소의 디지털 도량을 바탕으로 되돌아오는 저장소 집합을 정렬할 수 있도록 함) 을 충당할 때, 단일 값과 다중 값 디지털 도량 집합 간의 차이가 작용할 것이다.
    도량(Metric) 집합은 Elastic Search 공식 문서에서 매우 중합됩니다. 여기서 저는 우리가 가장 자주 사용하는 몇 가지 집합 예시만 열거합니다.

    avg 집합


    계산된 평균 개는 모인 문서에서 수치를 추출합니다.이 값은 문서의 특정 숫자 필드에서 추출할 수도 있고 제공된 스크립트에서 생성할 수도 있습니다.
    여기서 우리는 하나의 예시로 설명하여 한 반의 학생 점수 평균 점수를 얻었다.
    DSL 문장의 예:
    POST /student/_search?size=0
    {
        "aggs" : {
            "avg_grade" : { "avg" : { "field" : "grade" } }
        }
    }
    

    주:grade 필드 형식은 정형이어야 합니다
    물론 성적에 무게(weight)가 포함되어 있다면, 우리는 그것을 위해 무게를 추가할 수 있다.권중: 일반적인 평균치를 계산할 때 모든 데이터 포인트는 같은'권중'을 가지고 있다... 최종 값에 대한 기여는 균등하다.가중치가 클수록 앞으로 나아간다고 이해할 수 있다. 가중 공식은 ∑(value*weight)/∑(weight)이다.
    DSL 문장의 예:
    POST /student/_search
    {
        "size": 0,
        "aggs" : {
            "weighted_grade": {
                "weighted_avg": {
                    "value": {
                        "field": "grade"
                    },
                    "weight": {
                        "field": "weight"
                    }
                }
            }
        }
    }
    

    max/min 집합


    여기서 우리는 하나의 예시로 설명하여 반의 최고 점수와 최저 점수를 얻었다.
    DSL 문장의 예:
    POST /student/_search?size=0
    {
        "aggs" : {
            "max_grade" : { "max" : { "field" : "grade" } }
        }
    }
    
    POST /student/_search?size=0
    {
        "aggs" : {
            "min_grade" : { "min" : { "field" : "grade" } }
        }
    }
    

    sum 중합


    필드의 총 값을 얻습니다.
    DSL 문장의 예:
    POST /student/_search?size=0
    {
       
        "aggs" : {
            "sum_grade" : { "sum" : { "field" : "grade" } }
        }
    }
    

    top 집합


    하나의 top_hits 지표 집합은 집합에 의해 가장 관련된 문서를 추적합니다.이 집합기는 가장 일치하는 문서를 메모리 구역별로 집계할 수 있도록 하위 집합기로 사용하기 위한 것이다.이 top_hits 집합기는 일부 필드를 통해 삽 집합기를 통해 결과를 집합하는 데 효과적으로 사용할 수 있다.하나 이상의 저장소 집합기는 결과 집합을 어떤 속성으로 자르는지 결정합니다.
    옵션
  • from - 추출할 첫 번째 결과와의 편이성..
  • size - 저장소마다 가장 일치하는 항목의 최대 수량을 되돌려줍니다.기본적으로 세 번째 일치 항목을 되돌려줍니다.sort - 인기 일치하는 항목의 정렬 방식입니다.기본적으로 명중은 주요 조회의 점수에 따라 정렬됩니다

  • 여기서 우리는 여전히 하나의 예시를 통해 설명한다.grade (성적) 의 내림차순으로 이전 두 개의 데이터를 취하면 필드는grade (성적) 와name (이름) 만 포함합니다.
    DSL 문장의 예:
    POST /student/_search?size=0
    {
        "aggs": {
            "top_tags": {
                "terms": {
                    "field": "grade",
                    "size": 2
                },
                "aggs": {
                    "top_sales_hits": {
                        "top_hits": {
                            "sort": [
                                {
                                    "grade": {
                                        "order": "desc"
                                    }
                                }
                            ],
                            "_source": {
                                "includes": [ "grade", "name" ]
                            },
                            "size" : 1
                        }
                    }
                }
            }
        }
    }
    

    JAVA 코드 예

    
     /**
         * @Author pancm
         * @Description  
         * @Date  2019/4/1
         * @Param []
         * @return void
         **/
        private static  void avgSearch() throws IOException {
    
            String buk="t_grade_avg";
            // 
            AggregationBuilder aggregation = AggregationBuilders.avg(buk).field("grade");
            logger.info(" :");
            agg(aggregation,buk);
    
        }
    
        private static  void maxSearch() throws  IOException{
            String buk="t_grade";
            AggregationBuilder aggregation = AggregationBuilders.max(buk).field("grade");
            logger.info(" :");
            agg(aggregation,buk);
        }
    
        private static  void sumSearch() throws  IOException{
            String buk="t_grade";
            AggregationBuilder aggregation = AggregationBuilders.sum(buk).field("grade");
            logger.info(" :");
            agg(aggregation,buk);
        }
    
      private static SearchResponse search(AggregationBuilder aggregation) throws IOException {
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices("student");
            searchRequest.types("_doc");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            // 
            searchSourceBuilder.explain(false);
            // 
            searchSourceBuilder.fetchSource(false);
            // 
            searchSourceBuilder.version(false);
            searchSourceBuilder.aggregation(aggregation);
            logger.info(" :"+searchSourceBuilder.toString());
            searchRequest.source(searchSourceBuilder);
            //  
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            return  searchResponse;
        }
    
    protected  static  void agg(AggregationBuilder aggregation, String buk) throws  IOException{
            SearchResponse searchResponse = search(aggregation);
            if(RestStatus.OK.equals(searchResponse.status())) {
                //  
                Aggregations aggregations = searchResponse.getAggregations();
    
                if(buk.contains("avg")){
                    // 
                    Avg ba = aggregations.get(buk);
                    logger.info(buk+":" + ba.getValue());
                    logger.info("------------------------------------");
                }else if(buk.contains("max")){
                    // 
                    Max ba = aggregations.get(buk);
                    logger.info(buk+":" + ba.getValue());
                    logger.info("------------------------------------");
    
                }else if(buk.contains("min")){
                    // 
                    Min ba = aggregations.get(buk);
                    logger.info(buk+":" + ba.getValue());
                    logger.info("------------------------------------");
                }else if(buk.contains("sum")){
                    // 
                    Sum ba = aggregations.get(buk);
                    logger.info(buk+":" + ba.getValue());
                    logger.info("------------------------------------");
                }else if(buk.contains("top")){
                    // TopHits
                    TopHits ba = aggregations.get(buk);
                    logger.info(buk+":" + ba.getHits().totalHits);
                    logger.info("------------------------------------");
                }
    
            }
        }
    
    

    기타


    참조:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/search-aggregations.html
    이 글의 코드는 이미 본인의java-study 프로젝트에 수록되어 있습니다. 관심이 있으시면 스타,fork,issues를 환영합니다.프로젝트 주소:https://github.com/xuwujing/java-study
    ElasticSearch 실전 시리즈:
  • ElasticSearch 실전 시리즈 1: ElasticSearch 집단 + Kinaba 설치 강좌
  • ElasticSearch 실전 시리즈 2: ElasticSearch의 DSL 문장 사용 강좌 - 도문 상세
  • ElasticSearch 실전 시리즈 3: ElasticSearch의 JAVA API 사용 강좌
  • ElasticSearch 실전 시리즈 4: ElasticSearch 이론 지식 소개

  • 음악 추천


    오리지널은 쉽지 않아요. 느낌이 좋으면 추천해 주세요!당신의 지지는 나의 창작의 가장 큰 동력입니다!저작권 성명: 저자: 허무경 블로그원 출처:http://www.cnblogs.com/xuwujingCSDN 출처:http://blog.csdn.net/qazwsxpcm개인 블로그 출처:http://www.panchengming.com

    좋은 웹페이지 즐겨찾기