ES多键聚合桶个数计数问题

2024-09-01 00:18

本文主要是介绍ES多键聚合桶个数计数问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ES多键聚合桶个数计数问题

开发验证过程中,ElasticSearch聚合时不显示桶的个数,在进行数据核对时非常麻烦。这里有几个解决方案:

java代码中计数

    java代码中发送查询后,返回response,buckets返回是一个数组,可以获取数组的大小,即聚合桶的数量。我知道这个解决方案可能被喷。

ES使用查询语句计数

GET  cn_order*/_search
{"size":0,"aggregations": {"groupby": {"terms": {"script": {"inline": "doc['order_id'].value+'-split-'+doc['merchant_id'].value"},"size": 200},"aggregations": {"marketFee": {"sum": {"field": "market_fee"}}}}}
}

使用terms,加script的好处是,即可以单键聚合,也可以多键聚合。返回值示例:

{"took": 2,"timed_out": false,"_shards": {"total": 90,"successful": 90,"failed": 0},"hits": {"total": 4,"max_score": 0,"hits": []},"aggregations": {"groupby": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"doc_count": 2,"marketFee": {"value": 4.2},"key": "1437002_76-split-123”},{"doc_count": 1,"marketFee": {"value": 2.1},"key": "1437002_77-split-234”},{"doc_count": 1,"marketFee": {"value": 2.1},"key": “123_7759-split-345”}]}}
}

其中key的构造即为书写的doc[‘order_id’].value+‘-split-’+doc[‘merchant_id’].value格式。中括号内的引号里包含键值。

回归正题,如何对整个返回结果的桶个数进行计数呢?

可以使用辅助手段,在查询结果里构造一个key个数的计数,使之为1,然后在对这个计数进行汇总即可。直接上查询语句:

GET  cn_energy_charge_bill*/_search
{"size": 0, "aggregations": {“keycount": {"sum_bucket": {"buckets_path": "groupby>uniqueId"}},"groupby": {"terms": {"script": {"inline": "doc[‘order_id'].value+'-split-'+doc[’merchant_id’].value"},"size": 200}, "aggregations": {"marketFee": {"sum": {"field": "market_fee"}},"uniqueId": {"cardinality":{"script": {"inline": "doc[‘order_id'].value+'-split-'+doc[‘merchant_id’].value"}}}}}}
}

重点在聚合桶外部还有一个桶个数的聚合:在聚合桶的查询语句中增加一个key维度的聚合,并且进行cardinality去重,所以对于每个单独的桶,key只有一个,这里聚合结果只会是1;然后对key“uniqueId”进行二次汇总聚合,这个汇总即为桶的个数。查询结果如下:

{"took": 2,"timed_out": false,"_shards": {"total": 90,"successful": 90,"failed": 0},"hits": {"total": 4,"max_score": 0,"hits": []},"aggregations": {"keycount": {"value": 3},"aggregations": {"groupby": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"doc_count": 2,"marketFee": {"value": 4.2},"key": "1437002_76-split-123”},{"doc_count": 1,"marketFee": {"value": 2.1},"key": "1437002_77-split-234”},{"doc_count": 1,"marketFee": {"value": 2.1},"key": “123_7759-split-345”,"uniqueId": {"value": 1}}]}}
}

keycount的value即为有多少个桶,也可以看到uniqueId的值为1。这里有一个唯一的缺点是,查询时聚合的size值要设的足够大。我的查询设置为200,最后结果只有3个桶,所有桶计数是3.但是如果桶个数超过200个,那么显示200个桶,计数就是200。也就是说桶计数是基于查询出来的桶的个数,如果要显示所有桶的个数,显示的聚合桶的个数设置要大于桶聚合结果的个数。

这篇关于ES多键聚合桶个数计数问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125408

相关文章

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

LCP 485. 最大连续 1 的个数[lleetcode -11]

从今天起,我们的算法开始研究搜索,首先就是DFS深度优先搜索(depth-first seach,DFS)在搜索到一个新的节点时,立即对该新节点进行遍 历;因此遍历需要用先入后出的栈来实现,也可以通过与栈等价的递归来实现。对于树结构而言, 由于总是对新节点调用遍历,因此看起来是向着“深”的方向前进。 下面是一个一维的DFS算法 LCP 485. 最大连续 1 的个数 给定一个二进制数组 nu

双指针(5)_单调性_有效三角形的个数

个人主页:C++忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创 双指针(5)_单调性_有效三角形的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习C++的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链接: 2.题目描述 : 3.解法 :     解法一(暴力枚举) :     算法思路 :     代码展示 : 暴力枚