接续上篇,本篇介绍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. CSS伪类:first-child与:first-of-type的异同

    CSS里关于元素匹配里面有两个非常类似却又不尽相同的选择器,伪类 :first-child 和 :first-of-type 两者在匹配方式上有很大差异,其实在一开始自己也没去注意这个细节,直到上次一 ...

  2. 【转】Android实现伸缩弹力分布菜单效果

    本文介绍下在Android中实现伸缩弹力分布菜单效果.关于这种菜单效果在IPhone中比较常见,效果比较酷.那么在Android中实现只是一种简单的模仿. 这两天无意间看到一园友的博文实现Path2. ...

  3. jQuery Validate验证框架详解(转)

    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type=& ...

  4. Unity 滚轮实现UGUI ScrollView的缩放

    本文原创,转载请注明出处http://www.cnblogs.com/AdvancePikachu/p/7908754.html 前段时间在做一个类似AnimationCurve的可视化编辑器,其中在 ...

  5. 动态LINQ(Lambda表达式)构建

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  6. CSS Grid 布局学习笔记

    CSS Grid 布局学习笔记 好久没有写博客了, MDN 上关于 Grid 布局的知识比较零散, 正好根据我这几个月的实践对 CSS Grid 布局做一个总结, 以备查阅. 1. 基础用法 Grid ...

  7. spring笔记3-AOP

    一.概述 AOP:(Aspect Oriented Programming)即:面向切面编程.把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法 ...

  8. canvas的globalAlphaAPI

    canvas的globalAlphaAPI

  9. C++ 0x

  10. RAL调用

    [RPC的定义].RPC的全称为 Remote Procedure Call(远程过程调用).远程过程调用是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额 ...