elasticsearch之聚合

单值聚合(结果是一个简单的数值等)

1、sum:求和
2、min:最小值
3、max:最大值
4:cardinality:基数(集合中不同元素的个数)
5、avg:平均值

例如:结合javaApi

		SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        AvgAggregationBuilder avgAggregationBuilder = new AvgAggregationBuilder("avg_price")//为聚合函数命名
                .field("price");//聚合的字段
        sourceBuilder.query(QueryBuilders.termQuery("name", "小米"))
                .aggregation(avgAggregationBuilder)//在查询中添加聚合函数
                .size(0);//不返回查询结果
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        Aggregations aggregations = searchResponse.getAggregations();

对应的elastice查询json数据:

{
	"size": 0,
	"query": {
		"term": {
			"name": {
				"value": "小米",
				"boost": 1.0
			}
		}
	},
	"aggregations": {
		"avg_price": {
			"avg": {
				"field": "price"
			}
		}
	}
}

结果:

{
	"hits": {
		"total": {
			"value": 390,
			"relation": "eq"
		},
		"max_score": null,
		"hits": []
	},
	"aggregations": {
		"avg#avg_price": {
			"value": 2613.9487435897437
		}
	}
}

javaApi结果:
在这里插入图片描述

多值聚合

1、terms:统计每一种结果的数量

n、histogram:直方图,区间间隔。比如统计price每隔1000,[0,1000),[1000,2000)…。参数:interval:设置区间间隔、minBound maxBound:指定区间边界、minDocCount:指定每个区间中的结果数量,大于等于才这个值会返回(默认0,即不管有没有结果都返回)

terms举例:javaApi

		SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        TermsAggregationBuilder avgAggregationBuilder = new TermsAggregationBuilder("terms_price")
                .field("price")
                .size(1);//只返回一个'桶'
        sourceBuilder.query(QueryBuilders.termQuery("name", "小米"))
                .aggregation(avgAggregationBuilder)
                .size(0);//不返回查询结果
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        Aggregations aggregations = searchResponse.getAggregations();

对应的elasticSearch语句

{
	"size": 0,
	"query": {
		"term": {
			"name": {
				"value": "小米",
				"boost": 1.0
			}
		}
	},
	"aggregations": {
		"terms_price": {
			"terms": {
				"field": "price",
				"size": 10,
				"min_doc_count": 1,
				"shard_min_doc_count": 0,
				"show_term_doc_count_error": false,
				"order": [
					{
						"_count": "desc"
					},
					{
						"_key": "asc"
					}
				]
			}
		}
	}
}

将每一种price结果放入一个’桶’

{
	"hits": {
		"total": {
			"value": 390,
			"relation": "eq"
		},
		"max_score": null,
		"hits": []
	},
	"aggregations": {
		"dterms#terms_price": {
			"doc_count_error_upper_bound": 0,
			"sum_other_doc_count": 271,
			"buckets": [
				{
					"key": 1299.0,
					"doc_count": 18
				},
				{
					"key": 1999.0,
					"doc_count": 15
				}
				......
			]
		}
	}
}

在这里插入图片描述
price为1299的数据有18条

多个聚合函数

一个查询语句中可以添加多个聚合函数,这些聚合是平级的。和嵌套聚合有所区别
javaApi:

		SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        AvgAggregationBuilder avgAggregationBuilder = new AvgAggregationBuilder("avg_price")
                .field("price");
        MaxAggregationBuilder maxAggregationBuilder = new MaxAggregationBuilder("terms_price")
                .field("price");
        sourceBuilder.query(QueryBuilders.termQuery("name", "小米"))
                .aggregation(avgAggregationBuilder)//添加第一个聚合函数
                .aggregation(maxAggregationBuilder)//添加第二个聚合函数
                .size(0);//不返回查询结果
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        Aggregations aggregations = searchResponse.getAggregations();

对应的语句:

{
	"size": 0,
	"query": {
		"term": {
			"name": {
				"value": "小米",
				"boost": 1.0
			}
		}
	},
	"aggregations": {
		"avg_price": {
			"avg": {
				"field": "price"
			}
		},
		"max_price": {
			"max": {
				"field": "price"
			}
		}
	}
}

结果:

{
	"hits": {
		"total": {
			"value": 390,
			"relation": "eq"
		},
		"max_score": null,
		"hits": []
	},
	"aggregations": {
		"max#max_price": {
			"value": 18999.0
		},
		"avg#avg_price": {
			"value": 2613.9487435897437
		}
	}
}

在这里插入图片描述

嵌套聚合

注意嵌套聚合和平级聚合的区别
javaApi构造:

		SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        TermsAggregationBuilder termsAggregationBuilder = new TermsAggregationBuilder("terms_price")
                .field("price");
        AvgAggregationBuilder avgAggregationBuilder = new AvgAggregationBuilder("avg_price")
                .field("price");
        MaxAggregationBuilder maxAggregationBuilder = new MaxAggregationBuilder("max_price")
                .field("price");
        termsAggregationBuilder.subAggregation(maxAggregationBuilder);//嵌套子聚合
        sourceBuilder.query(QueryBuilders.termQuery("name", "小米"))
                .aggregation(termsAggregationBuilder)//添加聚合函数
                .aggregation(avgAggregationBuilder)//添加平级聚合函数
                .size(0);//不返回查询结果
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        Aggregations aggregations = searchResponse.getAggregations();

对应语句:

在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值