Elasticsearch高级聚合查询

聚合脚本处理


GET /idx_znyg_datakgzdb/_search
{"size": 0,//必须是0 否则会把整个数据输出"query": {//查询条件,先过滤数据,=SQL语法 where"bool": {"must": [{"term": {"bdsId": {"value": "nxzkjy_640303_20200706_000000031"}}}, {"range": {"fetchTime": {"gte": "2020-12-01 00:00:00","lte": "2020-12-01 23:59:59"}}}]}},"aggs": {//聚合语法,关键字 类似SQL语法中group by"group_by_dbid": {//命名随意,与aggs对应,可以理解分组数据集合的名称"terms": {//分组条件"field": "dbId",//指定分组字段"size": 65535//每个桶的数据量},//引用"_source": {"includes": ["bdsId","nbqId","fetchTime","pwOutputActive"],"excludes": []},"aggs": {
//针对桶内数据操作处理"db_energy": {"scripted_metric": {"init_script": {"lang": "painless","source": """state.dbEnergyMap=new java.util.HashMap();"""},"map_script": {"lang": "painless","source": """String dbId = doc['dbId'].value;double pwPositiveTotal = doc['pwPositiveTotal'].value;long fetchMillis = doc['fetchTime'].value.getMillis();String fetchKey = '0000000000' + fetchMillis;fetchKey = fetchKey.substring(fetchKey.length() - 18, fetchKey.length());TreeMap qCombineMap = state.dbEnergyMap.get(dbId);if(qCombineMap == null) {qCombineMap = new java.util.TreeMap();}qCombineMap.put(fetchKey, pwPositiveTotal);state.dbEnergyMap.put(dbId, qCombineMap);"""},"combine_script": {"lang": "painless","source": """return state;"""},"reduce_script": {"lang": "painless","source": """Map resMap = new java.util.HashMap();Map dbEnergyMap = new java.util.HashMap();for(state in states) {if(state != null) {for(dbId in state.dbEnergyMap.keySet()) {TreeMap allQCombineMap = dbEnergyMap.get(dbId);Map qCombineMap = state.dbEnergyMap.get(dbId);if(allQCombineMap == null) {allQCombineMap = new java.util.TreeMap();}allQCombineMap.putAll(qCombineMap);dbEnergyMap.put(dbId, allQCombineMap);}}}for(dbId in dbEnergyMap.keySet()) {TreeMap qCombineMap = dbEnergyMap.get(dbId);double qCombine = qCombineMap.get(qCombineMap.lastKey()) - qCombineMap.get(qCombineMap.firstKey());resMap.put(dbId, qCombine);}return resMap;"""}}}}}}
}

查询参数:

shard_min_doc_count 

       shard_min_doc_count参数用于调节如果索引词实际上应该被添加到候选列表或者不应该被添加到min_doc_count中的分片所具有的确定性。如果集合中的局部碎片频率高于shard_min_doc_count计数,则仅考虑索引词。如果您的文档包含许多低频索引词,并且您对这些索引词不感兴趣(例如,拼写错误),那么您可以设置shard_min_doc_count参数以筛选分片级别上的候选索引词,即使经过合理的确定也不会达到所需的min_doc_count。合并本地计数。默认情况下,shard_min_doc_count设置为0,除非显式设置,否则不会产生任何影响。

注意
      设置shard_min_doc_count=0也将返回与不匹配的条件的分组。然而,一些返回的文档计数为零的索引词可能只属于从其他类型删除的文档或文档,因此没有保证._all查询将找到这些索引词的正文档计数。

警告
      当不是用文档计数降序排序时,min_doc_count取值太大将使返回一些小于大小的分组,因为没有从分片收集足够的数据。丢失分组可以通过增加shard_size来恢复。设置shard_min_doc_count值太高会导致在分片级别上过滤掉索引词。这个值应该比min_doc_count/#shards低很多。

min_doc_count 

      规定了最终结果的筛选,返回最小的文档数。强制返回空数据。如果是0,时间间隔内缺少数据,则自动补充0.一般场景就是返回空数据,减少程序的处理。

Map<String, BigDecimal> resMap = new HashMap<>();String index = this.getIndex();SearchRequest searchRequest = new SearchRequest(index);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(0);Date start = TimeUtil.getStatisticStartTime(currentTime, EnumTimeUnit.DAYS);Date end = currentTime;BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();TermQueryBuilder bdsIdQueryBuilder = QueryBuilders.termQuery("bdsId", bdsId);RangeQueryBuilder fetchTimeQueryBuilder = QueryBuilders.rangeQuery("fetchTime").gte(start).lte(end);RangeQueryBuilder qOutputDailyQueryBuilder = QueryBuilders.rangeQuery("qOutputDaily").gt(0.0).lte(NBQ_SERIES_DAILY_MAX_ENERGY);TermQueryBuilder delFlagQueryBuilder = QueryBuilders.termQuery("delFlag", DelFlagEnum.NORMAL.value());boolQueryBuilder.must(bdsIdQueryBuilder);boolQueryBuilder.must(fetchTimeQueryBuilder);boolQueryBuilder.must(qOutputDailyQueryBuilder);boolQueryBuilder.must(delFlagQueryBuilder);searchSourceBuilder.query(boolQueryBuilder);ScriptedMetricAggregationBuilder scriptedMetricAggregationBuilder = AggregationBuilders.scriptedMetric("nbq_energy");Script initScript = ScriptUtil.getScriptBy(NBQ_DAILY_SCRIPT_PATH, "init_script.js");Script mapScript = ScriptUtil.getScriptBy(NBQ_DAILY_SCRIPT_PATH, "map_script.js");Script combineScript = ScriptUtil.getScriptBy(NBQ_DAILY_SCRIPT_PATH, "combine_script.js");Script reduceScript = ScriptUtil.getScriptBy(NBQ_DAILY_SCRIPT_PATH, "reduce_script.js");scriptedMetricAggregationBuilder.initScript(initScript);scriptedMetricAggregationBuilder.mapScript(mapScript);scriptedMetricAggregationBuilder.combineScript(combineScript);scriptedMetricAggregationBuilder.reduceScript(reduceScript);//这里会生成 min_doc_count:1  shard_min_doc_count:0TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_by_nbq").field("nbqId");termsAggregationBuilder.subAggregation(scriptedMetricAggregationBuilder);termsAggregationBuilder.size(ESPage.DEFAULT_ALL_PAGESIZE);searchSourceBuilder.aggregation(termsAggregationBuilder);//这里设置 from和size为0 意思是不放query查询出的数据,只返回分组统计数据searchSourceBuilder.from(0);searchSourceBuilder.size(0);searchRequest.indices(index);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = this.restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);Aggregations aggs = searchResponse.getAggregations();if (aggs != null) {Map<String, Aggregation> aggMap = aggs.getAsMap();ParsedMultiBucketAggregation agg = (ParsedMultiBucketAggregation) aggMap.get("group_by_nbq");List<MultiBucketsAggregation.Bucket> list = (List<MultiBucketsAggregation.Bucket>) agg.getBuckets();for (MultiBucketsAggregation.Bucket bucket : list) {String nbqId = bucket.getKeyAsString();Map<String, Aggregation> nbqAggsMap = bucket.getAggregations().getAsMap();Aggregation aggr = nbqAggsMap.get("nbq_energy");if (aggr instanceof ParsedScriptedMetric) {ParsedScriptedMetric metric = (ParsedScriptedMetric) aggr;Map<String, Object> metaMap = (Map<String, Object>) metric.aggregation();Object data = metaMap.get(nbqId);if (data instanceof String) {if (NumberUtil.isNumber(StringUtils.trimToEmpty((String) data))) {BigDecimal energy = new BigDecimal(StringUtils.trimToEmpty((String) data));resMap.put(nbqId, energy);}} else if (data instanceof Double) {BigDecimal energy = Optional.ofNullable(BigDecimal.valueOf((Double) data)).orElse(BigDecimal.valueOf(0.0));resMap.put(nbqId, energy);} else if (data instanceof BigDecimal) {BigDecimal energy = Optional.ofNullable((BigDecimal) data).orElse(BigDecimal.valueOf(0.0));resMap.put(nbqId, energy);}}}}return resMap;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【李沐深度学习笔记】线性代数

课程地址和说明 线性代数p1 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 线性代数 标量 标量&#xff08;scalar&#xff09;&#xff0c;亦称“无向量”。有些物理量&#xff0c;只具有数值大小&#xff0c…

往事不堪回首,回忆曾经写过的最蠢的Python代码

文章目录 0 引言1 无限循环2 无效的变量赋值3 冗余的代码4 使用 eval 函数执行字符串代码5 不必要的类型转换6 使用 exec 执行外部命令7 使用混乱的命名8 使用硬编码的值9 忽略异常10 不合理的注释11 使用全局变量12 直接修改迭代对象13 滥用递归14 使用 运算符连接字符串15 漏…

Retrofit项目 - Android和Java的类型安全的HTTP客户端

A type-safe HTTP client for Android and Java 官网&#xff1a;Retrofit Retrofit turns your HTTP API into a Java interface. public interface GitHubService { GET("users/{user}/repos") Call<List<Repo>> listRepos(Path("user"…

华为云云耀云服务器L实例评测|2核2G跑mysql性能测试

前言 上一次我们介绍了华为云云耀云服务器L实例的基本信息&#xff0c;从购买到特色都做了简要介绍。但是 很多人看到这个配置又产生了迟疑&#xff0c;主要是因为云耀现在提供的全系是2核&#xff0c;性能吃得消吗&#xff1f;今天我们就来做一个性能测试 环境准备 因为我们…

朋友圈为什么会被折叠?

“朋友圈&#xff0c;正在无限制被折叠” 分享动态&#xff0c;共享生活&#xff0c;是大多数人对于朋友圈的认知。但实际上&#xff0c;我们时不时要和朋友圈里的商家做斗争。 现在微信也越来越多的规则&#xff0c;让发圈技巧变得瞬间失效。今天我们看看这些规则&#xff0…

2023华为杯数学建模研赛思路分享——最全版本A题深度解析

问题回顾&#xff1a; WLAN网络信道接入机制建模 1. 背景 无线局域网&#xff08;WLAN, wireless local area network&#xff09;也即Wi-Fi广泛使用&#xff0c;提供低成本、高吞吐和便利的无线通信服务。基本服务集&#xff08;BSS, basic service set&#xff09;是WLAN的…

Android 10以上出现的 android Permission denied 读写权限问题解决方法

原因&#xff1a; 从Android 10 开始&#xff0c;应用即使申请了权限&#xff0c;也只能读写自己外部存储的私有目录&#xff0c;就是Android/data/对应应用包名 下的相关目目录。除此之外任何目录的读写都会被拒绝&#xff0c;并提示android Permission denied。 解决方案 在A…

C++标准模板库——vector的使用及其模拟实现

目录 一. vector的介绍 1.vector的介绍 二.vector的使用 vector中常见接口的介绍vector的构造和析构函数vector的三种遍历方式 三.vector的模拟实现 vector的增删查改vector容器的容量变化和大小增减vector迭代器失效问题vector的小框架 构造函数和析构函数迭代器和operat…

有什么推荐使用的企业上网行为管理软件?

在当今信息化社会&#xff0c;企业的上网行为管理越来越重要。企业上网行为软件是一种能够监控和管理企业员工上网行为的工具&#xff0c;它可以帮助企业更好地管理网络资源&#xff0c;提高工作效率&#xff0c;保护企业信息安全&#xff0c;并符合相关的法律法规。本文将深入…

尝试访问启动磁盘设置时出错怎么办?

当出现“尝试访问启动磁盘设置时出错”这样的错误提示&#xff0c;而且启动转换控制面板打不开了时&#xff0c;是无法开启触摸板功能的。我们可以使用以下方法来解决问题。 1. 在Windows桌面左下角搜索框输入“计算机管理”后点击“打开”。 2. 点击“本地用户与组”&#xff…

[论文阅读]A ConvNet for the 2020s

摘要 视觉识别的咆哮的20年代开始于ViTs的引入&#xff0c;它很快取代了卷积神经网络&#xff0c;成为最先进的图像分类模型。另一方面&#xff0c;一个原始的ViT在用于一般的比如目标识别和语义分割的计算机视觉任务的时候面临困难。层次Transformer(例如&#xff0c;Swin-Tr…

新手小白如何入门学习CTF?【网络安全】

最近有很多新手小白私信我&#xff1a;如何学习CTF&#xff1f;新手小白应该怎么入门CTF&#xff1f;想打CTF&#xff0c;但是没有思路怎么办&#xff1f; 昨天下班之后&#xff0c;花了几个小时&#xff0c;整理了一下CTF学习的思路与方法&#xff0c;分享给大家&#xff0c;如…

十一、流程控制-if-switch

流程控制 1.流程控制1.1.复合语句1.2.if语句★1.2.1.简单条件的if语句★1.2.2.if...else语句★1.2.3.if...else if多分支语句★1.2.4.if语句的嵌套★ 1.3.switch多分支语句★1.3.1.switch语句通用语法★1.3.2.switch表达式★训练一★训练二★ ————————————————…

Linux 安装 git

一 . 安装git 方式1&#xff1a;通过yum 安装 yum -y install git查看是否安装成功 git --version安装目录在&#xff1a;/usr/libexec/git-core yum 安装有一些缺点 &#xff1a;不能自己指定安装目录、安装版本 方式 2 下载tar.gz 包 配置 查看git 版本&#xff1a;Index…

KF32A学习笔记(一):工程导入、编译烧录方法(KF32 IDE+ KF32 PRO)

目录 概述KF32 IDE打开现有项目工程1.工程导入2.编译工程3.下载程序 KF32 PRO 概述 本文主要是对KF32A150芯片程序的编译、烧录方法进行说明。针对开发过程中的编译烧录和无代码情况下的烧录两种场景&#xff0c;需要安装ChipON PRO KF32和ChipON IDE KF32两个上位机工具&…

【面试经典150 | 数组】跳跃游戏 II

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;贪心 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容…

FBX文件结构解读【文本格式】

FBX 格式几乎受到所有 3D 引擎的支持&#xff0c;是 Autodesk 开发的 3D 模型的专有格式。它支持顶点、索引、法线、UV坐标、材质和动画。 FBX还支持许多其他类型的信息&#xff0c;但它们对游戏引擎几乎没有用处。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 有两种…

密度估计公式

极大似然估计&#xff1a; y p ( x 1 , x 2 , x 3 , . . . , x n ) 1 2 π σ e − ( x 1 − μ ) 2 2 σ 2 1 2 π σ e − ( x 2 − μ ) 2 2 σ 2 . . . 1 2 π σ e − ( x n − μ ) 2 2 σ 2 y p(x_1,x_2,x_3,...,x_n) \frac{1}{\sqrt{2\pi} \sigma} e ^{-\frac{(x_1…

9.基于粤嵌gec6818开发板小游戏2048的算法实现

2048源码&#xff1a; 感兴趣的可以去了解一下2048优化算法&#xff1a; 基于蒙特卡罗树搜索的_2048_游戏优化算法_刘子正 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #incl…

2024贝壳校招面试真题及其详解(一)

1.spring 和spring boot区别 Spring 和 Spring Boot 都是 Java 框架,用于构建企业级应用程序。Spring 是一个完整的框架,提供各种功能,包括依赖注入、事务管理、数据访问、Web 开发等。Spring Boot 是一个基于 Spring 的框架,旨在简化 Spring 应用程序的开发和部署。 Sp…