过滤aggegations中的多值字段

时间:2016-10-31 10:02:28

标签: elasticsearch aggregation

我有一个这样的实体:

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

values数组包含大量值(最多100k),实际上是日期(为了便于使用,我在这里使用了)。所以我需要在几个文档中提取范围内的所有日期。我需要符合某些标准的所有文档的值的联合。

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

1 个答案:

答案 0 :(得分:1)

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

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

但是由于你有日期,你必须将它们作为字符串索引:not_analyzed 在单独的字段中编入索引。如果您愿意,可以使用copy_to。之后,您需要正则表达式来过滤日期范围。

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

以上查询仅为您提供2016或2015年开始的日期,例如 2016-04-04 2015-11-10 等。