V5.X,Springboot的ES template使用总 (版本超级旧)

简单查询— be like select * from where

   BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
     //精准查询,注意这个keyword 如果不加会分词 
   queryBuilder.must(QueryBuilders.matchQuery("字段名.keyword", 入参));    
   //时间范围查询 
   queryBuilder.must(QueryBuilders.rangeQuery("存时间的字段").gte(开始时间).lte(结束时间));
   NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
   nativeSearchQueryBuilder.withQuery(queryBuilder);
   //排序
   FieldSortBuilder order = SortBuilders.fieldSort("要排序的字段.keyword").order(SortOrder.DESC);
   nativeSearchQueryBuilder.withSort(order);
   //PageRequest number 从0开始  (巨坑点)
  nativeSearchQueryBuilder.withPageable(PageRequest.of(vo.getPageNum() - 1, vo.getPageSize()));
  //  Page<接收对象>  entity= elasticsearchTemplate.queryForPage(nativeSearchQueryBuilder.build(), 接收对象.class);  
  //两种分页查询
	Page<接收对象> entity= repository.search(nativeSearchQueryBuilder.build());

聚合查询使用,分桶什么的

简单聚合 avg count max min

		BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        //size(设置桶的数量大小) 如果自己不设置 会有一个默认桶大小10
        //这个group是自定义名字
        TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("group").field(param).size(size);
        //过滤
        queryBuilder.must(QueryBuilders.termsQuery(过滤入参, values));
        queryBuilder.must(QueryBuilders.rangeQuery("request_timeymdhms").gte(startTime).lte(endTime));

        //聚合查询
        AvgAggregationBuilder avg = AggregationBuilders.avg("avg_cost").field("需要聚合的字段");
        MinAggregationBuilder min = AggregationBuilders.min("min_cost").field("需要聚合的字段");
        MaxAggregationBuilder max = AggregationBuilders.max("max_cost").field("需要聚合的字段");
        //多个聚合查询
        aggregationBuilder.subAggregation(avg).subAggregation(min).subAggregation(max);
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(queryBuilder);
        nativeSearchQueryBuilder.withSearchType(SearchType.DEFAULT);
        nativeSearchQueryBuilder.addAggregation(aggregationBuilder);
        Aggregations aggregations = elasticsearchTemplate.query(nativeSearchQueryBuilder.build(), new ResultsExtractor<Aggregations>() {
            @Override
            public Aggregations extract(SearchResponse response) {
                return response.getAggregations();
            }
        });
   //处理获取的数据
  Map<String, Aggregation> map = aggregations.asMap();
  List<StringTerms.Bucket> buckets = ((StringTerms) map.get("group")).getBuckets();
  buckets.forEach(e -> {
       // 过滤入参--e.getKeyAsString();
      //文档总数  e.getDocCount();
      System.out.println(e.getKeyAsString() + ":-----" + e.getDocCount());
      //平均数 最大值那些
      List<Aggregation> list = e.getAggregations().asList();
      for (Aggregation aggregation : list) {
          System.out.println(aggregation.getName() + "------" + aggregation.getType());
          if ("max".equals(aggregation.getType())) {
              //最大值,用double装的
              ((InternalMax) aggregation).getValue();
          } else if ("min".equals(aggregation.getType())) {
              ((InternalMin) aggregation).getValue();
          } else if ("avg".equals(aggregation.getType())) {
              //处理平均值
              double avg = ((InternalAvg) aggregation).getValue();            
          }
      } 
  });

过滤分桶再排序

例如 统计某个接口的平均用时最长的前十名

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        //聚合查询
        AvgAggregationBuilder avg = AggregationBuilders.avg("avg_cost").field("ES时间字段");
        TermsAggregationBuilder aggregationBuilder = AggregationBuilders
                .terms("group")
                .field("要统计的字段.keyword")
                .size(10)
                .subAggregation(avg)
                //每个桶按照avg的值来排序
                .order(Terms.Order.aggregation(avg.getName(), "value", false));  //排序 "这个value是报错让我这么写的"
      //  String endDate "时间过滤 自己决定要不要";
       // String startDate = "";
        queryBuilder.must(QueryBuilders.rangeQuery("ES的时间字段").gte(startDate).lte(endDate));
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(queryBuilder);
        nativeSearchQueryBuilder.addAggregation(aggregationBuilder);
        Aggregations aggregations = elasticsearchTemplate.query(nativeSearchQueryBuilder.build(), new ResultsExtractor<Aggregations>() {
            @Override
            public Aggregations extract(SearchResponse response) {
                return response.getAggregations();
            }
        });
        Map<String, Aggregation> map = aggregations.asMap();
        List<StringTerms.Bucket> buckets = ((StringTerms) map.get("group")).getBuckets();
       
        //组装 
       这里和上面聚合拿数据一样的
    }
    ```



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值