gpt4 book ai didi

elasticsearch - 存储桶中的弹性脚本和更高级别的聚合

转载 作者:行者123 更新时间:2023-12-03 02:28:40 25 4
gpt4 key购买 nike

我想将一个指标的每日平均值(文本中单词出现的频率)与特定日期的值进行比较。这是一个星期。我的目标是检查是否有峰值。如果最后一天比每日平均水平高出很多,我会触发警报。

因此,根据我在Elasticsearch中的输入,我计算了一周中的每日平均值,并找出了该周最后一天的值。

为了获得一周的每日平均值,我只是使用range字段上的date查询来削减一周的数据,所以我所有可用的数据都是给定的一周。我计算总和,然后除以7得到每日平均值。

为了获得最后一天的值(value),我在另一个问题(How to select the last bucket in a date_histogram selector in Elasticsearch)中建议对date字段进行术语汇总,并以降序排列和大小为1

整个输出如下。在这里您可以看到单词“rama0”和“rama1”及其相应的频率。

{
"aggregations" : {
"the_keywords" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "rama0",
"doc_count" : 4200,
"the_last_day" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 3600,
"buckets" : [
{
"key" : 1580169600000,
"key_as_string" : "2020-01-28T00:00:00.000Z",
"doc_count" : 600,
"the_last_day_frequency" : {
"value" : 3000.0
}
}
]
},
"the_weekly_sum" : {
"value" : 21000.0
},
"the_daily_average" : {
"value" : 3000.0
}
},
{
"key" : "rama1",
"doc_count" : 4200,
"the_last_day" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 3600,
"buckets" : [
{
"key" : 1580169600000,
"key_as_string" : "2020-01-28T00:00:00.000Z",
"doc_count" : 600,
"the_last_day_frequency" : {
"value" : 3000.0
}
}
]
},
"the_weekly_sum" : {
"value" : 21000.0
},
"the_daily_average" : {
"value" : 3000.0
}
},
[...]
]
}
}
}

现在,我在较高级别的输出中具有 the_daily_average,在 the_last_day_frequency聚合中的单元素 buckets列表中具有 the_last_day。我无法使用 bucket_script进行比较,因为我无法引用单个存储桶(如果将脚本放置在 the_last_day聚合之外),并且如果我将脚本放置在 the_last_day内,则无法引用更高级别的聚合。

IMO的合理做法是将脚本放到聚合之外,并使用 the docs中提到的 buckets_path语法使用 <AGG_NAME><MULTIBUCKET_KEY>,但是我已经尝试过 "var1": "the_last_day[1580169600000]>the_last_day_frequency"和变体(首先进行硬编码,直到它起作用),但我一直无法指特定的存储桶。

我的最终目标是拥有一个关键字列表,这些关键字的最后一天频率大大超过每日平均值。

对于任何感兴趣的人,我当前的查询如下。注意,我苦苦挣扎的部分已被注释掉。
body='{
"query": {
"range": {
"date": {
"gte": "START",
"lte": "END"
}
}
},
"aggs": {
"the_keywords": {
"terms": {
"field": "keyword",
"size": 100
},
"aggs": {
"the_weekly_sum": {
"sum": {
"field": "frequency"
}
},
"the_daily_average" : {
"bucket_script": {
"buckets_path": {
"weekly_sum": "the_weekly_sum"
},
"script": {
"inline": "return params.weekly_sum / 7"
}
}
},
"the_last_day": {
"terms": {
"field": "date",
"size": 1,
"order": {"_key": "desc"}
},
"aggs": {
"the_last_day_frequency": {
"sum": {
"field": "frequency"
}
}
}
}/*,
"the_spike": {
"bucket_script": {
"buckets_path": {
"last_day_frequency": "the_last_day>the_last_day_frequency",
"daily_average": "the_daily_average"
},
"script": {
"inline": "return last_day_frequency / daily_average"
}
}
}*/
}
}
}
}'

最佳答案

在您的查询中,the_last_day> the_last_day_frequency指向一个存储桶,而不是单个值,因此它引发了错误。您需要从“the_last_day_frequency”中获取单个指标值,您可以使用max_bucket来实现。然后,您可以使用bucket_Selector aggregation比较前一天的值(value)和平均值

查询:

"aggs": {
"the_keywords": {
"terms": {
"field": "keyword",
"size": 100
},
"aggs": {
"the_weekly_sum": {
"sum": {
"field": "frequency"
}
},
"the_daily_average": {
"bucket_script": {
"buckets_path": {
"weekly_sum": "the_weekly_sum"
},
"script": {
"inline": "return params.weekly_sum / 7"
}
}
},
"the_last_day": {
"terms": {
"field": "date",
"size": 1,
"order": {
"_key": "desc"
}
},
"aggs": {
"the_last_day_frequency": {
"sum": {
"field": "frequency"
}
}
}
},
"max_frequency_last_day": {
"max_bucket": {
"buckets_path": "the_last_day>the_last_day_frequency"
}
},
"the_spike": {
"bucket_selector": {
"buckets_path": {
"last_day_frequency": "max_frequency_last_day",
"daily_average": "the_daily_average"
},
"script": {
"inline": "params.last_day_frequency > params.daily_average"
}
}
}
}
}
}
````

关于elasticsearch - 存储桶中的弹性脚本和更高级别的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60493276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com