如何解决当存储桶路径之一解析为'null'时,ElasticSearch'bucket_script'不执行 编辑2和实际答案
我们假设有一个(简化的)索引:
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
必须是多桶聚合的子代,因此我使用filters
模拟了一个。之后,没有任何东西可以像这样创建数字单桶子aggs:
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": "###.##"
}
}
}
}
}
}
由于我知道其中一些子aggs的结果可能是null
(严格的null
类型,而不是0
),因此我检查三元情况是否如此运算符,然后继续返回值差。这样产生:
{
"aggregations":{
"multibucket_simulator":{
"buckets":{
"all":{
"doc_count":2,"avg_non_null":{
"value":15.0
},"avg_empty":{
"value":null
}
}
}
}
}
}
,diff
存储段脚本子agg被完全忽略。那不是最理想的...
我尝试从路径中删除.value
,以便我可以直接在脚本中访问和检查.value
-无济于事。
然后的问题是-为什么要跳过null
个存储桶,并且在此用例中除了bucket_script
之外还有其他选择吗?
解决方法
文档指出
指定的指标必须为数字,并且脚本必须返回一个 数值。
我认为null
是否属于该类别只是个讨论问题。
编辑1
话虽如此,在每个avg
agg上设置一个missing
参数即可解决此问题。
编辑2和实际答案
它是gap_policy
。它默认为skip
,需要设置为insert_zeros
。 Here's the reason。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。