接续上篇,本篇介绍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. 关于老教授之家项目的思考 && 中国互联网+大赛培训

    最近在做中国互联网+竞赛相关的项目,有一点思考在这里记录下来,算是一份经历,日后可以再回顾,这也是我真正参加的一个大型比赛,作为技术人员可能更多的是从事技术,但是在其他方面能贡献自己的一份力量也是不错 ...

  2. 分布式任务框架elastic-job 学习笔记

    官方资料:https://github.com/dangdangdotcom/elastic-job ------------------------------------------------- ...

  3. 《深入浅出Node.js》学习笔记(一)

    看了朴灵前辈的node.js系列文章,很开阔视野,虽然能力有限还是有很多不懂,但是还是希望能写下笔记,初步对node.js有点了解. 一.概念 Node.js不是JS应用.而是JS运行平台 Node. ...

  4. 深入学习hbase:表,列族,列标识,版本和cell

    HBase是面向列的分布式的数据库,和传统的关系型数据库有很大的不同:物理模型和逻辑模型.这里我们要首先讲一下HBase数据库相关的区别于关系型数据库的几个基本概念:          表:HBase ...

  5. Andrew Ng 的 Machine Learning 课程学习 (week4) Multi-class Classification and Neural Networks

    这学期一直在跟进 Coursera上的 Machina Learning 公开课, 老师Andrew Ng是coursera的创始人之一,Machine Learning方面的大牛.这门课程对想要了解 ...

  6. POJ 1456——Supermarket——————【贪心+并查集优化】

    Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit  ...

  7. MVC数据库问题(更新,添加字段)

    1.更新模型之后,在"程序包管理控制器"中输入Update-database,就能自动完成更新 2.对于Update-database之后报错:Automatic migratio ...

  8. mysql数据库免安装版的配置过程

    1,从mysql官方网站下载免安装版本与自己电脑位数相同的mysql版本. 链接:https://www.mysql.com/ 2,将包解压到自定义的目录下 (例:D:\mysql-5.7.23-wi ...

  9. intellijidea课程 intellijidea神器使用技巧 3-4 alter+enter

    alter enter ==> 创建函数 fi() ==> alter enter

  10. 编译Win32动态库工程的两个链接错误的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天编译一个Win32动态库工程,出现两个链接错误的解决,一个是: main.obj: error LNK2001: ...