elasticsearch对聚合后的结果进行范围筛选

书接上文,
上一篇文章写了elasticsearch对聚合后的结果排序

这一篇写对聚合后的范围筛选。

一般的我们可以在query或filter里使用range进行范围筛选查询,但是我们在聚合里怎么对聚合后的结果筛选出符合范围的聚合结果呢?

dsl语句如下:

  "aggregations": {
    "statistics_assets": {
      "terms": {
        "field": "one_account.one_account_no",
        "size": 10
      },
      "aggregations": {
        "assets": {
          "sum": {
            "field": "assets.merge"
          }
        },
        "assets_sum_range": {
          "bucket_selector": {
            "buckets_path": {
              "key": "assets"
            },
            "script": {
              "source": "0<=params.key&&params.key<=100000",
              "lang": "painless"
            }
          }
        }
      }
    }
  }

assets_sum_range中使用bucket_selector对sum聚合后的"assets.merge"结果进行筛选,筛选的条件范围是0<=聚合结果<=100000

Java代码:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("statistics_assets")
                   .field("one_account.one_account_no")
                   .size(10);       
AggregationBuilder assetsAggregation = AggregationBuilders.sum("assets").field("assets.merge");
termsAggregationBuilder.subAggregation(assetsAggregation);

 //对聚合后的总资产进行范围选择
   Map<String, String> bucketsPathsMap = new HashMap<>();
   bucketsPathsMap.put("key", "assets");
   Script script = new Script( "0<=params.key&&params.key<=100000" );
   BucketSelectorPipelineAggregationBuilder bs = PipelineAggregatorBuilders.bucketSelector("assets_sum_range", bucketsPathsMap, script);
   termsAggregationBuilder.subAggregation(bs);

searchSourceBuilder.aggregation(termsAggregationBuilder);

最后输出的结果便是0-100000范围的聚合结果:

  "aggregations" : {
    "statistics_assets" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 4,
      "buckets" : [
        {
          "key" : "110600000973",
          "doc_count" : 2,
          "assets" : {
            "value" : 0.0
          }
        },
        {
          "key" : "105100015207",
          "doc_count" : 1,
          "assets" : {
            "value" : 9.999
          }
        }
      ]
    }
  }

参考文章:
elasticsearch - how to make bucket filter in java api

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch 聚合结果带字段可以使用 Sub Aggregation 来实现。Sub Aggregation 是在一个 Aggregation 中嵌套另一个 Aggregation,可以对上一层聚合结果进行进一步的分析,包括对字段进行统计、排序等操作。 以下是一个简单的示例代码,实现按照某个字段进行分组,并统计每个分组中另一个字段的平均值: ```java SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 构建聚合条件,按照字段1分组 TermsAggregationBuilder aggregationBuilder1 = AggregationBuilders.terms("agg_name1").field("field1"); // 构建子聚合条件,统计字段2的平均值 AvgAggregationBuilder aggregationBuilder2 = AggregationBuilders.avg("agg_name2").field("field2"); // 将子聚合条件添加到父聚合条件中 aggregationBuilder1.subAggregation(aggregationBuilder2); // 将聚合条件添加到搜索请求中 searchSourceBuilder.aggregation(aggregationBuilder1); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 获取聚合结果 Terms aggResult1 = searchResponse.getAggregations().get("agg_name1"); // 遍历每个分组,获取子聚合结果 for (Terms.Bucket bucket : aggResult1.getBuckets()) { Avg aggResult2 = bucket.getAggregations().get("agg_name2"); double avg = aggResult2.getValue(); System.out.println("Field1: " + bucket.getKeyAsString() + ", Avg of Field2: " + avg); } ``` 需要注意的是,Sub Aggregation 可以嵌套多层,可以根据具体需求进行扩展。同时还可以使用 Bucket Sort Aggregation 对分组结果进行排序,或使用 Bucket Selector Aggregation 对分组结果进行筛选

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值