在今天的文章中,我们将用一个例子来展示如何微调 Elasticsearch 中的 aggregation。针对有一些特殊的情况,我们需要对 aggregation 做更为精确的定制。另外,我们有将展示如何在 Kibana 的可视化中进行调整以得到我们想要的效果。当我第一次用 Kibana 的时候,我看到如下的界面:
如上图所示,当我们在做可视化时,有一个高级地定制框。你是否从来没有用过,而一直采用默认的配置?比如我们在使用 Date Histogram 时,你的老板可能希望你能从每天的周日开始进行统计而不是从默认的周一开始来进行数据的统计。我们该怎么做呢?
准备数据
在今天的教程中,我们将使用 Kibana 自带的索引来进行展示。打开 Kibana 界面:
点击 Add data:
这样我们的样本数据就导入进 Elasticsearch 了。通过上面的操作,我们在 Elasticsearch 中将生成一个叫做 kibana_sample_data_logs 的索引。
展示 aggregation
在今天的例子中,我们将展示一个 Date Histogram 聚合。在 Kibana 中打入如下的命令:
GET kibana_sample_data_logs/_search
{
"size": 0,
"aggs": {
"log_time_distribution": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "1w"
}
}
}
}
那么上面统计的数据的结果是:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10000,
"relation" : "gte"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"log_time_distribution" : {
"buckets" : [
{
"key_as_string" : "2020-07-06T00:00:00.000Z",
"key" : 1593993600000,
"doc_count" : 249
},
{
"key_as_string" : "2020-07-13T00:00:00.000Z",
"key" : 1594598400000,
"doc_count" : 1617
},
{
"key_as_string" : "2020-07-20T00:00:00.000Z",
"key" : 1595203200000,
"doc_count" : 1610
},
{
"key_as_string" : "2020-07-27T00:00:00.000Z",
"key" : 1595808000000,
"doc_count" : 1610
},
{
"key_as_string" : "2020-08-03T00:00:00.000Z",
"key" : 1596412800000,
"doc_count" : 1609
},
{
"key_as_string" : "2020-08-10T00:00:00.000Z",
"key" : 1597017600000,
"doc_count" : 1554
},
{
"key_as_string" : "2020-08-17T00:00:00.000Z",
"key" : 1597622400000,
"doc_count" : 1710
},
{
"key_as_string" : "2020-08-24T00:00:00.000Z",
"key" : 1598227200000,
"doc_count" : 1610
},
{
"key_as_string" : "2020-08-31T00:00:00.000Z",
"key" : 1598832000000,
"doc_count" : 1610
},
{
"key_as_string" : "2020-09-07T00:00:00.000Z",
"key" : 1599436800000,
"doc_count" : 895
}
]
}
}
}
从上面的返回的数据来看,我们可以看出来返回的数据的 key_as_string 所显示的日期都是从星期一开始的。07-06,07-20, 07-27 等等。
这是一个默认的方式。那么有没有办法可以修改这个参数呢?比如我们想从周日开始来进行统计,而不是默认的从周一开始的。
我们仔细查看 Date Histogram 的文档,它里面显示了一个叫做 offset 的字段。使用 offset 参数以指定的正(+)或负偏移(-)持续时间更改每个存储区的起始值,例如1h表示一个小时,或1d表示一天。 有关更多可能的持续时间选项,请参见时间单位。依据这个提示,我们重新来进行统计:
GET kibana_sample_data_logs/_search
{
"size": 0,
"aggs": {
"log_time_distribution": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "1w",
"offset": "-1d"
}
}
}
}
在上面,我们添加 offset 为 -1d。这样统计下来的结果就是:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10000,
"relation" : "gte"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"log_time_distribution" : {
"buckets" : [
{
"key_as_string" : "2020-07-12T00:00:00.000Z",
"key" : 1594512000000,
"doc_count" : 1635
},
{
"key_as_string" : "2020-07-19T00:00:00.000Z",
"key" : 1595116800000,
"doc_count" : 1611
},
{
"key_as_string" : "2020-07-26T00:00:00.000Z",
"key" : 1595721600000,
"doc_count" : 1610
},
{
"key_as_string" : "2020-08-02T00:00:00.000Z",
"key" : 1596326400000,
"doc_count" : 1610
},
{
"key_as_string" : "2020-08-09T00:00:00.000Z",
"key" : 1596931200000,
"doc_count" : 1552
},
{
"key_as_string" : "2020-08-16T00:00:00.000Z",
"key" : 1597536000000,
"doc_count" : 1710
},
{
"key_as_string" : "2020-08-23T00:00:00.000Z",
"key" : 1598140800000,
"doc_count" : 1611
},
{
"key_as_string" : "2020-08-30T00:00:00.000Z",
"key" : 1598745600000,
"doc_count" : 1610
},
{
"key_as_string" : "2020-09-06T00:00:00.000Z",
"key" : 1599350400000,
"doc_count" : 1125
}
]
}
}
}
从上面的返回的结果,我们可以看出来:07-12,07-19,07-26 等都是以周日开始的日期:
这样就达到我们想要的预期。
接下来,我们在 Kibana 的 Visualization 中来做同样的聚合:
从上面的图中,我们可以看出来,统计在默认的情况下,是从周一开始的。那么我们该如何按照我们之前的方法把时间调整为从周日开始呢?
我们点击项目的 Advanced 箭头:
并输入如下的 JSON input:
{ "offset": "-1d" }
点击 Update,那么我们聚合就会变成上面的形式了。现在是从周日开始的了。
总结
在使用 Kibana 的工具做可视化的时候,如果默认的 aggregation 不是我们想要的,我们可以通过 Advanced 来添加我们想要的配置从而达到定制可视化的目的。这个技巧适用于所有的其它的可视化。