elasticsearch - 当存储桶路径之一解析为 'bucket_script'时,ElasticSearch 'null'不执行

标签 elasticsearch elasticsearch-aggregation elasticsearch-painless

假设有一个(简化的)索引:

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进行模拟。在那之后,创建数字单桶子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之外,还有其他选择吗?

最佳答案

文档指出

The specified metric must be numeric and the script must return a numeric value.


我认为null是否属于该类别是一个讨论问题。

编辑1
话虽如此,在每个missing agg上设置 avg 参数即可解决此问题。

编辑2和实际Anwer
那是 gap_policy 。它默认为skip,需要设置为insert_zerosHere's the reason

关于elasticsearch - 当存储桶路径之一解析为 'bucket_script'时,ElasticSearch 'null'不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63921905/

相关文章:

logging - Elasticsearch 索引比它索引的日志的实际大小大得多?

elasticsearch - Elasticsearch :搜索特定记录而无需滚动所有数据

elasticsearch - 尝试更新Elasticsearch中的嵌套Geoip位置字段

elasticsearch - 编写脚本以从Elasticsearch获得独特的值(value)

database - ElasticSearch 术语聚合但需要输出中的其他字段

java - Elasticsearch /无痛 : How do I access/sum all values in an object

ElasticSearch 多播在 Linode 中不起作用

elasticsearch - 如何在 Kibana elasticSearch 中搜索 Json 消息

sql-server - Elasticsearch : set up parent/child using jdbc-rivers

Group By 的 Elasticsearch 聚合,然后获取最大日期的字段平均值