1

我有一个带有名称和时间戳的记录列表。对于每个名称,我想获得最大时间戳,但我只想在一小时前获得具有最大时间戳的名称(这意味着在我的结果中我只想查看名称列表及其最大时间戳,但仅适用于一个小时前具有最大时间戳的名称。如果一个名称有一小时前的时间戳记录,我不想在我的结果中看到这个名称)。

我尝试使用聚合来解决这个问题,通过在名称上创建术语聚合,然后聚合最大时间戳,然后在一小时前过滤具有最大时间戳的记录,如下所示:

{
  "size": 0,
  "aggs": {
    "names_aggs": {
      "terms": {
        "field": "name",
        "size": 10
      },
      "aggs": {
        "max_timestamp": {
          "max": {
            "field": "timestamp"
          },
          "aggs": {
            "sub-agg": {
              "filter": {
                "range": {
                  "timestamp": {
                    "lt": "now-1h"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

但是,此查询会产生以下错误:

{
  "type": "aggregation_initialization_exception",
  "reason": "Aggregator [max_timestamp] of type [max] cannot accept sub-aggregations"
}

我基本上可以通过在最大聚合之前使用时间戳过滤器来获得类似的功能,如下所示:

{
  "size": 0,
  "aggs": {
    "names_aggs": {
      "terms": {
        "field": "name",
        "size": 10
      },
      "aggs": {
        "maximals": {
          "filter": {
            "range": {
              "timestamp": {
                "lt": "now-1h"
              }
            }
          },
          "aggs": {
            "max_timestamp": {
              "max": {
                "field": "timestamp"
              }
            }
          }
        }
      }
    }
  }
}

实际上,对于通过最大值过滤器的每个名称,我得到一组结果,其中包含名称和 max_timestamp,对于每个未通过最大值过滤器的名称,我得到一个空的 max_timestamp。这是我可以使用的解决方案,但是,由于为每个名称运行的最大值过滤器,此查询不会返回大量记录。

在此先感谢您的帮助。

4

0 回答 0