GET /czxy2/_search
{
"size": 0, // 不需要返回文档列表
"aggs": {
"min_age": { // 自定义聚合名称
"min": { // 聚合类型
"field": "age"
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"max_age": {
"max": {
"field": "age"
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"sum_age": {
"sum": {
"field": "age"
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"min_age": {
"min": {
"field": "age"
}
},
"sum_age": {
"sum": {
"field": "age"
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"stats_age": {
"stats": {
"field": "age"
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"stats_age": {
"extended_stats": {
"field": "age"
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"per_age": {
"percentiles": {
"field": "age",
"percents": [
1,
5,
25,
50,
75,
95,
99
]
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"per_rank_age": {
"percentile_ranks": {
"field": "age",
"values": [
14,
18,
26
]
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"group_agg": {
"terms": {
"field": "age",
"size": 10
},
"aggs": {
"top_data": {
"top_hits": {
"size": 2,
"sort": [
{
"_id": {
"order": "desc"
}
}
]
}
}
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"city_bucket": {
"terms": {
"field": "city",
"size": 10
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"username_bucket": {
"terms": {
"field": "username",
"size": 10
}
}
}
}
PUT /czxy2/_mapping/user
{
"properties": {
"username": {
"type": "text",
"analyzer": "ik_max_word",
"fielddata": true
}
}
}
Bucket聚合分析之Range,通过指定数值的范围来设定分桶规则。
GET /czxy2/_search
{
"size": 0,
"aggs": {
"age_range": {
"range": {
"field": "age",
"ranges": [
{
"to": 15
},
{
"from": 15,
"to": 20
},
{
"from": 20
}
]
}
}
}
}
GET /czxy2/_search
{
"size": 0,
"aggs": {
"age_hist": {
"histogram": {
"field": "age",
"interval": 5,
"extended_bounds": {
"min": 10,
"max": 30
}
}
}
}
}
GET /czxy2/_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:
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());
}
}
}