聚合超过最大时间戳的值

时间:2016-05-26 09:19:22

标签: elasticsearch filter timestamp aggregation

因此,我们尝试按颜色汇总所有文档, 对于每种颜色,找到最大时间戳为 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的存储桶。

任何帮助?

2 个答案:

答案 0 :(得分: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]"
            }
          }
        }
      }
    }
  }
}

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

答案 1 :(得分:0)

您需要将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"
              }
            }
          }
        }
      }
    }
  }
}