gpt4 book ai didi

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

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

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

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 anumeric 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/

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