Elasticsearch聚合分析(三) 21/5/27

bucket和metric聚合分析整合

  • Bucket聚合分析允许通过添加子分析来进一步进行分析,该子分析可以是Bucket也可以是Metric。这也使得es的聚合分析能力变得异常强大。
GET /LGlink/_search
{
  "size": 0,
  "aggs": {
    "city_bucket": {
      "terms": {
        "field": "city",
        "size": 10
      },
      "aggs": {
        "age": {
          "stats": {
            "field": "age"
          }
        }
      }
    }
  }
}

聚合为桶

  • 桶就是分组,比如这里我们按照品牌brand进行分组:
GET /item/_search
{
  "size": 0,
  "aggs": {
    "brands": {
      "terms": {
        "field": "brand",
        "size": 10
      }
    }
  }
}
@Test
public void testAgg() {
    
    
    //1 聚合条件
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    queryBuilder.addAggregation(AggregationBuilders.terms("brands").field("brand"));

    //2 查询获得聚合对象
    AggregatedPage<Item> aggPage = (AggregatedPage<Item>)this.itemRepository.search(queryBuilder.build());

    //3 解析结果:获得brands聚合内容
    ParsedStringTerms agg = (ParsedStringTerms) aggPage.getAggregation("brands");

    //4 遍历内容
    List<? extends Terms.Bucket> buckets = agg.getBuckets();
    for (Terms.Bucket bucket : buckets) {
    
    
        System.out.print(bucket.getKeyAsString() + " : ");
        System.out.println(bucket.getDocCount());
    }

}
  • 关键API
    • AggregationBuilders:聚合的构建工厂类。所有聚合都由这个类来构建,看看他的静态方法:
      在这里插入图片描述
      •AggregatedPage:聚合查询的结果类。它是Page的子接口:
      在这里插入图片描述
      AggregatedPage在Page功能的基础上,拓展了与聚合相关的功能,它其实就是对聚合结果的一种封装,大家可以对照聚合结果的JSON结构来看。
      在这里插入图片描述
      而返回的结果都是Aggregation类型对象,不过根据字段类型不同,又有不同的子类表示
      在这里插入图片描述
      我们看下页面的查询的JSON结果与Java类的对照关系:
      在这里插入图片描述

嵌套聚合

GET /item/_search
{
  "size": 0,
  "aggs": {
    "brands": {
      "terms": {
        "field": "brand",
        "size": 10
      },
      "aggs": {
        "price_range": {
          "range": {
            "field": "price",
            "ranges": [
              {
                "to": 3300
              },
              {
                "from": 3300,
                "to": 4000
              },
              {
                "from": 4000
              }
            ]
          }
        }
      }
    }
  }
}
@Test
public void testSubAgg() {
    
    
    //1 聚合条件
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

    //1.1 设置品牌聚合
    TermsAggregationBuilder brandAgg = AggregationBuilders.terms("brands").field("brand");
    //1.2 设置子聚合数据
    RangeAggregationBuilder priceAgg = AggregationBuilders.range("price_range").field("price");
    priceAgg.addUnboundedTo(3300).addRange(3300,4000).addUnboundedFrom(4000);
    //1.3 父子聚合
    brandAgg.subAggregation(priceAgg);
    //1.4 添加聚合条件
    queryBuilder.addAggregation(brandAgg);

    //2 查询获得聚合对象
    AggregatedPage<Item> aggPage = (AggregatedPage<Item>)this.itemRepository.search(queryBuilder.build());

    //3 解析结果:获得brands聚合内容
    ParsedStringTerms agg = (ParsedStringTerms) aggPage.getAggregation("brands");

    //4 遍历内容
    List<? extends Terms.Bucket> buckets = agg.getBuckets();
    for (Terms.Bucket bucket : buckets) {
    
    
        System.out.print(bucket.getKeyAsString() + " : ");
        System.out.println(bucket.getDocCount());

        ParsedStringTerms.ParsedBucket parsedBucket = (ParsedStringTerms.ParsedBucket) bucket;
        Aggregations aggregations = parsedBucket.getAggregations();
        ParsedRange priceParsedRange = (ParsedRange)aggregations.get("price_range");
        List<? extends Range.Bucket> rangebuckets = priceParsedRange.getBuckets();
        for (Range.Bucket rangebucket : rangebuckets) {
    
    
            System.out.print(rangebucket.getKeyAsString() + ": \t\t");
            System.out.print(rangebucket.getFrom() + "\t");
            System.out.print(rangebucket.getTo() + "\t");
            System.out.println(rangebucket.getDocCount());
        }

    }

}

看完如果对你有帮助,感谢点赞支持!
如果你是电脑端,看到右下角的 一键三连 了吗,没错点它[哈哈]
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LiGuanLink/article/details/117330315