Elasticsearch聚合分析(三)
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类的对照关系:
- AggregationBuilders:聚合的构建工厂类。所有聚合都由这个类来构建,看看他的静态方法:
嵌套聚合
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());
}
}
}
看完如果对你有帮助,感谢点赞支持!
如果你是电脑端,看到右下角的 一键三连 了吗,没错点它[哈哈]