1、 ES聚合分析是什么?
聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。
对一个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合 metric
而关系型数据库中除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行指标聚合。在 ES 中group by 称为分桶,桶聚合 bucketing
下面以es5.6.13为例讲下具体怎么使用聚合函数AggregationBuilder:
2、QueryBuilder和AggregationBuilder区别:
QueryBuilder:构建并组装查询条件(相当于sql中where条件内容)
AggregationBuilder:组装聚合函数,求最大、最小、和、平均值、对数据group by,根据聚合后的值排序
3、如何加到搜索请求中(Transport连接方式):
SearchResponse sr = node.client().prepareSearch()
.setQuery( /* your query */ )
.addAggregation( /* add an aggregation */ )
.execute().actionGet();
4、sql对应讲解:
SELECT
h_name hName,
sum( DATE_SUB( CURDATE( ),INTERVAL 7 DAY ) <= date( create_time ) ) AS userSum
FROM
k_kNowledge_history_search
WHERE
tenant_id =?
AND u_id IN ( )
GROUP BY
h_name
ORDER BY userSum DESC
LIMIT 0,50
省略组装查询条件......
开始组装聚合函数【sql中是在根据hName分组后求一定条件下的数量和】
先列出求和函数:
String afterTime = df.format(CommTool.getAfterDate(new Date(), -7));
//filter是求和条件,要求近七天的数量和
AggregationBuilder agg1=AggregationBuilders.filter("filter1",QueryBuilders.rangeQuery("createTime").gt(afterTime)).subAggregation(AggregationBuilders.sum("userSum").field("num"));
/*也有简单的求和函数,只根据num求和即可
AggregationBuilders.sum("userSum").field("num")*/
把求和函数拼接到group by 操作上:
AggregationBuilders.terms("aggName").size(2147483647).order(Terms.Order.aggregation("filter1",false)).field("hName.keyword").subAggregation(agg1);
//size:聚合的数量,5.x版本之前设置为0即可查询全部,5.x之后可设置为int的最大值保证可返回全部数据
//order:指定排序字段,默认根据分组的字段排序,可以按sum求和后的值进行排序
//field:指定聚合的字段(字段需为keyword类型)
//subAggregation:为聚合函数添加子聚合
5、对应的DSL:
"aggregations" : {
"aggName" : { //自定义名称
"terms" : {
"field" : "hName.keyword",
"size" : 2147483647,
"min_doc_count" : 1,
"shard_min_doc_count" : 0,
"show_term_doc_count_error" : false,
"order" : [
{
"filter1" : "desc"
}
]
},
"aggregations" : {
"filter1" : { //自定义名称
"filter" : {
"range" : {
"createTime" : {
"from" : "2021-07-30 09:28:20",
"to" : null,
"include_lower" : false,
"include_upper" : true,
"boost" : 1.0
}
}
},
"aggregations" : {
"userSum" : {
"sum" : {
"field" : "num"
}
}
}
},
"createTime" : { //每个hName对应最大创建时间
"max" : {
"field" : "createTime"
}
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。