注:聚合的字段不可分词
聚合的分类
dsl聚合
使用dsl实现bucker聚合
#聚合功能
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
}
}
}
}
#实现控制排序
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20,
"order": {
"_count": "asc"
}
}
}
}
}
限定聚合范围
#聚合功能,限定聚合范围
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200
}
}
},
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
}
}
}
}
dsl实现metrics聚合
#嵌套聚合metric
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
},
"aggs": {
"scoreAgg": {
"stats": {
"field": "score"
}
}
}
}
}
}
#根据scoreAgg的avg降序排列
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20,
"order": {
"scoreAgg.avg": "desc"
}
},
"aggs": {
"scoreAgg": {
"stats": {
"field": "score"
}
}
}
}
}
}
java实现聚合(rest client使用)
结果解析
//聚合
@Test
void testAggregation() throws IOException {
//1.准备request
SearchRequest request = new SearchRequest("hotel");
//2.准备dsl
//2.1设置size
request.source().size(0);
//2.2聚合
request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(10));
//3.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
//4.解析结果
Aggregations aggregations = search.getAggregations();
//根据聚合名称获取聚合结果
Terms brandTerms = aggregations.get("brandAgg");
//获取buckets
List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
//遍历
for (Terms.Bucket bucket : buckets) {
//获取key
String keyAsString = bucket.getKeyAsString();
//获取数值
long docCount = bucket.getDocCount();
System.out.println(keyAsString+":"+docCount);
}
}