我想获取满足一定条件的组数。用SQL术语来说,我想在Elasticsearch中执行以下操作。
SELECT COUNT(*) FROM
(
SELECT
senderResellerId,
SUM(requestAmountValue) AS t_amount
FROM
transactions
GROUP BY
senderResellerId
HAVING
t_amount > 10000 ) AS dum;
到目前为止,我可以通过术语聚合将senderResellerId分组。但是,当我应用过滤器时,它无法按预期工作。
弹性请求
{
"aggregations": {
"reseller_sale_sum": {
"aggs": {
"sales": {
"aggregations": {
"reseller_sale": {
"sum": {
"field": "requestAmountValue"
}
}
},
"filter": {
"range": {
"reseller_sale": {
"gte": 10000
}
}
}
}
},
"terms": {
"field": "senderResellerId",
"order": {
"sales>reseller_sale": "desc"
},
"size": 5
}
}
},
"ext": {},
"query": { "match_all": {} },
"size": 0
}
实际反应
{
"took" : 21,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"hits" : {
"total" : 150824,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"reseller_sale_sum" : {
"doc_count_error_upper_bound" : -1,
"sum_other_doc_count" : 149609,
"buckets" : [
{
"key" : "RES0000000004",
"doc_count" : 8,
"sales" : {
"doc_count" : 0,
"reseller_sale" : {
"value" : 0.0
}
}
},
{
"key" : "RES0000000005",
"doc_count" : 39,
"sales" : {
"doc_count" : 0,
"reseller_sale" : {
"value" : 0.0
}
}
},
{
"key" : "RES0000000006",
"doc_count" : 57,
"sales" : {
"doc_count" : 0,
"reseller_sale" : {
"value" : 0.0
}
}
},
{
"key" : "RES0000000007",
"doc_count" : 134,
"sales" : {
"doc_count" : 0,
"reseller_sale" : {
"value" : 0.0
}
}
}
}
}
]
}
}
}
从上面的响应中可以看到,它正在返回代理商,但是 reseller_sale 聚合结果为零。
更多细节在这里。
您可以使用一种pipeline aggregations
,即存储桶选择器聚合。查询如下所示:
POST my_index/tdrs/_search
{
"aggregations": {
"reseller_sale_sum": {
"aggregations": {
"sales": {
"sum": {
"field": "requestAmountValue"
}
},
"max_sales": {
"bucket_selector": {
"buckets_path": {
"var1": "sales"
},
"script": "params.var1 > 10000"
}
}
},
"terms": {
"field": "senderResellerId",
"order": {
"sales": "desc"
},
"size": 5
}
}
},
"size": 0
}
将以下文档放入索引后:
"hits": [
{
"_index": "my_index",
"_type": "tdrs",
"_id": "AV9Yh5F-dSw48Z0DWDys",
"_score": 1,
"_source": {
"requestAmountValue": 7000,
"senderResellerId": "ID_1"
}
},
{
"_index": "my_index",
"_type": "tdrs",
"_id": "AV9Yh684dSw48Z0DWDyt",
"_score": 1,
"_source": {
"requestAmountValue": 5000,
"senderResellerId": "ID_1"
}
},
{
"_index": "my_index",
"_type": "tdrs",
"_id": "AV9Yh8TBdSw48Z0DWDyu",
"_score": 1,
"_source": {
"requestAmountValue": 1000,
"senderResellerId": "ID_2"
}
}
]
查询的结果是:
"aggregations": {
"reseller_sale_sum": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "ID_1",
"doc_count": 2,
"sales": {
"value": 12000
}
}
]
}
}
即仅那些senderResellerId
累计销售额为的者>10000
。
要实现等效功能,SELECT COUNT(*) FROM (... HAVING)
可以结合使用桶脚本聚合和总和桶聚合。尽管似乎没有直接的方法来计算bucket_selector
实际选择了多少个存储桶,但我们可以定义一个bucket_script
产生0
或1
取决于条件的sum_bucket
产生它的sum
:
POST my_index/tdrs/_search
{
"aggregations": {
"reseller_sale_sum": {
"aggregations": {
"sales": {
"sum": {
"field": "requestAmountValue"
}
},
"max_sales": {
"bucket_script": {
"buckets_path": {
"var1": "sales"
},
"script": "if (params.var1 > 10000) { 1 } else { 0 }"
}
}
},
"terms": {
"field": "senderResellerId",
"order": {
"sales": "desc"
}
}
},
"max_sales_stats": {
"sum_bucket": {
"buckets_path": "reseller_sale_sum>max_sales"
}
}
},
"size": 0
}
输出将是:
"aggregations": {
"reseller_sale_sum": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
...
]
},
"max_sales_stats": {
"value": 1
}
}
所需的存储桶数位于中max_sales_stats.value
。
我必须指出两件事:
管道聚合工作于其他聚合而不是文档集所产生的输出,从而将信息添加到输出树中。
这意味着bucket_selector
将在上的terms
聚合结果之后和之后应用聚合senderResellerId
。例如,如果聚合定义senderResellerId
不止size
一个terms
,则不会使用来获得集合中的
所有 id sum(sales) > 10000
,而只会获取出现在terms
聚合输出中的id
。考虑使用排序和/或设置足够的size
参数。
这也适用于第二种情况,COUNT() (... HAVING)
该情况仅计算聚合输出中实际存在的那些存储桶。
如果此查询太重或存储桶数太大,请考虑对数据进行规范化或将此总和直接存储在文档中,以便可以使用普通range
查询来实现您的目标。
希望有帮助!
问题内容: 这是我在这里的第一个问题,我希望它很简单,可以快速得到答案! 基本上,我有以下代码: 如果我回显$ variable,它将打印当前页面的url(这是我页面上的javascript) 最终,我想要的是能够进行搜索,搜索条件是当前页面的url,前后带有通配符。我不确定这是否可能,或者我只是语法错误,因为我没有错误,只是没有结果! 我试过了 : 但同样,我可能丢失了或使用了错误的’“;等。
有没有像Base64这样的编码算法? 谢了!
问题内容: 在MySQL上,是否存在POSTGRESQL中的“ unnest”之类的功能? 查询(PSQL): 结果(如表所示): 问题答案: 简短答案 对的,这是可能的。从技术角度来看,您可以通过一个查询来实现。但是问题是-最有可能的是,您正在尝试将一些逻辑从应用程序传递到数据存储。数据存储旨在 存储 数据,而不是表示/格式化数据,或者甚至对其应用某些逻辑。 是的,MySQL没有数组数据类型,但
好吧,我是Docker的新手,正在做一些教程,我想删除和图像: 所以我从开始: 为什么这不起作用? 最后我发现确实删除了图像,但我仍然不明白为什么这不起作用。 第一列是什么?这是映像名称,还是其他名称? 如果是映像名称,那么为什么不能使用删除映像? 如果不是映像名称,则 是什么? 为什么显示它而不是图像名称? 如何获取实际的映像名称?具体是什么?我还尝试了和但未成功。
问题内容: 在PHP中,使用可以很容易地传回json对象。 但是,是否有与之等效的XML? 问题答案: JSON可以原生地表达php数组,整数,字符串等。XML没有这样的概念,只有元素,属性和文本。如果要逐字转移对象,请使用JSON。如果要实现复杂的API,请使用XML,例如php DOM接口。
问题内容: 我使用com0com在Windows中进行程序测试,在Linux中是否有类似com0com的程序? 我知道有pts / ptmx,但是我想要的是一个独立程序,提供2个虚拟串行端口… 然后我可以打开2个程序,每个程序一个。 问题答案: 我找到了一个好方法: 然后创建两个虚拟串行端口文件:COM8,COM9