栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

elasticsearch之聚合

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();

对应语句:


结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672175.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号