聚合脚本请教

Elasticsearch | 作者 elasticStack | 发布于2018年09月18日 | 阅读数:6622

查询语句如下
{
"size": 0,
"query": {
"range": {
"datatime": {
"gte": "now-7d",
"lte": "now"
}
}
},
"aggs": {
"group_by": {
"terms": {
"script": {
"lang": "painless",
"source":"doc['datatype.keyword'].value + ' ' doc['uname.keyword'].value"
},
"size": 50
}
}
}
}
报错信息如下
"reason": {
"type": "general_script_exception",
"reason": "Failed to compile inline script [doc['datatype.keyword'].value + ' ' doc['uname.keyword'].value] using lang [painless]",
"caused_by": {
"type": "circuit_breaking_exception",
"reason": "[script] Too many dynamic script compilations within one minute, max: [15/min]; please use on-disk, indexed, or scripts with parameters instead; this limit can be changed by the [script.max_compilations_per_minute] setting",
"bytes_wanted": 0,
"bytes_limit": 0
}
}
1.报错信息我也可以看懂,就是配置一个参数,我想请教的是这个报错的dsl想干什么,可行性怎么样?
 
已邀请:

kennywu76 - Wood

赞同来自: laoyang360 rochy ghnjk

多字段的terms聚合,也可以利用composite aggregation来实现,例如:
demo.jpg

 
 
文档参考: 
 

kennywu76 - Wood

赞同来自: elasticStack

这个报错主要是防止短时间过多的script compile消耗过多资源,影响集群性能。  不过你范例里给的script应该只需要compile一次,抛这个错误应该是有其他script引起过多的compile吧。
 
通过参数调整提高compile的上限需要谨慎,如果是存在太多的动态script, 频繁的compile可能带来太多压力。最好搞清楚为啥短时间会有这么多的script需要compile,是否有script的参数是生成查询的时候动态传入的? 如果是有参数动态传入,需要将动态部分放到params里去,保证script本身不会随着查询不同而变化,这样只会第一次执行的时候compile一次缓存起来。

rochy - rochy_he

赞同来自:

看你的意思貌似是希望实现多字段 term 聚合,推荐两种方法:
1. 同时对多个字段进行 term 聚合,然后编写程序将各个字段的聚合结果进行合并;
2. 使用 copy_to 属性,将多个字段合并到一个字段,然后针对这个字段进行 term 聚合。

ghnjk

赞同来自:

看看可不可以用全套aggs实现呢?
{
"aggs" : {
"datatype.keyword" : {
"terms" : {
"field" : "datatype.keyword",
"size" : 50,
"collect_mode" : "breadth_first"
},
"uname.keyword" : {
"costars" : {
"terms" : {
"field" : "uname.keyword",
"size" : 50
}
}
}
}
}
}

elasticStack - 90后it大数据男

赞同来自:

要回复问题请先登录注册