Elasticsearch 中如何巧妙地使用聚合函数达到数据库中having的效果

本文介绍了如何在Elasticsearch中利用聚合函数模拟数据库的HAVING条件,通过minDocCount参数进行初步筛选,并结合Top Hits Aggregation在聚合结果中返回相关字段信息,确保数据一致性。
摘要由CSDN通过智能技术生成

在现实开发中难免会遇到一些业务场景,通过聚合得出相应的频次并进行筛选

1.使用 minDocCount  直接上代码,大家可自行根据业务场景更改

 

//正确答案
SearchRequestBuilder search = transportlient.prepareSearch("bigdata_idx_2").setTypes("captureCompare");
FilterAggregationBuilder sub= AggregationBuilders.filter("channel_longitudeC").filter(QueryBuilders.rangeQuery("fcmp_time").from(startTime).to(endTime));
//分组字段是id,排序由多个字段排序组成
TermsBuilder tb= AggregationBuilders.terms("fcmp_fobj_id").field("fcmp_fobj_id").valueType(Terms.ValueType.STRING).order(Terms.Order.compound(
Terms.Order.aggregation("channel_longitudeC",false)//先按count,降序排
//如果count相等情况下,使用code的和排序
));
//求和字段1
ValueCountBuilder sb= AggregationBuilders.count("channel_longitudeC");
tb.subAggregation(sb).minDocCount(400);//添加到分组聚合请求中

//将分组聚合请求插入到主请求体重
// search.setPostFilter()
search.addAggregation(tb);
Elasticsearch是一个开源的搜索引擎,它提供了丰富的聚合功能。在Java使用Elasticsearch进行聚合查询,可以使用Elasticsearch的Java API。聚合查询主要使用AggregationBuilders进行构建。可以用它来创建各种聚合查询,如桶,指标,嵌套聚合等。下面是一个简单的示例代码,用于按颜色分组获取每个卖出数量: ``` private RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://localhost:9200"))); @Test public void jh1() throws IOException { SearchRequest searchRequest = new SearchRequest("tvs"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_color").field("color"); searchSourceBuilder.aggregation(termsAggregationBuilder); searchRequest.source(searchSourceBuilder); SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT); Aggregations aggregations = response.getAggregations(); Terms group_color = aggregations.get("group_color"); List<? extends Terms.Bucket> buckets = group_color.getBuckets(); for (Terms.Bucket bucKey : buckets){ System.out.println(bucKey.getKeyAsString() + " == " + bucKey.getDocCount()); } } ``` 在这个示例,我们首先创建了一个RestHighLevelClient客户端,然后创建了一个SearchRequest和SearchSourceBuilder对象。接下来,我们使用AggregationBuilders创建了一个terms聚合器,用于按颜色对文档进行分组,并将聚合器添加到SearchSourceBuilder对象。然后,我们使用SearchRequest对象执行查询,并使用response.getAggregations()获取聚合结果。最后,我们对结果进行遍历并打印每个分组的键和文档数量。 --相关问题--:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格赚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值