弹性中的子聚合或聚合过滤器

时间:2016-06-01 08:10:00

标签: elasticsearch elasticsearch-query elasticsearch-aggregation

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

我尝试使用聚合解决此问题,方法是在名称上创建一个术语聚合,然后聚合超过最大时间戳,然后在一小时之后过滤最大时间戳记录,如下所示:

{
  "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"
              }
            }
          }
        }
      }
    }
  }
}

实际上,我为每个通过maximals过滤器的名称获取了一组带有name和max_timestamp的结果,并为每个没有通过maximals过滤器的名称获得了一个null max_timestamp。这是我可以使用的解决方案,但是,由于为每个名称运行的最大过滤器,此查询不会返回大量记录。

提前感谢您的帮助。

0 个答案:

没有答案