Elasticsearch分组--- java api 实现

这篇具有很好参考价值的文章主要介绍了Elasticsearch分组--- java api 实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章 将已实战的方式带你 实现es 的各种分组操作

1.:按照颜色分组,计算每个颜色卖出的个数

elasticsearch 分组,elasticsearch,elasticsearch,java,搜索引擎

 @Autowired
    RestHighLevelClient restHighLevelClient ;

    private String tvIndex = "tvs" ;

    @Test
    public void testAgg() throws IOException {
        //1. 构建请求
        SearchRequest request = new SearchRequest(tvIndex);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

          // 构建查询
            // size(0) :不需要 查询的结果 , 只需要分组的结果
        searchSourceBuilder.size(0) ;
        searchSourceBuilder.query(QueryBuilders.matchAllQuery()) ;

          // 构建Agg
        TermsAggregationBuilder colorAgg = AggregationBuilders.terms("group_by_color").field("color");

         // agg结合进 searchSourceBuilder
        searchSourceBuilder.aggregation(colorAgg);


        //结合
        request.source(searchSourceBuilder);

        //2. 执行

        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);

        //3.处理返回结果
        Aggregations aggregations = searchResponse.getAggregations();

          //他是按照Terms 进行聚合的 所以取出来也需要 Terms 获取运行结果
        Terms colorAggRes = aggregations.get("group_by_color");
        List<? extends Terms.Bucket> colorBuckets = colorAggRes.getBuckets();

        // 遍历结果
        for (Terms.Bucket colorBucket : colorBuckets) {
            System.out.println("key: "+ colorBucket.getKeyAsString());
            System.out.println("docCount: "+colorBucket.getDocCount());
            System.out.println("=================");
        }

    }


elasticsearch 分组,elasticsearch,elasticsearch,java,搜索引擎
elasticsearch 分组,elasticsearch,elasticsearch,java,搜索引擎

2.统计每种颜色电视平均价格

GET /tvs/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": { 
            "avg_price": { 
               "avg": {
                  "field": "price" 
               }
            }
         }
      }
   }
}



 @Test
    public void testAgg02() throws IOException {
        //1. 构建请求
        SearchRequest request = new SearchRequest(tvIndex);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 构建查询
        // size(0) :不需要 查询的结果 , 只需要分组的结果
        searchSourceBuilder.size(0) ;
        searchSourceBuilder.query(QueryBuilders.matchAllQuery()) ;

        // 构建Agg
        TermsAggregationBuilder colorAgg = AggregationBuilders.terms("group_by_color").field("color");
        colorAgg.subAggregation(AggregationBuilders.avg("avgPrice").field("price"));


        // agg结合进 searchSourceBuilder
        searchSourceBuilder.aggregation(colorAgg);


        //结合
        request.source(searchSourceBuilder);

        //2. 执行

        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);

        //3.处理返回结果
        Aggregations aggregations = searchResponse.getAggregations();
        //他是按照Terms 进行聚合的 所以取出来也需要 Terms 获取运行结果
        Terms colorAggRes = aggregations.get("group_by_color");
        List<? extends Terms.Bucket> colorBuckets = colorAggRes.getBuckets();

        // 遍历结果
        for (Terms.Bucket colorBucket : colorBuckets) {
            System.out.println("key: "+ colorBucket.getKeyAsString());
            System.out.println("docCount: "+colorBucket.getDocCount());

            //获得子聚合
            Aggregations subAgg = colorBucket.getAggregations();
              // 他是一个AVG 的聚合
            Avg avgPrice = subAgg.get("avgPrice");
            double value = avgPrice.getValue();
            System.out.println("已颜色区分的话平均价格是: "+value);
            System.out.println("=================");
        }

    }

需求三:按照颜色分组,计算每个颜色卖出的个数,以及每个颜色卖出的平均值、最大值、最小值、总和。

GET /tvs/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": { 
            "avg_price": { 
               "avg": {
                  "field": "price" 
               }
            }
         }
      }
   }
}


 // 需求三:按照颜色分组,计算每个颜色卖出的个数,以及每个颜色卖出的平均值、最大值、最小值、总和。
    @Test
    public void testAgg03() throws IOException {
        //1. 构建请求
        SearchRequest request = new SearchRequest(tvIndex);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 构建查询
        // size(0) :不需要 查询的结果 , 只需要分组的结果
        searchSourceBuilder.size(0) ;
        searchSourceBuilder.query(QueryBuilders.matchAllQuery()) ;

        // 构建Agg
        TermsAggregationBuilder colorAgg = AggregationBuilders.terms("group_by_color").field("color");
        colorAgg.subAggregation(AggregationBuilders.avg("avgPrice").field("price"));
        colorAgg.subAggregation(AggregationBuilders.max("maxPrice").field("price"));
        colorAgg.subAggregation(AggregationBuilders.min("minPrice").field("price"));

        // agg结合进 searchSourceBuilder
        searchSourceBuilder.aggregation(colorAgg);


        //结合
        request.source(searchSourceBuilder);

        //2. 执行
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);

        //3.处理返回结果
        Aggregations aggregations = searchResponse.getAggregations();
        //他是按照Terms 进行聚合的 所以取出来也需要 Terms 获取运行结果
        Terms colorAggRes = aggregations.get("group_by_color");
        List<? extends Terms.Bucket> colorBuckets = colorAggRes.getBuckets();

        // 遍历结果
        for (Terms.Bucket colorBucket : colorBuckets) {
            System.out.println("key: "+ colorBucket.getKeyAsString());
            System.out.println("docCount: "+colorBucket.getDocCount());

            //获得子聚合
            Aggregations subAgg = colorBucket.getAggregations();
            // 他是一个AVG 的聚合
            Avg avgPrice = subAgg.get("avgPrice");
            Max maxPrice = subAgg.get("maxPrice");
            Min minPrice = subAgg.get("minPrice");

            double value = avgPrice.getValue();
            System.out.println("已颜色区分的话平均价格是: "+avgPrice.getValue());
            System.out.println("已颜色区分的话最大价格是: "+maxPrice.getValue());
            System.out.println("已颜色区分的话最小价格是: "+minPrice.getValue());
            System.out.println("=================");
        }

    }



划分范围 histogram 按照2000进行分组

GET /tvs/_search
{
   "size" : 0,
   "aggs":{
      "price":{
         "histogram":{ 
            "field": "price",
            "interval": 2000
         },
         "aggs":{
            "income": {
               "sum": { 
                 "field" : "price"
               }
             }
         }
      }
   }
}

 @Test
    public void testAgg05() throws IOException {

        SearchRequest request = new SearchRequest(tvIndex);

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery()) ;
        searchSourceBuilder.size(0) ;

        // price agg
        HistogramAggregationBuilder priceAgg =
                AggregationBuilders.histogram("priceAggIn").field("price").interval(2000);

           // price agg sum
        priceAgg.subAggregation(AggregationBuilders.sum("sumPrice").field("price"));

        //综合
        searchSourceBuilder.aggregation(priceAgg) ;
        request.source(searchSourceBuilder) ;

        //执行查询
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);

        // 获得 Agg
        Aggregations aggregations = searchResponse.getAggregations();
        Histogram priceAggIn = aggregations.get("priceAggIn");
        for (Histogram.Bucket bucket : priceAggIn.getBuckets()) {
            System.out.println("priceAggIn的总数是: "+bucket.getDocCount());
            System.out.println("priceAggIn的key 是: "+bucket.getKeyAsString());
            Aggregations subAgg = bucket.getAggregations();
            Sum sumPrice = subAgg.get("sumPrice");
            System.out.println("价格区间中的总价是: "+sumPrice.getValue());
        }
    }

elasticsearch 分组,elasticsearch,elasticsearch,java,搜索引擎文章来源地址https://www.toymoban.com/news/detail-529537.html

按照季度进行间隔

GET /tvs/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold_date",
            "interval": "month", 
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2019-01-01",
                "max" : "2020-12-31"
            }
         }
      }
   }
}

 // 按照季度进行间隔
    @Test
    public void t3() throws IOException {

    SearchRequest searchRequest = new SearchRequest(tvIndex);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery()) ;
        searchSourceBuilder.size(0) ;

        // make Agg
        DateHistogramAggregationBuilder dataHis = AggregationBuilders.dateHistogram("dataHistogram")
                .field("sold_date")
                //按照季度进行分组
                .calendarInterval(DateHistogramInterval.QUARTER)
                .format("yyyy-MM-dd")
                // 以上的min_doc_count参数会强制返回空桶
                .minDocCount(0)
                .extendedBounds(new ExtendedBounds("2019-01-01","2019-01-01")) ;

        //总结
        searchSourceBuilder.aggregation(dataHis);
        searchRequest.source(searchSourceBuilder);

        //查询
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        Aggregations aggregations = searchResponse.getAggregations();
        Histogram  dataHistogram = aggregations.get("dataHistogram");
        for (Histogram.Bucket bucket : dataHistogram.getBuckets()) {
            System.out.println("key :"+bucket.getKeyAsString());
            System.out.println("count :"+bucket.getDocCount());
        }


    }


到了这里,关于Elasticsearch分组--- java api 实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何通过内网穿透实现Java远程连接操作本地Elasticsearch开源搜索和分析引擎

    本文主要介绍在无公网ip环境,如何使用cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch开源搜索和分析引擎。 Cpolar内网穿透提供了更高的安全性和隐私保护,通过使用加密通信通道,Cpolar技术可以确保数据传输的安全性,这为用户和团队提供了更可靠的保护,使他们

    2024年01月23日
    浏览(43)
  • docker安装elasticsearch与head教程完整版—.NET Core Web Api与elasticsearch打造全站全文搜索引擎

    默认已经有docker环境 下载与安装 elasticsearch ,从hub.docker里面可以看到最新版本的镜像,选择你想要的版本 本教程是以 7.17.7 为案例,为啥不适用最新的,首先个人一般需用最新的版本,如果有亢很难填,其次我自己的服务器下载的太慢(还是配置了docker加速地址的)拉取几

    2024年02月10日
    浏览(39)
  • Java的Elasticsearch与搜索引擎

    Elasticsearch是一个基于分布式的实时搜索和分析引擎,它是一个开源的搜索引擎,可以用来构建实时、可扩展的搜索应用程序。Elasticsearch是一个基于Lucene的搜索引擎,它提供了一个分布式、可扩展的搜索引擎,可以处理大量数据并提供实时搜索功能。 Java是Elasticsearch的主要编

    2024年02月20日
    浏览(33)
  • Elasticsearch基础学习(Java API 实现增删查改)

    ElasticSearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。 物理设计: ElasticSearch 在后台把每个索引划分成多个分片,每份分片可以在集群中的不同服务器间迁移

    2024年02月01日
    浏览(70)
  • Java Elasticsearch多条件分组聚合查询

    需求         在项目开发中,需要从elasticsearch中查询日志数据,先统计每一天的日志调用量,然后在每一天的分组聚合基础上,再分组聚合统计成功和失败的日志调用量。 代码

    2024年02月08日
    浏览(42)
  • Java远程连接本地开源分布式搜索引擎ElasticSearch

    简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch。 什么是elasticsearch?一个开源的分布式搜索引擎,具备非常多强大功能,可以用来实现搜索、日志统计、分析、系统监控等功能,可以帮助我们从海量数据中快速找到需要的内容。 Cpolar内网穿透提供了更高

    2024年02月05日
    浏览(36)
  • Java调用Elasticsearch API实现全文检索,搭配MinIO文件存储

    应用背景: 对存储在MinIO服务器的文件实现全文检索。也可以是其他服务器或本地文件,本文仅详细介绍MinIO文件的读取及转换。通过Elasticsearch的Ingest-Attachment插件抽取文件内容,支持Word、Excel、PDF、TXT等格式文件,无需手动解析文件内容。 上代码,详细解释可以阅读注释、

    2024年02月11日
    浏览(30)
  • SpringBoot封装Elasticsearch搜索引擎实现全文检索

    注:本文实现了Java对Elasticseach的分页检索/不分页检索的封装 ES就不用过多介绍了,直接上代码: 创建Store类(与ES字段对应,用于接收ES数据) Elasticsearch全文检索接口:不分页检索 Elasticsearch全文检索接口:分页检索 本文实现了Java对Elasticsearch搜索引擎全文检索的封装 传入

    2024年02月04日
    浏览(34)
  • 用SpringBoot和ElasticSearch实现网盘搜索引擎,附源码,详细教学

    可以扫描小程序码体验,切换到搜索Tabbar。 小程序端界面实现 网页端实现界面 对外提供的api 接口声明 接口实现 执行搜索策略。 提供2种搜索策略,分别是MySQL和ElasticSearch搜索策略。在配置文件进行配置搜索策略。 搜索类型枚举 配置文件中的搜索策略相关配置 es搜索策略实

    2024年02月08日
    浏览(33)
  • ElasticSearch7.3学习(十六)----RestHighLevelClient Java api实现索引的创建、删除、是否存在、关闭、开启

    注意:导入的包区别,不同的包创建索引的方式不同。博主亲身实践,具体体现在createIndexRequest.mapping()里面。读者可自行试验。  由此可以猜想一下: 可以看到上述两种方式导入的包的子类名是相同的,但是具体对索引的操作方式可能是不同的。具体的区别博主暂时还不清

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包