接续上篇,本篇介绍elasticsearch聚合查询,使用python库elasticsearch-dsl进行聚合查询操作。

条形图

聚合有一个令人激动的特性就是能够十分容易地将数据转换成图表和图形。

    • 创建直方图需要指定一个区间,如果我们要为售价创建一个直方图,可以将间隔设为 20,000。这样做将会在每个 $20,000 档创建一个新桶,然后文档会被分到对应的桶中。

       GET cars/transactions/_search
      {
      "size": ,
      "aggs": {
      "price": {
      "histogram": {
      "field": "price",
      "interval":
      },
      "aggs": {
      "revenue": {
      "sum": {
      "field": "price"
      }
      }
      }
      }
      }
      }
       s = Search(index='cars')
      s.aggs.bucket("price", "histogram", field="price", interval=20000).metric("revenue", "sum", field="price")
      response = s.execute()

      图形化表示

    • 更强大的统计
       GET /cars/transactions/_search
      {
      "size" : ,
      "aggs": {
      "makes": {
      "terms": {
      "field": "make",
      "size":
      },
      "aggs": {
      "stats": {
      "extended_stats": {
      "field": "price"
      }
      }
      }
      }
      }
      }
       s = Search(index='cars')
      s.aggs.bucket("makes", "terms", field="make", size=10).metric("stats", "extended_stats", field="price")
      response = s.execute()
    • 按时间统计(date_histogram),每月销售了多少台汽车?
       GET cars/transactions/_search
      {
      "size": ,
      "aggs": {
      "sales": {
      "date_histogram": {
      "field": "sold",
      "interval": "month",
      "format": "yyyy-MM-dd",
      "extended_bounds": {
      "min": "2014-01-01",
      "max": "2014-12-31"
      }
      }
      }
      }
      }
       s = Search(index='cars')
      s.aggs.bucket("sales", "date_histogram", field="sold", interval="month",
      format="yyyy-MM-dd", extended_bounds={"min": "2014-01-01", "max": "2014-12-31"})
      response = s.execute()
    • 计算每个季度所有汽车品牌的销售总额以及每种汽车品牌的销售总额
       GET cars/transactions/_search
      {
      "size": ,
      "aggs": {
      "sales": {
      "date_histogram": {
      "field": "sold",
      "interval": "quarter",
      "format": "yyyy-MM-dd",
      "extended_bounds": {
      "min": "2014-01-01",
      "max": "2014-12-31"
      }
      },
      "aggs": {
      "per_make_sum": {
      "terms": {
      "field": "make"
      },
      "aggs": {
      "sum_price": {
      "sum": {
      "field": "price"
      }
      }
      }
      },
      "total_sum": {
      "sum": {
      "field": "price"
      }
      }
      }
      }
      }
      }
       s = Search(index='cars')
      a1 = A("date_histogram", field="sold", interval="quarter", format="yyyy-MM-dd",
      extended_bounds={"min": "2014-01-01", "max": "2014-12-31"})
      a2 = A("terms", field="make")
      s.aggs.bucket("sales", a1).bucket("per_make_sum", a2).metric("sum_price", "sum", field="price")
      s.aggs["sales"].metric("total_sum", "sum", field="price")
      response = s.execute()
    • 限定范围的聚合,福特在售车有多少种颜色?
       GET cars/transactions/_search
      {
      "query": {
      "match": {
      "make": "ford"
      }
      },
      "aggs": {
      "colors": {
      "terms": {
      "field": "make"
      }
      }
      }
      }
       s = Search(index="cars").query("match", make="ford")
      s.aggs.bucket("colors", "terms", field="make")
      response = s.execute()
    • 全局桶(全局桶包含所有的文档,它无视查询的范围),比方说我们想知道福特汽车与所有汽车平均售价的比较
       GET cars/transactions/_search
      {
      "query": {
      "match": {
      "make": "ford"
      }
      },
      "aggs": {
      "single_avg_price": {
      "avg": {
      "field": "price"
      }
      },
      "all": {
      "global": {}, --global忽略过滤条件
      "aggs": {
      "avg_price": {
      "avg": {
      "field": "price"
      }
      }
      }
      }
      }
      }
       s = Search(index="cars").query("match", make="ford")
      s.aggs.metric("single_avg_price", "avg", field="price")
      s.aggs.bucket("all", "global").metric("avg_price", "avg", field="price")
      response = s.execute()
    • 过滤,找到售价在 $10,000 美元之上的所有汽车同时也为这些车计算平均售价
       GET cars/transactions/_search
      {
      "query": {
      "constant_score": {
      "filter": {
      "range": {
      "price": {
      "gte":
      }
      }
      }
      }
      },
      "aggs": {
      "single_avg_price": {
      "avg": {
      "field": "price"
      }
      }
      }
      }
       s = Search(index="cars").query("range", price={"gte": 10000})
      s.aggs.metric("single_avg_price", "avg", field="price")
      response = s.execute()
    • 过滤桶(一种特殊桶),搜索福特汽车在2014年上半年销售汽车的均价
       GET /cars/transactions/_search
      {
      "size" : ,
      "query":{
      "match": {
      "make": "ford"
      }
      },
      "aggs":{
      "recent_sales": {
      "filter": {
      "range": {
      "sold": {
      "from": "2014-01-01",
      "to": "2014-06-30"
      }
      }
      },
      "aggs": {
      "average_price":{
      "avg": {
      "field": "price"
      }
      }
      }
      }
      }
      }
       s = Search(index="cars").query("match", make="ford")
      q = Q("range", sold={"from": "2014-01-01", "to": "2014-06-30"})
      s.aggs.bucket("recent_sales", "filter", q).metric("average_price", "avg", field="price")
      response = s.execute()
    • 后过滤器(post_filter),只过滤搜索结果,不过滤聚合结果,对聚合没有影响
       GET cars/transactions/_search
      { "query": {
      "match": {
      "make": "ford"
      }
      },
      "post_filter": {
      "term": {
      "color": "green"
      }
      },
      "aggs": {
      "all_colors": {
      "terms": {
      "field": "color"
      }
      }
      }
      }
       s = Search(index="cars").query("match", make="ford").post_filter("term", color="green")
      s.aggs.bucket("all_colors", "terms", field="color")
      response = s.execute()

内置排序

  • _count:按文档数排序。对 terms 、 histogram 、 date_histogram 有效
  • _term:按词项的字符串值的字母顺序排序。只在 terms 内使用
  • _key:按每个桶的键值数值排序(理论上与 _term 类似)。 只在 histogram 和 date_histogram 内使用
    • 让我们做一个 terms 聚合但是按 doc_count 值的升序排序

       GET cars/transactions/_search
      {
      "size": ,
      "aggs": {
      "colors": {
      "terms": {
      "field": "color",
      "order": {
      "_count": "asc"
      }
      }
      }
      }
      }
       s = Search(index="cars")
      s.aggs.bucket("colors", "terms", field="color", order={"_count": "asc"})
      response = s.execute()
    • 按度量排序,按照汽车颜色分类,再按照汽车平均售价升序排列
       GET cars/transactions/_search
      {
      "size": ,
      "aggs": {
      "colors": {
      "terms": {
      "field": "color",
      "order": {
      "avg_price": "asc"
      }
      },
      "aggs": {
      "avg_price": {
      "avg": {
      "field": "price"
      }
      }
      }
      }
      }
      }
       s = Search(index="cars")
      s.aggs.bucket("colors", "terms", field="color", order={"avg_price": "asc"}).metric("avg_price", "avg", field="price")
      response = s.execute()
    • 基于“深度”度量排序

我们可以定义更深的路径,将度量用尖括号( > )嵌套起来,像这样: my_bucket>another_bucket>metric 。

需要提醒的是嵌套路径上的每个桶都必须是 单值 的。 filter 桶生成 一个单值桶:所有与过滤条件匹配的文档都在桶中。 多值桶(如:terms )动态生成许多桶,无法通过指定一个确定路径来识别。

目前,只有三个单值桶: filter 、 global 和 reverse_nested 。

    • 让我们快速用示例说明,创建一个汽车售价的直方图,但是按照红色和绿色(不包括蓝色)车各自的方差来排序

       GET /cars/transactions/_search
      {
      "size" : ,
      "aggs" : {
      "colors" : {
      "histogram" : {
      "field" : "price",
      "interval": ,
      "order": {
      "red_green_cars>stats.variance" : "asc"
      }
      },
      "aggs": {
      "red_green_cars": {
      "filter": { "terms": {"color": ["red", "green"]}},
      "aggs": {
      "stats": {"extended_stats": {"field" : "price"}}
      }
      }
      }
      }
      }
      }
       s = Search(index="cars")
      a = A("histogram", field="price", interval=20000, order={"red_green_cars>stats.variance": "asc"})
      q = A("filter", filter={"terms": {"color": ["red", "green"]}})
      s.aggs.bucket("colors", a).bucket("red_green_cars", q).metric("stats", "extended_stats", field="price")
      response = s.execute()

elasticsearch-dsl聚合-2的更多相关文章

  1. ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合

    Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...

  2. Elasticsearch(8) --- 聚合查询(Metric聚合)

    Elasticsearch(8) --- 聚合查询(Metric聚合) 在Mysql中,我们可以获取一组数据的 最大值(Max).最小值(Min).同样我们能够对这组数据进行 分组(Group).那么 ...

  3. Elasticsearch(9) --- 聚合查询(Bucket聚合)

    Elasticsearch(9) --- 聚合查询(Bucket聚合) 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch(8) --- 聚合查询(Metri ...

  4. Elasticsearch 之聚合分析入门

    本文主要介绍 Elasticsearch 的聚合功能,介绍什么是 Bucket 和 Metric 聚合,以及如何实现嵌套的聚合. 首先来看下聚合(Aggregation): 什么是 Aggregati ...

  5. Elasticsearch系列---聚合查询原理

    概要 本篇主要介绍聚合查询的内部原理,正排索引是如何建立的和优化的,fielddata的使用,最后简单介绍了聚合分析时如何选用深度优先和广度优先. 正排索引 聚合查询的内部原理是什么,Elastich ...

  6. Elasticsearch DSL中Query与Filter的不同

    Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询. 举个DSL例子 GET _search { "query": { ...

  7. ElasticSearch 的 聚合(Aggregations)

    Elasticsearch有一个功能叫做 聚合(aggregations) ,它允许你在数据上生成复杂的分析统计.它很像SQL中的 GROUP BY 但是功能更强大. Aggregations种类分为 ...

  8. ElasticSearch - 信息聚合系列之聚合过滤

    摘要 聚合范围限定还有一个自然的扩展就是过滤.因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上. 版本 elasticsearch版本: elasticsearch-2. ...

  9. [elk]elasticsearch dsl语句

    例子1 统计1,有唱歌兴趣的 2,按年龄分组 3,求每组平均年龄 4,按平均年龄降序排序 sql转为dsl例子 # 每种型号车的颜色数 > 1的 SELECT model,COUNT(DISTI ...

  10. elasticsearch DSL查询

    总结一个DSL的用法吧,语法网上查去,只记录一点心得,也是研究了半天,太麻烦了 先附上python代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ fro ...

随机推荐

  1. express中connect-flash中间件的使用

    在学习node的时候,flash是困扰我最久的一个中间件,之前一直都没有很好的理解,这里做一个总结. 参考自:http://yunkus.com/connect-flash-usage/ 什么是fla ...

  2. Get和Post区别,EncType提交数据的格式详解——转自他人博客的

    1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...

  3. Java Executors小结

    一 Executors提供了一系列工厂方法用于创先线程池ThreadPoolExecutor线程池的具体实现类,一般用的各种线程池都是基于这个类实现的 返回的线程池都实现了ExecutorServic ...

  4. 【snmp】测试流程

    一.SNMP协议概述 SNMP是基于TCP/IP协议族的网络管理标准,是一种在IP网络中管理网络节点(如服务器.工作站.路由器.交换机等)的标准协议.SNMP能够使网络管理员提高网络管理效能,及时发现 ...

  5. NET平台4.0 发布网站流程及出错总结

    1.进入IIS设置,在控制面板中选择“管理工具”,进入后选择 “Internet 信息服务(IIS)管理器” 2.点击[添加]应用程序池,根据版本选择framework 3.添加网站 ,右击网站,添加 ...

  6. IDEA中的一些常用的设置与快捷键

    idea 清屏(控制台)快捷键 eclipse清屏快捷键为鼠标右键+R 而在idea中默认并没有清屏console的快捷键 所以需要我们自行设置: 1,ctrl+alt+s打开settings 2,找 ...

  7. js-对象的方法详解

    Object.prototype 上的方法: constructor 返回创建该对象的构造函数 var arr = []; arr.constructor == function Array() { ...

  8. tween.js 插件

    1.是什么? jQueryTween是一款轻量级的jQuery补间动画工具库插件.使用jQueryTween可以制作出各种平滑的动画过渡效果.该插件基于tween.js,旨在简化各种补间动画操作,提供 ...

  9. Linq to Sql 左连接 , 取右表可能为 null的 int类型字段

    linq to sql , linq to entity 遇到一个问题, 主表, 从表 一对一 关系,  主表有记录, 从表 可能没有记录. 现在要查询 主表+从表 的某几个字段. 从表字段 有的是 ...

  10. Java—继承

    继承 继承是类与类的一种关系,是一种“is a”的关系.注意:java中的继承是单继承,一个类只有一个父类. 继承的好处:子类拥有父类的所有属性和方法(private修饰的无效),实现代码的复用 语法 ...