ES聚合查询-桶的概念
桶聚合
- 桶(Buckets),满足特定条件的文档的集合
- 桶 在概念上类似于SQL中的分组(group by)
- 分桶就是将某一类共同特征的数据归为一类,然后计算总数,例如一个员工属于男性桶或者女性桶,商品评级:高档、中档、低档等等
- 当聚合开始被执行,每个文档里面的值通过计算来决定符合哪个桶的条件。如果匹配到,文档将放入相应的桶并接着进行聚合操作。
- 桶也可以被嵌套在其他桶里面,提供层次化的或者有条件的划分方案。例如,海淀区被放入北京这个桶,而整个北京桶会被放入中国这个桶。
实例
-
GET /cars/transactions/_search { "size" : 0, "aggs" : { "popular_colors" : { "terms" : { "field" : "color" } } } }
-
聚合的基本结构
-
"aggregations" : { <!-- 最外层的聚合键,也可以缩写为 aggs --> "<aggregation_name>" : { <!-- 聚合的自定义名字 --> "<aggregation_type>" : { <!-- 聚合的类型,指标相关的,如 max、min、avg、sum,桶相关的 terms、filter 等 --> <aggregation_body> <!-- 聚合体:对哪些字段进行聚合,可以取字段的值,也可以是脚本计算的结果 --> } [,"meta" : { [<meta_data_body>] } ]? <!-- 元 --> [,"aggregations" : { [<sub_aggregation>]+ } ]? <!-- 在聚合里面在定义子聚合 --> } [,"<aggregation_name_2>" : { ... } ]* <!-- 聚合的自定义名字 2 --> }
-
聚合操作被置于顶层参数 aggs之下,完整形式 aggregations 同样有效
-
然后,可以为聚合指定一个名称,本例中是:popular_colors。
-
最后,定义单个桶的类型 terms。
-
size设置为0,记录返回数为0提高查询效率。
-
以color字段分桶,所以桶会为每个颜色动态创建新桶。
-
查询结果如下:
-
{ ... "hits": { "hits": [] }, "aggregations": { "popular_colors": { "buckets": [ { "key": "red", "doc_count": 4 }, { "key": "blue", "doc_count": 2 }, { "key": "green", "doc_count": 2 } ] } } }
-
popular_colors聚合是作为 aggregations字段的一部分被返回的。
-
每个桶的key都与color字段里找到的唯一词对应。它总会包含doc_count字段,告诉我们包含该词项的文档数量。
-
每个桶的数量代表该颜色的文档数量。