在聚合中过滤多值字段
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]
}
}
}
}
但是因为你有日期,你必须在单独的字段中将它们索引为 string 和 index:not_analyzed .如果你愿意,你可以使用 copy_to 。之后你需要 regex 来过滤日期范围。
{
"size": 0,
"aggs": {
"unique": {
"terms": {
"field": "string_date_values",
"size": 10,
"include": "2016.*|2015.*"
}
}
}
}
以上查询只会为您提供以 2016 或 2015 开头的日期,例如 2016-04-04、2015-11-10等
我有一个这样的实体:
{
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]
}
}
}
}
但是因为你有日期,你必须在单独的字段中将它们索引为 string 和 index:not_analyzed .如果你愿意,你可以使用 copy_to 。之后你需要 regex 来过滤日期范围。
{
"size": 0,
"aggs": {
"unique": {
"terms": {
"field": "string_date_values",
"size": 10,
"include": "2016.*|2015.*"
}
}
}
}
以上查询只会为您提供以 2016 或 2015 开头的日期,例如 2016-04-04、2015-11-10等