Elasticsearch进阶笔记第二十一篇

295 阅读2分钟

Elasticsearch高手进阶篇(42)

深入聚合数据分析_global bucket:单个品牌与所有品牌销量对比

aggregation,scope,一个聚合操作,必须在query的搜索结果范围内执行

出来两个结果,一个结果,是基于query搜索结果来聚合的; 一个结果,是对所有数据执行聚合的

 GET /waws_tvs/sales/_search 
 {
   "size": 0, 
   "query": {
     "term": {
       "brand": {
         "value": "长虹"
       }
     }
   },
   "aggs": {
     "single_brand_avg_price": {
       "avg": {
         "field": "price"
       }
     },
     "all": {
       "global": {},
       "aggs": {
         "all_brand_avg_price": {
           "avg": {
             "field": "price"
           }
         }
       }
     }
   }
 }
  • global:就是global bucket,就是将所有数据纳入聚合的scope,而不管之前的query

效果展示

 {
   "took": 3,
   "timed_out": false,
   "_shards": {
     "total": 5,
     "successful": 5,
     "failed": 0
   },
   "hits": {
     "total": 3,
     "max_score": 0,
     "hits": []
   },
   "aggregations": {
     "all": {
       "doc_count": 8,
       "all_brand_avg_price": {
         "value": 2650
       }
     },
     "single_brand_avg_price": {
       "value": 1666.6666666666667
     }
   }
 }
  • single_brand_avg_price:就是针对query搜索结果,执行的,拿到的,就是长虹品牌的平均价格
  • all.all_brand_avg_price:拿到所有品牌的平均价格

Elasticsearch高手进阶篇(43)

深入聚合数据分析_过滤+聚合:统计价格大于1200的电视平均价格

  • 搜索+聚合
  • 过滤+聚合
 GET /waws_tvs/sales/_search 
 {
   "size": 0,
   "query": {
     "constant_score": {
       "filter": {
         "range": {
           "price": {
             "gte": 1200
           }
         }
       }
     }
   },
   "aggs": {
     "avg_price": {
       "avg": {
         "field": "price"
       }
     }
   }
 }
 
 {
   "took": 10,
   "timed_out": false,
   "_shards": {
     "total": 5,
     "successful": 5,
     "failed": 0
   },
   "hits": {
     "total": 7,
     "max_score": 0,
     "hits": []
   },
   "aggregations": {
     "avg_price": {
       "value": 2885.714285714286
     }
   }
 }

Elasticsearch高手进阶篇(44)

深入聚合数据分析_bucket filter:统计牌品最近一个月的平均价格

 GET /waws_tvs/sales/_search 
 {
   "size": 0,
   "query": {
     "term": {
       "brand": {
         "value": "长虹"
       }
     }
   },
   "aggs": {
     "recent_150d": {
       "filter": {
         "range": {
           "sold_date": {
             "gte": "now-150d"
           }
         }
       },
       "aggs": {
         "recent_150d_avg_price": {
           "avg": {
             "field": "price"
           }
         }
       }
     },
     "recent_140d": {
       "filter": {
         "range": {
           "sold_date": {
             "gte": "now-140d"
           }
         }
       },
       "aggs": {
         "recent_140d_avg_price": {
           "avg": {
             "field": "price"
           }
         }
       }
     },
     "recent_130d": {
       "filter": {
         "range": {
           "sold_date": {
             "gte": "now-130d"
           }
         }
       },
       "aggs": {
         "recent_130d_avg_price": {
           "avg": {
             "field": "price"
           }
         }
       }
     }
   }
 }
 ​
 {
   "took": 3,
   "timed_out": false,
   "_shards": {
     "total": 5,
     "successful": 5,
     "failed": 0
   },
   "hits": {
     "total": 3,
     "max_score": 0,
     "hits": []
   },
   "aggregations": {
     "recent_130d": {
       "doc_count": 0,
       "recent_130d_avg_price": {
         "value": null
       }
     },
     "recent_140d": {
       "doc_count": 0,
       "recent_140d_avg_price": {
         "value": null
       }
     },
     "recent_150d": {
       "doc_count": 0,
       "recent_150d_avg_price": {
         "value": null
       }
     }
   }
 }
  • aggs.filter,针对的是聚合去做的

    • 如果放query里面的filter,是全局的,会对所有的数据都有影响
    • 但是,如果,比如说,你要统计,长虹电视,最近1个月的平均值; 最近3个月的平均值; 最近6个月的平均值
  • bucket filter:对不同的bucket下的aggs,进行filter