接续上篇,本篇介绍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. .NET控制台程序监听程序退出

    There are mainly 2 types of Win32 applications, console application and window application. They hav ...

  2. pat1040. Longest Symmetric String (25)

    1040. Longest Symmetric String (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, ...

  3. btfs

    以下都是举例说明: A. 使用fdisk命令对/dev/sdb进行分区 B. 先对/dev/sdb5和/dev/sdb6进行格式化, 文件系统为btrfs C. 使用btrfs filesystem ...

  4. C#窗体控件GroupBox修改边框色

    控件Group Box默认的边框的颜色是白色的,在很多时候显得不那么突出.但默认的属性列表里面并没有提供相应的接口.所以只能借助重绘事件. 网上很多都说使用 OnPaint 事件,但是我在事件列表中没 ...

  5. Android 程序结构介绍

    创建好Android开发环境后,创建一个Android Project, 截图如下:

  6. c#操作excel的一些记录

    //开启Excel APP            Excel.Application xlApp = new Excel.Application(); //获取程序下bin—>debug下的文件 ...

  7. [Java][Servlet] Cannot call sendRedirect() after the response has been committed

    做一个Login Demo的时候,写了如下代码: protected void doPost(HttpServletRequest request, HttpServletResponse respo ...

  8. css3实现iPhone滑动解锁

    该效果的主要实现思路是给文字添加渐变的背景,然后对背景进行裁剪,按文字裁剪(目前只有webkit内核浏览器支持该属性),最后给背景添加动画,即改变背景的位置,背景动画效果如下(GIF录制时有卡顿,代码 ...

  9. KinSlideshow焦点图轮播插件

    KinSlideshow默认设置效果代码: *焦点图显示的标题为 img 中 alt 属性中的文字 *当只有一张图片时不显示按钮,但也会有无缝切换效果 * jquery ..以上版本 jvascrip ...

  10. appium-python-api中文文档

    来自https://wenku.baidu.com/view/533603ce581b6bd97e19eaa1.html mark,同时提供给需要使用python写脚本的童鞋们