ElasticSearch 聚合查询百分比
这里用的是es5.6.9
bucket_script :它执行一个脚本,该脚本可以对多桶聚合中的指定度量执行每桶计算,指定的度量标准必须为数字,并且脚本必须返回数值。
官方语法
https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-pipeline-bucket-script-aggregation.html
- {
- "bucket_script": {
- "buckets_path": {
- "my_var1": "the_sum",
- "my_var2": "the_value_count"
- },
- "script": "params.my_var1 / params.my_var2"
- }
- }
给的一个例子
- 算出t-shirts卖出的钱占总钱数的百分比
- POST /sales/_search
- {
- "size": ,
- "aggs" : {
- "sales_per_month" : {
- "date_histogram" : {
- "field" : "date",
- "interval" : "month"
- },
- "aggs": {
- "total_sales": {
- "sum": {
- "field": "price"
- }
- },
- "t-shirts": {
- "filter": {
- "term": {
- "type": "t-shirt"
- }
- },
- "aggs": {
- "sales": {
- "sum": {
- "field": "price"
- }
- }
- }
- },
- "t-shirt-percentage": {
- "bucket_script": {
- "buckets_path": {
- "tShirtSales": "t-shirts>sales",
- "totalSales": "total_sales"
- },
- "script": "params.tShirtSales / params.totalSales * 100"
- }
- }
- }
- }
- }
- }
- script:聚合运行的脚本
buckets_path:脚本变量的映射及其与我们希望用于变量的桶的关联路径
format:格式以应用于此聚合的输出值
gap_policy:在数据中发现差距时应用的策略
- 其中"t-shirts"这个聚合里面又套了一层取值的聚合是因为buckets_path里引用的必须是一个值filter返回的不是一个值
- 也可以这样写
- POST /sales/_search
- {
- "size": ,
- "aggs" : {
- "sales_per_month" : {
- "date_histogram" : {
- "field" : "date",
- "interval" : "month"
- },
- "aggs": {
- "total_sales": {
- "sum": {
- "field": "price"
- }
- },
- "t-shirts": {
- "filter": {
- "term": {
- "type": "t-shirt"
- }
- }
- },
- "t-shirt-percentage": {
- "bucket_script": {
- "buckets_path": {
- "tShirtSales": "t-shirts>_count",
- "totalSales": "total_sales"
- },
- "script": "params.tShirtSales / params.totalSales * 100"
- }
- }
- }
- }
- }
- }
在spring data 中使用 bucket_script 聚合
- ValueCountAggregationBuilder valueCountAggregationBuilder=AggregationBuilders.count("聚合的名字:total_attendance").field("聚合的字段名");
- FilterAggregationBuilder filterLate=AggregationBuilders
- .filter("聚合的名字:filter_count",QueryBuilders.termQuery("term的字段名","过滤的字段值"));
- Map<String,String> scriptParams=new HashMap<>();
- lateScriptParams.put("total","total_attendance");
- lateScriptParams.put("count","filter_count>_count");
- BucketScriptPipelineAggregationBuilder script= PipelineAggregatorBuilders
- .bucketScript("聚合的名字:result",scriptParams,new Script("params.count/params.total*100")).format("#.##");
然后就是把聚合放到查询里面了
- TermsAggregationBuilder usersResultAggs= AggregationBuilders.terms("users_term").field("userId.keyword")
.subAggregation(result)
.subAggregation(filter_count)
.subAggregation(total);
取值
1.使用elasticsearchTemplate
- elasticsearchTemplate.query(searchQuery, searchResponse -> {
- Map<String,Aggregation> aggregationMap=searchResponse.getAggregations().asMap();
- StringTerms stringTerms = (StringTerms)aggregationMap.get("取值的那个聚合的名字:users_term");
- //取值
return aggregationMap.get("取值的那个聚合的名字:result")).getValue()
- stringTerms.getBuckets().forEach(aggs->{
Map<String,Aggregation> subAggMap=aggs.getAggregations().asMap();
//取百分比
Double result=((InternalSimpleValue)subAggMap.get("notsigendScript")).getValue();
});
- return 返回结果;
});
ElasticSearch 聚合查询百分比的更多相关文章
- Spring Data Elasticsearch 聚合查询
如需要统计某件商品的数量,最高价格,最低价格等就用到了聚合查询,就像数据库中的group by 首先需要注入ElasticsearchTemplate @Autowired private Elast ...
- 2018/2/13 ElasticSearch学习笔记三 自动映射以及创建自动映射模版,ElasticSearch聚合查询
终于把这些命令全敲了一遍,话说ELK技术栈L和K我今天花了一下午全部搞定,学完后还都是花式玩那种...E却学了四天(当然主要是因为之前上班一直没时间学,还有安装服务时出现的各种error真是让我扎心了 ...
- elasticsearch聚合查询
作者注:本文系作者自己的理解.希望大家多多交流指正 官网java API term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词,所以我们的搜索词必须是文档分词集合中的一个 TermsB ...
- elasticsearch 聚合查询
1. 按照 tags 字段 进行分组 GET /ecommerce/product/_search{ "size": 0, "aggs": { &quo ...
- Elasticsearch(9) --- 聚合查询(Bucket聚合)
Elasticsearch(9) --- 聚合查询(Bucket聚合) 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch(8) --- 聚合查询(Metri ...
- ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合
Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...
- Elasticsearch(8) --- 聚合查询(Metric聚合)
Elasticsearch(8) --- 聚合查询(Metric聚合) 在Mysql中,我们可以获取一组数据的 最大值(Max).最小值(Min).同样我们能够对这组数据进行 分组(Group).那么 ...
- java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用
java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 .SQL:select id ...
- elasticsearch 常见查询及聚合的JAVA API
ES 常见查询 (1)根据ID 进行单个查询 GetResponse response = client.prepareGet("accounts", "person&q ...
随机推荐
- BZOJ1177:[APIO2009]Oil(枚举,前缀和)
Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M×N个小块. Siruseri地质 ...
- Odoo中如何复制有唯一性约束的记录?
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281393.html 如果为模型的字段添加了唯一性约束,那么在记录的form视图功能菜单上选择“复制”时就会 ...
- jq页面加载问题
Window.onload=function(){ //页面加载,不能同时编写多个,最后面的会覆盖前面的 } $(document).ready(function(){ //页面加载,能同时编写多 ...
- AOP各种的实现
1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...
- jQuery.mobile.changePage的参数
选项 类型:对象 属性: allowSamePageTransition(默认值:假的) 类型:布尔 默认情况下,changePage()忽略请求更改为当前活动页面.将此选项设置为true,则允许该请 ...
- PAT——1045. 快速排序(25)
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...
- ios下元素溢出设置 overflow:auto; 不能滑动解决办法
ios下元素溢出设置 overflow:auto; 不能滑动解决办法: overflow:auto; overflow-y:scroll; -webkit-overflow-scrolling:tou ...
- HDU 1007 Quoit Design(经典最近点对问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...
- 如何弹出WiFi提示列表。
如果你的程序中用到了WiFi,想在没有有效WiFi的时候出现如图所示的提示该怎么做? 其实很简单, 只需要在Info.plist中添加如下Key/Value UIRequiresPersistentW ...
- 无法加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项
未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配. (异常来自 HRESULT:0x80131040). 有时候我们创建了一个类库,我们 ...