在最大时间戳小于值时聚合

Eli*_*Eli 5 timestamp filter aggregation elasticsearch

因此,我们尝试按颜色汇总所有文档,其中每种颜色的最大时间戳记为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"
                  }
                }
              }
            }
          }
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

似乎忽略了第三种聚合。时间戳大于now-5m显示的存储桶。

有什么帮助吗?

han*_*etz 2

也许您可以使用脚本过滤掉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]"
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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