zoukankan      html  css  js  c++  java
  • 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"

    }

    }

    }

    }

    }

    }

  • 相关阅读:
    设置Jmeter默认中文页面
    spring boot controller设置 @Transactional 不回滚的解决办法
    SpringBoot事务注解@Transactional
    spring boot @Transactional事物处理
    Spring事务管理中@Transactional
    @Transactional 注解的使用和注意
    spring的@Transactional注解详细用法
    【Developer Log】ProGuard扰码可执行JAR包
    使用Jprofiler+jmeter进行JVM性能调优
    SQL中如何使用EXISTS替代IN
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8434090.html
Copyright © 2011-2022 走看看