在弹性搜索中的样本中选择数据集
Pick dataset at samples in elasticsearch
我有一个数据集,其中包含跨越 1 个月的 1000 个日期。我想根据这个日期字段进行聚合,但只有几个样本由一个间隔(比如周)分隔。
例如:对于从 12 月 1 日到 30 日不等的日期,我应该获取以下日期的存储桶:12 月 1 日、12 月 8 日、12 月 15 日、12 月 22 日和 12 月 29 日。
PS :我不想在这里使用日期直方图,因为它 groups 数据到给定的间隔。因此,对于上面的示例,它从 1-7、8-15 等形成桶。
我查看了 sampler 聚合,它需要提供脚本。我不知道应该如何编写脚本来获取样本并将这些样本提供给子聚合。
有多种方法可以做到这一点。其中之一是使用 date_histogram
受过滤器约束的聚合,该过滤器只会 select 所需的日期:
{
"aggs": {
"5_days": {
"filter": {
"filter": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"range": {
"date": {
"from": "2016-12-01T00:00:00.000Z",
"to": "2016-12-02T00:00:00.000Z"
}
}
},
{
"range": {
"date": {
"from": "2016-12-08T00:00:00.000Z",
"to": "2016-12-09T00:00:00.000Z"
}
}
},
{
"range": {
"date": {
"from": "2016-12-15T00:00:00.000Z",
"to": "2016-12-16T00:00:00.000Z"
}
}
},
{
"range": {
"date": {
"from": "2016-12-22T00:00:00.000Z",
"to": "2016-12-23T00:00:00.000Z"
}
}
},
{
"range": {
"date": {
"from": "2016-12-29T00:00:00.000Z",
"to": "2016-12-30T00:00:00.000Z"
}
}
}
]
}
}
},
"aggs": {
"samples": {
"date_histogram": {
"field": "date",
"interval": "day"
}
}
}
}
}
}
第二种方法更简洁,归结为使用仅包含 selected 日期的 date_range
aggregation:
{
"aggs": {
"range": {
"date_range": {
"field": "date",
"ranges": [
{ "from": "2016-12-01T00:00:00.000Z", "to": "2016-12-02T00:00:00.000Z" },
{ "from": "2016-12-08T00:00:00.000Z", "to": "2016-12-09T00:00:00.000Z" },
{ "from": "2016-12-15T00:00:00.000Z", "to": "2016-12-16T00:00:00.000Z" },
{ "from": "2016-12-22T00:00:00.000Z", "to": "2016-12-23T00:00:00.000Z" },
{ "from": "2016-12-29T00:00:00.000Z", "to": "2016-12-30T00:00:00.000Z" }
]
}
}
}
}
我有一个数据集,其中包含跨越 1 个月的 1000 个日期。我想根据这个日期字段进行聚合,但只有几个样本由一个间隔(比如周)分隔。
例如:对于从 12 月 1 日到 30 日不等的日期,我应该获取以下日期的存储桶:12 月 1 日、12 月 8 日、12 月 15 日、12 月 22 日和 12 月 29 日。 PS :我不想在这里使用日期直方图,因为它 groups 数据到给定的间隔。因此,对于上面的示例,它从 1-7、8-15 等形成桶。
我查看了 sampler 聚合,它需要提供脚本。我不知道应该如何编写脚本来获取样本并将这些样本提供给子聚合。
有多种方法可以做到这一点。其中之一是使用 date_histogram
受过滤器约束的聚合,该过滤器只会 select 所需的日期:
{
"aggs": {
"5_days": {
"filter": {
"filter": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"range": {
"date": {
"from": "2016-12-01T00:00:00.000Z",
"to": "2016-12-02T00:00:00.000Z"
}
}
},
{
"range": {
"date": {
"from": "2016-12-08T00:00:00.000Z",
"to": "2016-12-09T00:00:00.000Z"
}
}
},
{
"range": {
"date": {
"from": "2016-12-15T00:00:00.000Z",
"to": "2016-12-16T00:00:00.000Z"
}
}
},
{
"range": {
"date": {
"from": "2016-12-22T00:00:00.000Z",
"to": "2016-12-23T00:00:00.000Z"
}
}
},
{
"range": {
"date": {
"from": "2016-12-29T00:00:00.000Z",
"to": "2016-12-30T00:00:00.000Z"
}
}
}
]
}
}
},
"aggs": {
"samples": {
"date_histogram": {
"field": "date",
"interval": "day"
}
}
}
}
}
}
第二种方法更简洁,归结为使用仅包含 selected 日期的 date_range
aggregation:
{
"aggs": {
"range": {
"date_range": {
"field": "date",
"ranges": [
{ "from": "2016-12-01T00:00:00.000Z", "to": "2016-12-02T00:00:00.000Z" },
{ "from": "2016-12-08T00:00:00.000Z", "to": "2016-12-09T00:00:00.000Z" },
{ "from": "2016-12-15T00:00:00.000Z", "to": "2016-12-16T00:00:00.000Z" },
{ "from": "2016-12-22T00:00:00.000Z", "to": "2016-12-23T00:00:00.000Z" },
{ "from": "2016-12-29T00:00:00.000Z", "to": "2016-12-30T00:00:00.000Z" }
]
}
}
}
}