在聚合中过滤多值字段

Filter on a Multivalues field in aggegations

我有一个这样的实体:

{
   id: "id1",
   values: [0, 1, 5, 20, 30]
}

values 数组包含大量值(最多 100k),它们实际上是日期(为了便于使用,我在这里采用了整数)。所以我需要提取多个文档范围内的所有日期。我需要符合某些条件的所有文档的值的并集。

目前我有一个查询和一个术语聚合来获取所有值。但我需要在范围内过滤值。是否可以告诉聚合只取 10 到 20 之间的值,即使有问题的文档中有 1-100k 的值?

这是可以做到的,但在您的情况下会很棘手。对于您示例中的数值,您可以通过在数组中提供它们来 filter 它们。

{
  "size": 0,
  "aggs": {
    "unique": {
      "terms": {
        "field": "date_values",
        "size": 10,
        "include": [10,11,12,13,14,15,16,17,18,19,20]
      }
    }
  }
}

但是因为你有日期,你必须在单独的字段中将它们索引为 stringindex:not_analyzed .如果你愿意,你可以使用 copy_to 。之后你需要 regex 来过滤日期范围。

{
  "size": 0,
  "aggs": {
    "unique": {
      "terms": {
        "field": "string_date_values",
        "size": 10,
        "include": "2016.*|2015.*"
      }
    }
  }
}

以上查询只会为您提供以 2016 或 2015 开头的日期,例如 2016-04-042015-11-10