ElasticSearch 2 (30) - 信息聚合系列之条形图
摘要
版本
elasticsearch版本: elasticsearch-2.x
内容
聚合还有一个令人激动的特性就是能够十分容易地将它们转换成图表和图形。本章中,我们会关注于各种各样的分析并反复“蹂躏”我们示例中的数据。我们也会展现聚合可以支持的不同种类的图表。
直方图(histogram
)桶特别有用,它本质上是一个条形图,如果有创建报表或分析仪表盘的经验,那么我们会毫无疑问的发现里面有一些图表是条形图。直方图是根据指定的间隔显示的,如果需要售价的直方图,我们可能指定的间隔值为 20,000。它会每 $20,000 创建新桶。然后文档会被分到对应的桶中。
对于仪表盘来说,我们希望知道每个售价区间内汽车的销量。我们还会想知道每个售价区间内汽车所带来的收入,可以通过对每个区间内已售汽车的售价求和得到。
可以用 histogram
和一个嵌套的 sum
度量得到我们想要的答案:
GET /cars/transactions/_search
{
"size" : 0,
"aggs":{
"price":{
"histogram":{ #1
"field": "price",
"interval": 20000
},
"aggs":{
"revenue": {
"sum": { #2
"field" : "price"
}
}
}
}
}
}
#1 histogram
桶要求两个参数:一个数值字段以及一个定义桶大小间隔字段。
#2 sum
度量嵌套在每个售价区间内,用来显示每个区间内的总收入。
如我们所见,查询是围绕 price
聚合构建的,它包含一个 histogram
桶。这个桶要求一个供计算的数值字段,以及一个间隔大小。这个间隔值定义了桶的“宽度”。20000 这个宽度表示我们得到的返回是 [0-19999, 20000-39999, ...]
。
接着,我们在直方图内定义嵌套的度量,这个 sum
度量会将售价范围内每个文档的售价字段里的值加起来。这可以为我们提供每个售价区间的收入,从而可以发现到底是普通家用车赚钱还是奢侈车赚钱。
响应结果如下:
{
...
"aggregations": {
"price": {
"buckets": [
{
"key": 0,
"doc_count": 3,
"revenue": {
"value": 37000
}
},
{
"key": 20000,
"doc_count": 4,
"revenue": {
"value": 95000
}
},
{
"key": 80000,
"doc_count": 1,
"revenue": {
"value": 80000
}
}
]
}
}
}
结果很容易理解,不过应该注意到直方图的键值是区间的下限。键 0
代表区间 0-19,999
,键 20000
代表区间 20,000-39,999
等等。
注意
我们可能会注意到空的区间,比如:$40,000-60,000,没有出现在响应中。
histogram
桶默认会忽略它,因为它有可能会导致不希望的潜在错误输出。我们会在下一小节中讨论如何包括空桶。返回空桶(Returning Empty Buckets)
可以在图 Figure 35, “Sales and Revenue per price bracket” 中看到以上数据直方图的图形化表示。
Figure 35. Sales and Revenue per price bracket
当然,我们可以为任何聚合输出的分类和统计结果创建条形图,而不只是直方图桶。让我们以最受欢迎 10 种汽车以及它们的平均售价、标准差这些信息创建一个条形图。我们会用到 terms
桶和 extended_stats
度量:
GET /cars/transactions/_search
{
"size" : 0,
"aggs": {
"makes": {
"terms": {
"field": "make",
"size": 10
},
"aggs": {
"stats": {
"extended_stats": {
"field": "price"
}
}
}
}
}
}
它会按受欢迎度返回制造商列表以及它们各自的统计信息。我们会对 stats.avg
、stats.count
和 stats.std_deviation
信息特别感兴趣,并用它们计算出标准误差:
std_err = std_deviation / count
创建图表如图 Figure 36, “Average price of all makes, with error bars”.
Figure 36. Average price of all makes, with error bars