8.简单的聚合分析

主要知识点:

  1. 计算每个tag下的商品数量
  2. 查询所有tags,不聚合
  3. 对名称中包含yagao的商品,计算每个tag下的商品数量
  4. 先分组,再算每组的平均值,计算每个tag下的商品的平均价格
  5. 计算每个tag下的商品的平均价格,并且按照平均价格降序排序
  6. 按照指定的价格范围区间进行分组,然后在每组内再按照tag进行分组,最后再计算每组的平均价格

   

查询所有tags下的term,不聚合

GET /ecommerce/product/_search

{

"size": 0,

"aggs": {

"all_tags": {

"terms": { "field": "tags" }

}

}

}

 结果如下:

{

"took": 41,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

"hits": {

"total": 4,

"max_score": 0,

"hits": []

},

"aggregations": {

"aggrs_by_tags": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 0,

"buckets": [

{

"key": "fangzhu",

"doc_count": 2

},

{

"key": "meibai",

"doc_count": 1

},

{

"key": "qingxin",

"doc_count": 1

}

]

}

}

}

一、计算每个tag下的商品数量

GET /ecommerce/product/_search

{

"size": 0,

"aggs": {

"group_by_tags": {

"terms": { "field": "tags" }

}

}

}

"group_by_tags" 是自己给这次聚合查询所起的名字。

"size": 0, 表示不再显示原始数据,如果不加,es会把参与了聚合的数据都查询出来。

结果如下:

   

{

"error": {

"root_cause": [

{

"type": "illegal_argument_exception",

"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [tags] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."

}

],

"type": "search_phase_execution_exception",

"reason": "all shards failed",

"phase": "query",

"grouped": true,

意思是,在默认的情况下,text fields 的fielddata属性是faulse,这导致数据不能加载到内存。所以不能进行到排索引的查询。

解决办法是:将文本fieldfielddata属性设置为true

   

PUT /ecommerce/_mapping/product

{

"properties": {

"tags": {

"type": "text",

"fielddata": true

}

}

}

然后再次运行聚合查询就能查询出结果:

   

二、对名称中包含yagao的商品,计算每个tag下的商品数量

   

GET /ecommerce/product/_search

{

"size": 0,

"query": {

"match": {

"name": "yagao"

}

},

"aggs": {

"all_tags": {

"terms": {

"field": "tags"

}

}

}

}

   

----------------------------------------------------------------------------------------------------------------

   

三、先分组,再算每组的平均值,计算每个tag下的商品的平均价格

   

GET /ecommerce/product/_search

{

"size": 0,

"aggs" : {

"group_by_tags" : {

"terms" : { "field" : "tags" },

"aggs" : {

"avg_price" : {

"avg" : { "field" : "price" }

}

}

}

}

}

结果:

四、计算每个tag下的商品的平均价格,并且按照平均价格降序排序

   

GET /ecommerce/product/_search

{

"size": 0,

"aggs" : {

"all_tags" : {

"terms" : { "field" : "tags", "order": { "avg_price": "desc" } },

"aggs" : {

"avg_price" : {

"avg" : { "field" : "price" }

}

}

}

}

}

GET ecommerce/product/_search

{

"size": 0,

"aggs": {

"aggrs_by_tags": {

"terms": {

"field": "tags",

"order": {

"avg_price": "desc"

}

},

"aggs": {

"avg_price": {

"avg": {

"field": "price"

}

}

}

}

}

}

   

可以看出,我们在一个查询的上部分,可以使用该查询的下部分所查询得到的结果,如本例中order 使用了 avg_price

   

我们现在全部都是用esrestful api在学习和讲解es的所欲知识点和功能点,但是没有使用一些编程语言去讲解(比如java),原因有以下:

   

1es最重要的api,让我们进行各种尝试、学习甚至在某些环境下进行使用的api,就是restful api。如果你学习不用es restful api,比如我上来就用java api来讲es,也是可以的,但是你根本就漏掉了es知识的一大块,你都不知道它最重要的restful api是怎么用的

2、讲知识点,用es restful api,更加方便,快捷,不用每次都写大量的java代码,能加快讲课的效率和速度,更加易于同学们关注es本身的知识和功能的学习

3、我们通常会讲完es知识点后,开始详细讲解java api,如何用java api执行各种操作

4、我们每个篇章都会搭配一个项目实战,项目实战是完全基于java去开发的真实项目和系统

五、按照指定的价格范围区间进行分组,然后在每组内再按照tag进行分组,最后再计算每组的平均价格

GET /ecommerce/product/_search

{

"size": 0,

"aggs": {

"group_by_price": {

"range": {

"field": "price",

"ranges": [{"from": 0,"to": 20}

{"from": 20,"to": 40}

{"from": 40,"to": 60}]

},

"aggs": {

"group_by_tags": {

"terms": {

"field": "tags"

},

"aggs": {

"average_price": {

"avg": {

"field": "price"

}

}

}

}

}

}

}

}

结果:

"aggregations": {

"group_by_price": {

"buckets": [

{

"key": "0.0-20.0",

"from": 0,

"to": 20,

"doc_count": 0,

"group_by_tags": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 0,

"buckets": []

}

},

   

GET ecommerce/product/_search

{

"size": 0,

"aggs": {

"aggrs_by_tags": {

"terms": {

"field": "tags"

},

"aggs": {

"avg_price": {

"avg": {

"field": "price"

}

}

}

}

}

}

原文地址:https://www.cnblogs.com/liuqianli/p/8434090.html