ElasticSearch 开发学习:聚合概念
参考文档
- 中文参考文档: Elasticsearch: 权威指南 » 聚合
- 英文参考文档: Elasticsearch Guide [6.4] » Aggregations
聚合
聚合 是由 桶 和 指标 组成的。通过聚合,我们可以得到一个数据的概览。聚合允许我们像数据提出一些复杂的问题。 Elasticsearch 中的聚合执行速度很快,像搜索一样几乎是实时的。所以对于报告和仪表盘来说,可以实时显示数据。
聚合和搜索是一起的,在单个请求里,可以同时对相同的数据进行搜索/过滤和分析。
要掌握聚合,只需要明白两个主要的概念:
-
桶(Buckets)
满足特定条件的文档的集合
-
指标(Metrics)
对桶内的文档进行统计计算
这就是全部了!每个聚合都是 n >= 1 个桶 和 n >= 0 个指标的组合。参考2
当聚合开始被执行,每个文档里面的值通过计算来决定符合哪个条件的桶。如果匹配到,文档将放入相应的桶并接着进行聚合操作。
桶可以被嵌套在其他桶里面,提供层次化或者有条件的划分方案。例如,手机放入数码产品这个桶,数码产品放入商品这个桶。
Elasticsearch 有多种类型的桶,能够一多种方式划分文档(时间、年龄区间、地理位置)。根本原理都一样:基于条件划分文档。
指标
桶能让我们划分文档为有意义的集合,但我们最终需要的是对桶内的文档进行一些指标的计算。分桶是一种达到目的的手段:它提供
了一种给文档分组的方法,让我们可以计算感兴趣的指标。
大多数指标是简单的数学运算(例如最小值、平均值、最大值、还有汇总),这些是通过文档的值来计算。在实践中,可以用指标来
计算:平均薪资、最高出售价格等诸如此类的数据。
尝试聚合
聚合入门示例,参考官方中文文档尝试聚合。
GET /cars/transactions/_search
{
"size" : 0,
"aggs" : {
"popular_colors" : {
"terms" : {
"field" : "color"
}
}
}
}
- 聚合操作被置于顶层参数 aggs 之下(aggregations 也可以)。
- 为聚合指定一个名称: popular_colors 。
- 定义单个桶的类型 terms 。
聚合是在特定搜索结果背景下执行的,它是查询请求 /_search 的一个顶层参数。聚合可以与查询一起使用。
将size 设置为 0 来提高查询速度,因为我们并不关心搜索结果的具体内容。
“popular_colors” 是我们给聚合定义的名字,相应的结果会以我们定义的名字为标签。
在本例中,我们定义了一个单 terms 桶,这个 terms 桶会为每个碰到的唯一词项动态创建新的桶。因为我们
告诉它使用 color 字段,所以 terms 桶会为每个颜色动态创建新桶。
聚合结果:
{
...
"hits": {
"hits": []
},
"aggregations": {
"popular_colors": {
"buckets": [
{
"key": "red",
"doc_count": 4
},
{
"key": "blue",
"doc_count": 2
},
{
"key": "green",
"doc_count": 2
}
]
}
}
}
- 因为设置了 size 参数,所以不会有 hits 搜索结果返回
- popular_colors 聚合是作为 aggregations 字段的一部分被返回的。
- 每个桶的 key 都与 color 字段里找到的唯一词对应。它总会包含 doc_count 字段,告诉我们包含该词项的文档数量。
- 每个桶的数量代表该颜色的文档数量。
响应包含多个桶,每个对应一个唯一颜色(例如:红 或 绿)。每个桶也包括 聚合进 该桶的所有文档的数量。例如,有四辆红色的车。
前面的这个例子完全是实时执行的:一旦文档可以被搜到,它就能被聚合。这也就意味着我们可以直接将聚合的结果源源不断的传入图形库,然后生成实时的仪表盘。 不久,你又销售了一辆银色的车,我们的图形就会立即动态更新银色车的统计信息。