假设有一个(简化的)索引:
PUT test
{
"mappings": {
"properties": {
"numeric_field_sometimes_empty": {
"type": "integer"
},
"numeric_field_always_present": {
"type": "integer"
}
}
}
}
对于某些(可能是所有已过滤的)文档中可能存在或不存在的数字字段:
POST test/_doc
{
"numeric_field_always_present": 10
}
POST test/_doc
{
"numeric_field_always_present": 20
}
我想执行一个 bucket_script
计算某些趋势 bucket_script
需要是一个多桶agg的孩子,我用 filters
. 在那之后,没有什么能阻止我创建数字单桶子聚集,比如:
GET test/_search
{
"size": 0,
"aggs": {
"multibucket_simulator": {
"filters": {
"filters": {
"all": {
"match_all": {}
}
}
},
"aggs": {
"avg_empty": {
"avg": {
"field": "numeric_field_sometimes_empty"
}
},
"avg_non_null": {
"avg": {
"field": "numeric_field_always_present"
}
},
"diff": {
"bucket_script": {
"buckets_path": {
"now": "avg_empty.value",
"before": "avg_non_null.value"
},
"script": """
return (params.now != null ? params.now : 0)
- (params.before != null ? params.before : 0)
""",
"format": "###.##"
}
}
}
}
}
}
因为我知道那些小组的一些结果可能是 null
(a)严格的 null
类型,而不是 0
),我检查三元运算符是否是这种情况,并继续返回值差。这将产生:
{
"aggregations":{
"multibucket_simulator":{
"buckets":{
"all":{
"doc_count":2,
"avg_non_null":{
"value":15.0
},
"avg_empty":{
"value":null
}
}
}
}
}
}
与 diff
完全忽略了bucket script sub agg。那是次优。。。
我试过把 .value
所以我可以访问和检查 .value
直接在脚本中——没有用。
那么问题是——为什么 null
桶被跳过,还有,除了 bucket_script
对于这个用例?
1条答案
按热度按时间9nvpjoqh1#
文件上说
指定的度量必须是数字,并且脚本必须返回数字值。
我想这是一个讨论的问题
null
属于那一类。编辑1
话虽如此,设定
missing
每个上的参数avg
agg解决了这个问题。编辑2实际答案(&A)
这是最重要的
gap_policy
. 它默认为skip
需要设置为insert_zeros
. 原因是这样的。