ES聚合(仅供自己参考)

1、聚合:可以实现对文档数据的统计、分析、运算。聚合常见的是三大类

2、聚合的分类:

1、桶(Bucket)聚合:用来对文档做分组

  • TermAggregation:按照文档字段值分组

  • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

2、度量(Metric)聚合:用以计算一些值,AVG,MAX,MIN,SUM,STATS(都做前面的几个)

3、管道聚合(Pipeline):其他聚合的结果为基础做聚合(比如度量和桶的结果做基础)

4、参与聚合的字段不能是可分词的(Text类型):keyword,Date,数值,布尔

复制代码
#桶聚合,按照字段品牌来分类
GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 25
      }
    }
  }
}

#同聚合,按照字段品牌来分类,同时指定排序方式

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": 10
      }
    }
  }
}

聚合嵌套和Metric聚合

复制代码
#metric聚合和桶聚合和度量聚合的嵌套

GET /hotel/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 20,
        "order": {
          "scoreAgg.avg": "asc"
        }
      },
      "aggs": {        #内嵌一个agg,使得上面每个分类自己计算自己
        "scoreAgg": {
          "stats": {
            "field": "score"
          }
        }
      }
    }
  }
}

java代码:

java 复制代码
package cn.itcast.hotel;

import com.google.protobuf.MapEntry;
import lombok.val;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

@SpringBootTest
public class HotelAggText {

    private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.136.128:9200")
        ));
    }

    @AfterEach
    void tearDown() {
        try {
            client.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Test
    public void bucketAggTest() throws IOException {

        SearchRequest request = new SearchRequest("hotel");
        request.source().size(0);
        request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(20));
        request.source().aggregation(AggregationBuilders.
                terms("starName").field("starName").size(10));
        //查询城市city

        request.source().aggregation(AggregationBuilders
                .terms("city").field("city").size(5));
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        print(response);
    }

    private void print(SearchResponse response)
    {
        Aggregations aggregations = response.getAggregations();
        Terms brandAgg = aggregations.get("brandAgg");
        Terms city =aggregations.get("city");
        List<? extends Terms.Bucket> buckets = brandAgg.getBuckets();
        for (Terms.Bucket bucket : buckets) {
            System.out.println(bucket.getKey() +"  "+bucket.getDocCount());
        }

        List<? extends Terms.Bucket> buckets1 = city.getBuckets();
        for (Terms.Bucket bucket : buckets1) {
            System.out.println(bucket.getKey() +"  "+bucket.getDocCount());
        }
        //Map<String, Aggregation> asMap = aggregations.getAsMap();
        //Aggregation brandAgg = asMap.get("brandAgg");
        //Map<String, Object> metadata = brandAgg.getMetadata();
        //for (Map.Entry<String, Object> entry : metadata.entrySet()) {
        //    System.out.println(entry.getKey() + "  "+entry.getValue());
        //}
    }
}
相关推荐
李恒-聆机智能专精数采5 分钟前
新网站在搜索引擎完全搜不到怎么优化?(四)——提交搜索引擎搜索资源平台
搜索引擎·seo·next.js·百度收录·网站优化
企查查数据服务6 分钟前
从席位订阅到用量计费:Agent 正在重写企业软件商业模式
大数据·人工智能
科莱特SAP31 分钟前
精准匹配双向赋能:科莱特数智人才猎场重塑数字化人才服务模式
大数据·人工智能·物联网·人力资源·科莱特·科莱特人才服务
Ramboooooooo35 分钟前
SkyWalking-10.4.0 Docker + Nacos + Elasticsearch 生产级部署手册
elasticsearch·docker·skywalking
飞飞传输40 分钟前
海关行业FTP传输服务器评测:传统FTP与现代化替代方案对比
大数据·运维·安全
渣渣盟1 小时前
当 Checkpoint 稳定运行后,如何进一步优化 Flink 作业的启动和恢复速度,让大状态作业的扩缩容从“小时级”降到“分钟级”?
大数据·flink
互联网中的一颗神经元11 小时前
04 — 安全撤销:改错了怎么退回去
大数据·安全·elasticsearch
marvelyu14 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
ZCBUS实时计算15 小时前
金融证券实时数仓建设实践:轻量化实时计算平台落地,实现交易数据端到端秒级处理
大数据·数据库·数据仓库·金融·flink·dba·etl
烟雨江南78515 小时前
2026汽车制造与新能源整车柔性产线Agentic-Workflow白皮书:跨APS_MES_ERP多智能体动态排产与装配容错实战
大数据·网络·人工智能·自动化·ai客服·企业agent