我的es版本是7.17版本,我想实现按照一个字段值的取值范围进行聚合统计的功能,kibana上的代码如下:
GET /cch_app_charactgroup/_search?q=:
{
"size" : 0,
"aggs" : {
"recognize_types" : {
"range": {
"field" : "policy_duration",
"ranges": [
{"from": 0,"to": 1.0},
{"from": 1.0,"to": 5.0},
{"from": 5,"to": 10.0},
{"from": 10,"to": 15.0},
{"from": 15,"to": 50}
]
}
}
}
}
在kibana上查询到的结果如下:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 6,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"recognize_types" : {
"buckets" : [
{
"key" : "0.0-1.0",
"from" : 0.0,
"to" : 1.0,
"doc_count" : 6
},
{
"key" : "1.0-5.0",
"from" : 1.0,
"to" : 5.0,
"doc_count" : 0
},
{
"key" : "5.0-10.0",
"from" : 5.0,
"to" : 10.0,
"doc_count" : 0
},
{
"key" : "10.0-15.0",
"from" : 10.0,
"to" : 15.0,
"doc_count" : 0
},
{
"key" : "15.0-50.0",
"from" : 15.0,
"to" : 50.0,
"doc_count" : 0
}
]
}
}
}
我不知道与之对应的javaapi应该怎么写,网上也查不到资料
通过研究源码,我已经找到对应的javaapi了,正好分享一波,代码如下:
//定义字段区间范围集合
List<AggregationRange> list = new ArrayList<>();
AggregationRange.Builder builder1 = new AggregationRange.Builder();
builder1.from("0").to("1.0");
list.add(builder1.build());
AggregationRange.Builder builder2 = new AggregationRange.Builder();
builder2.from("1.0").to("5.0");
list.add(builder2.build());
AggregationRange.Builder builder3 = new AggregationRange.Builder();
builder3.from("5.0").to("10.0");
list.add(builder3.build());
//定义请求request对象
SearchRequest searchRequest = new SearchRequest.Builder()
.index(yearCustfeagroupIndexName) //指定索引
.size(0) //查找结果设置为0,可以提高统计查询速度(因为我们本来也不需要hits结果集,只需要聚合结果集aggregations)
.aggregations("recognize_types",a -> a.range(v -> v.field("policy_duration").ranges(list))) //自定义聚合结果key,设置聚合规则为range,指定聚合字段,指定区间范围集合
.q("*:*") //指定查询参数
.build(); //构建searchRequest对象
SearchResponse<Map> searchResponse = elasticsearchClient.search(searchRequest, Map.class);
long num = searchResponse.hits().total().value(); //符合条件的查询结果
Map<String, Aggregate> map = searchResponse.aggregations(); //获取聚合结果aggregations
Aggregate aggregate = map.get("recognize_types"); //根据上面指定的聚合结果key来获取聚合统计结果
List<RangeBucket> buckets = aggregate.range().buckets().array(); //获取各个区间范围统计结果桶
for(RangeBucket bucket:buckets){
System.out.println(bucket.from());
System.out.println(bucket.to());
System.out.println(bucket.fromAsString());
System.out.println(bucket.toAsString());
System.out.println(bucket.key());
System.out.println(bucket.docCount());
System.out.println("---------------->");
}
在java中实现,创建一个Result返回需要的类,获取数据后继续实例化赋值进行返回就可以得到这个接口了哦。
RestHighLevelClient
这个是Java操作ES的api工具
聚合操作可以参考
es 提供了聚合方法
参考一下
https://zhuanlan.zhihu.com/p/343089558
https://wenku.baidu.com/view/c21e6201cfbff121dd36a32d7375a417866fc18f.html
https://blog.csdn.net/zwrlj527/article/details/122369162