美文网首页ElasticSearch实战笔记
32、ES多种聚合分析与排序的实现

32、ES多种聚合分析与排序的实现

作者: 众神开挂 | 来源:发表于2020-04-16 00:06 被阅读0次

主要内容:多种聚合分析与排序的实现

1、下钻分析之统计每季度每个品牌的销售额

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "group_by_sold_date": {
      "date_histogram": {
        "field": "sold_date",
        "calendar_interval": "quarter",  ## quarter:季度,month:月度
         "format": "yyyy-MM-dd", 
        "min_doc_count": 1,   ##只返回有结果的聚合
        "extended_bounds": {
          "min": "2016-01-01",
          "max": "2017-12-31"
        }
      },
      "aggs": {
        "group_by_brand": {   ##对每个季度的品牌进行统计
          "terms": {
            "field": "brand"
          },
          "aggs": {
            "sum_price": {   ## 每个品牌的总销售额
              "sum": {
                "field": "price"
              }
            }
          }
        },
        "total_sum_price": {   ##当季的总销售额
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

2、统计指定品牌下每个颜色的销量

搜索和聚合组合起来使用

任何的聚合,都必须在搜索出来的结果数据中之行,搜索结果,就是聚合分析操作的scope

GET /tvs/_search
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "小米"
      }
    }
  },
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      }
    }
  }
}

3、单个品牌与所有品牌销量对比

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

GET /tvs/_search
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "长虹"
      }
    }
  },
  "aggs": {
    "single_brand_avg_price": {
      "avg": {
        "field": "price"
      }
    },
    "all": {
      "global": {},  ##global:就是global bucket,就是将所有数据纳入聚合的scope
      "aggs": {
        "all_brand_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

single_brand_avg_price:就是针对query搜索结果,执行的,拿到的,就是长虹品牌的平均价格
all.all_brand_avg_price:拿到所有品牌的平均价格

4、统计价格大于1200的电视平均价格

过滤+聚合

GET /tvs/_search 
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "price": {
            "gte": 1200
          }
        }
      }
    }
  },
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

5、_bucket filter:统计品牌最近一个月的平均价格

统计长虹电视不同时间范围内的平均价格:

GET /tvs/_search 
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "长虹"    ## 如果放query里面的filter,是全局的,会对所有的数据都有影响
      }
    }
  },
  "aggs": {
    "recent_150d": {  ##150天内的平均价格 
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-150d"
          }
        }
      },
      "aggs": {
        "recent_150d_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "recent_1M": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-1M" ##最近一个月内的平均价格
          }
        }
      },
      "aggs": {
        "recent_1M_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "recent_2M": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-2M" ##最近两个月内的平均价格
          }
        }
      },
      "aggs": {
        "recent_2M_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

aggs.filter,针对的是聚合去做的

bucket filter:对不同的bucket下的aggs,进行filter

不同时间的表达:

year(1y)年
quarter(1q)季度
month(1M)月份
week(1w)星期
day(1d)天
hour(1h)小时
minute(1m)分钟
second(1s)秒

6、按每种颜色的平均销售额降序排序

之前的排序是按照每个bucket的doc_count降序来排的,我们现在统计出来每个颜色的电视的销售额,需要按照销售额降序排序

## 未进行排序
GET /tvs/_search 
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

## 增加排序
GET /tvs/_search 
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color",
        "order": {
          "avg_price": "asc"  ## 按照销售额进行升序排序
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

7、下钻分析时按最深层metric进行排序

GET /tvs/_search
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "group_by_brand": {
          "terms": {
            "field": "brand",
            "order": {
              "avg_price": "desc"  ## 按颜色分类之后,对品牌的平均价格进行降序排序
            }
          },
          "aggs": {
            "avg_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

相关文章

  • 32、ES多种聚合分析与排序的实现

    主要内容:多种聚合分析与排序的实现 1、下钻分析之统计每季度每个品牌的销售额 2、统计指定品牌下每个颜色的销量 搜...

  • ES之聚合分析

    一:聚合分析简介 对于ES聚合,相当与数据库中的group by 语句,把ES中符合的数据给聚合并返回给客户端。 ...

  • Elasticsearch——聚合搜索

    聚合分析简介 聚合分析:英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能。 功能...

  • Elasticsearch笔记(6)

    ES中的聚合 ES中的聚合分析主要包含指标聚合、桶聚合、管道聚合和矩阵聚合等。后面两种后面会慢慢移除。主要多前两种...

  • golang elasticsearch 聚合分析(Aggreg

    elasticsearch聚合分析的概念和语法可以参考:ES聚合分析[https://www.tizi365.co...

  • 6.3-作用范围与排序

    聚合的作⽤范围 ES 聚合分析的默认作⽤范围是 query 的查询结果集 同时 ES 还⽀持以下⽅式改变聚合的作⽤...

  • 大文件上的结构化数据计算示例

    本文分析大文件计算的实现原理,如过滤、聚合计算、添加计算列、排序、分组聚合、topN 等,以及利用并行计算来提高计...

  • 几个例子说聚合

    简介 ES的聚合是一个有用的工具,能够帮助我们有效地了解我们的数据。聚合有多种类型:metric聚合,bucket...

  • 数据结构基础学习之(内排序)

    学习知识 排序基本概念 插入排序的实现方法及性能分析 交换排序的实现方法及性能分析 选择排序的实现方法及性能分析 ...

  • 2020-12.10--Spark-18(Spark-Core)

    案例分析、回顾与优化组内 区内 排序 聚合未解决的问题:使用reducebykey乱序问题(怎么定义合理分区),...

网友评论

    本文标题:32、ES多种聚合分析与排序的实现

    本文链接:https://www.haomeiwen.com/subject/ackumhtx.html