Elasticsearch基本概念和使用(8)

首先,我们按照 汽车的颜色color来划分桶

GET /cars/_search { "size" : 0, "aggs" : { "popular_colors" : { "terms" : { "field" : "color" } } } }

size: 查询条数,这里设置为0,因为我们不关心搜索到的数据,只关心聚合结果,提高效率

aggs:声明这是一个聚合查询,是aggregations的缩写

popular_colors:给这次聚合起一个名字,任意。

terms:划分桶的方式,这里是根据词条划分

field:划分桶的字段

结果:

{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": 8, "max_score": 0, "hits": [] }, "aggregations": { "popular_colors": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "red", "doc_count": 4 }, { "key": "blue", "doc_count": 2 }, { "key": "green", "doc_count": 2 } ] } } }

hits:查询结果为空,因为我们设置了size为0

aggregations:聚合的结果

popular_colors:我们定义的聚合名称

buckets:查找到的桶,每个不同的color字段值都会形成一个桶

key:这个桶对应的color字段的值

doc_count:这个桶中的文档数量

通过聚合的结果我们发现,目前红色的小车比较畅销!

3.3 桶内度量

前面的例子告诉我们每个桶里面的文档数量,这很有用。 但通常,我们的应用需要提供更复杂的文档度量。 例如,每种颜色汽车的平均价格是多少?

因此,我们需要告诉Elasticsearch使用哪个字段,使用何种度量方式进行运算,这些信息要嵌套在桶内,度量的运算会基于桶内的文档进行

现在,我们为刚刚的聚合结果添加 求价格平均值的度量:

GET /cars/_search { "size" : 0, "aggs" : { "popular_colors" : { "terms" : { "field" : "color" }, "aggs":{ "avg_price": { "avg": { "field": "price" } } } } } }

aggs:我们在上一个aggs(popular_colors)中添加新的aggs。可见度量也是一个聚合,度量是在桶内的聚合

avg_price:聚合的名称

avg:度量的类型,这里是求平均值

field:度量运算的字段

结果:

... "aggregations": { "popular_colors": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "red", "doc_count": 4, "avg_price": { "value": 32500 } }, { "key": "blue", "doc_count": 2, "avg_price": { "value": 20000 } }, { "key": "green", "doc_count": 2, "avg_price": { "value": 21000 } } ] } } ...

可以看到每个桶中都有自己的avg_price字段,这是度量聚合的结果

3.4 桶内嵌套桶

刚刚的案例中,我们在桶内嵌套度量运算。事实上桶不仅可以嵌套运算, 还可以再嵌套其它桶。也就是说在每个分组中,再分更多组。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11604.html