聚合低于值的最大时间戳

Aggregate over the maximum timestamp lower than value

因此,我们尝试按颜色汇总所有文档, 对于每种颜色,找到最大时间戳为 max_timestamp。 然后,仅过滤 max_timestamp 低于 now-5m 的桶。 这里的想法是检查是否有任何颜色没有报告最近 5 分钟的文件。

这是我们现在得到的:

{
  "size": 0,
    "aggs": {
      "colors_aggs": {
        "terms": {
          "field": "color",
            "size": 10
          },
          "aggs": {
            "max_timestamp": {
              "max": {
                "field": "timestamp"
              }
            },
            "aggs": {
              "filter": {
                "range": {
                  "timestamp": {
                    "lt": "now-5m"
                  }
                }
              }
            }
          }
        }
      }
    }

好像忽略了第三个聚合。显示时间戳大于 now-5m 的存储桶。

有什么帮助吗?

您需要将 max_timestamp 聚合作为过滤器聚合的子聚合。像这样尝试:

{
  "size": 0,
  "aggs": {
    "colors_aggs": {
      "terms": {
        "field": "color",
        "size": 10
      },
      "aggs": {
        "5m": {
          "filter": {
            "range": {
              "timestamp": {
                "lt": "now-5m"
              }
            }
          },
          "aggs": {
            "max_timestamp": {
              "max": {
                "field": "timestamp"
              }
            }
          }
        }
      }
    }
  }
}

更新

如果您希望 now-5m 过滤器应用于整个聚合部分,那么您可以将其作为顶部聚合移动,如下所示:

{
  "size": 0,
  "aggs": {
    "5m": {
      "filter": {
        "range": {
          "timestamp": {
            "lt": "now-5m"
          }
        }
      },
      "aggs": {
        "colors_aggs": {
          "terms": {
            "field": "color",
            "size": 10
          },
          "aggs": {
            "max_timestamp": {
              "max": {
                "field": "timestamp"
              }
            }
          }
        }
      }
    }
  }
}

也许您可以使用脚本在最终聚合中过滤掉不需要的记录(在您的情况下是 timestamp > "now - 5m" 的记录),然后您的最终聚合(以及最终的输出)将仅基于想要的记录。 查询应该是这样的:

{
  "size": 0,
  "aggs": {
    "colors_aggs": {
      "terms": {
        "field": "color",
        "size": 10
      },
      "aggs": {
        "maximals": {
          "max": {
            "field": "timestamp":
          }
        },
        "max_bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "maxs": "max_timestamp"
            },
            "script": {
              "lang": "expression",
              "script": "maxs < [CurrentUnixTime x 1000]"
            }
          }
        }
      }
    }
  }
}

注意上面的脚本不能接受关键字now-5m所以你每次执行查询时都必须设置当前的unix时间。