Elasticsearch支持最直方图聚合,它在数字字段自动创建桶,并会扫描全部文档,把文档放入相应的桶中。这个数字字段既可以是文档中的某个字段,也可以通过脚本创建得出的。

桶的筛选规则

举个例子,有一个price字段,这个字段描述了商品的价格,现在想每隔5就创建一个桶,统计每隔区间都有多少个文档(商品)。

如果有一个商品的价格为32,那么它会被放入30的桶中,计算的公式如下:

  1. rem = value % interval
  2. if (rem < 0) {
  3. rem += interval
  4. }
  5. bucket_key = value - rem

通过上面的方法,就可以确定文档属于哪一个桶。

不过也有一些问题存在,由于上面的方法是针对于整型数据的,因此如果字段是浮点数,那么需要先转换成整型,再调用上面的方法计算。问题来了,正数还好,如果该值是负数,就会出现计算出错。比如,一个字段的值为-4.5,在进行转换整型时,转换成了-4。那么按照上面的计算,它就会放入-4的桶中,但是其实-4.5应该放入-6的桶中。

min_doc_count过滤

聚合的dsl如下:

  1. {
  2. "aggs" : {
  3. "prices" : {
  4. "histogram" : {
  5. "field" : "price",
  6. "interval" : 50
  7. }
  8. }
  9. }
  10. }

得到的数据为:

  1. {
  2. "aggregations": {
  3. "prices" : {
  4. "buckets": [
  5. {
  6. "key": 0,
  7. "doc_count": 2
  8. },
  9. {
  10. "key": 50,
  11. "doc_count": 4
  12. },
  13. {
  14. "key": 100,
  15. "doc_count": 0
  16. },
  17. {
  18. "key": 150,
  19. "doc_count": 3
  20. }
  21. ]
  22. }
  23. }
  24. }

上面的数据中,100-150是没有文档的,但是却显示为0.如果不想要显示count为0的桶,可以通过min_doc_count来设置。

  1. {
  2. "aggs" : {
  3. "prices" : {
  4. "histogram" : {
  5. "field" : "price",
  6. "interval" : 50,
  7. "min_doc_count" : 1
  8. }
  9. }
  10. }
  11. }

这样返回的数据,就不会出现为0的了。

  1. {
  2. "aggregations": {
  3. "prices" : {
  4. "buckets": [
  5. {
  6. "key": 0,
  7. "doc_count": 2
  8. },
  9. {
  10. "key": 50,
  11. "doc_count": 4
  12. },
  13. {
  14. "key": 150,
  15. "doc_count": 3
  16. }
  17. ]
  18. }
  19. }
  20. }

extend_bounds,指定最小值和最大值边界

默认情况下,ES中的histogram聚合起始都是自动的,比如price字段,如果没有商品的价钱在0-5之间,0这个桶就不会显示。如果最便宜的商品是11,那么第一个桶就是10.

可以通过设置extend_bounds强制规定最小值和最大值,但是要求必须min_doc_count不能大于0,不然即便是规定了边界,也不会返回。

另外需要注意的是,如果规定的extend_bounds.min要大于文档中的最小值,那么就会按照文档中的最小值来(extend_bounds.max也是如此)。

比如下面的这个例子,规定的extend_bounds.min和max分别是40和50,但是文档中含有比40还要小的数据,因此桶的定义仍然是按照文档中的数据来。

order排序

排序大同小异,可以按照_key的名字排序:

  1. {
  2. "aggs" : {
  3. "prices" : {
  4. "histogram" : {
  5. "field" : "price",
  6. "interval" : 50,
  7. "order" : { "_key" : "desc" }
  8. }
  9. }
  10. }
  11. }

也可以按照文档的数目:

  1. {
  2. "aggs" : {
  3. "prices" : {
  4. "histogram" : {
  5. "field" : "price",
  6. "interval" : 50,
  7. "order" : { "_count" : "asc" }
  8. }
  9. }
  10. }
  11. }

或者指定排序的聚合:

  1. {
  2. "aggs" : {
  3. "prices" : {
  4. "histogram" : {
  5. "field" : "price",
  6. "interval" : 50,
  7. "order" : { "price_stats.min" : "asc" }
  8. },
  9. "aggs" : {
  10. "price_stats" : { "stats" : {} }
  11. }
  12. }
  13. }
  14. }

keyed设置返回的方式

正常返回的数据如上面所示,是按照数组的方式返回。如果要按照名字返回,可以设置keyed为true

  1. {
  2. "aggs" : {
  3. "prices" : {
  4. "histogram" : {
  5. "field" : "price",
  6. "interval" : 50,
  7. "keyed" : true
  8. }
  9. }
  10. }
  11. }

那么返回的数据就为:

  1. {
  2. "aggregations": {
  3. "prices": {
  4. "buckets": {
  5. "0": {
  6. "key": 0,
  7. "doc_count": 2
  8. },
  9. "50": {
  10. "key": 50,
  11. "doc_count": 4
  12. },
  13. "150": {
  14. "key": 150,
  15. "doc_count": 3
  16. }
  17. }
  18. }
  19. }
  20. }

缺省的值

缺省值通过MissingValue设置:

  1. {
  2. "aggs" : {
  3. "quantity" : {
  4. "histogram" : {
  5. "field" : "quantity",
  6. "interval": 10,
  7. "missing": 0
  8. }
  9. }
  10. }
  11. }

Elasticsearch聚合 之 Histogram 直方图聚合的更多相关文章

  1. Elasticsearch聚合 Date Histogram聚合

    转 http://www.cnblogs.com/xing901022/p/4951603.html Elasticsearch的聚合主要分成两大类:metric和bucket,2.0中新增了pipe ...

  2. Elasticsearch聚合 之 Range区间聚合

    Elasticsearch提供了多种聚合方式,能帮助用户快速的进行信息统计与分类,本篇主要讲解下如何使用Range区间聚合. 最简单的例子,想要统计一个班级考试60分以下.60到80分.80到100分 ...

  3. ElasticSearch 2 (35) - 信息聚合系列之近似聚合

    ElasticSearch 2 (35) - 信息聚合系列之近似聚合 摘要 如果所有的数据都在一台机器上,那么生活会容易许多,CS201 课商教的经典算法就足够应付这些问题.但如果所有的数据都在一台机 ...

  4. elasticsearch聚合之bucket terms聚合

    目录 1. 背景 2. 前置条件 2.1 创建索引 2.2 准备数据 3. 各种聚合 3.1 统计人数最多的2个省 3.1.1 dsl 3.1.2 运行结果 3.2 统计人数最少的2个省 3.2.1 ...

  5. Elasticsearch学习系列四(聚合搜索)

    聚合分析 聚合分析是数据库中重要的功能特性,完成对一个查询的集中数据的聚合计算.如:最大值.最小值.求和.平均值等等.对一个数据集求和,算最大最小值等等,在ES中称为指标聚合,而对数据做类似关系型数据 ...

  6. Flask聚合函数(基本聚合函数、分组聚合函数、去重聚合函数))

    Flask聚合函数 1.基本聚合函数(sun/count/max/min/avg) 使用聚合函数先导入:from sqlalchemy import func 使用方法: sun():func.sum ...

  7. 把 Elasticsearch 当数据库使:聚合后排序

    使用 https://github.com/taowen/es-monitor 可以用 SQL 进行 elasticsearch 的查询.有的时候分桶聚合之后会产生很多的桶,我们只对其中部分的桶关心. ...

  8. Elasticsearch 聚合统计与SQL聚合统计语法对比(一)

    Es相比关系型数据库在数据检索方面有着极大的优势,在处理亿级数据时,可谓是毫秒级响应,我们在使用Es时不仅仅进行简单的查询,有时候会做一些数据统计与分析,如果你以前是使用的关系型数据库,那么Es的数据 ...

  9. Elasticsearch 第六篇:聚合统计查询

    h2.post_title { background-color: rgba(43, 102, 149, 1); color: rgba(255, 255, 255, 1); font-size: 1 ...

随机推荐

  1. 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例

    http://blog.csdn.net/e421083458/article/details/21529969 常用的命令 ps -ef|grep searchd 如果你开了search服务后,你命 ...

  2. [ASE][Daily Scrum]11.30

    燃烧图的页面进不去了…… 小结一下吧,sprint2的内容已经基本完成了, 推迟到之后进行的任务: ·地图块的刷新 一些bug尚未修复不过不是特别重要所以也推到后面了, 之后两个sprint主要会增加 ...

  3. [转载]并发编程之Operation Queue和GCD

    并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...

  4. Mvc利用淘宝Kissy uploader实现图片批量上传附带瀑布流的照片墙

    前言 KISSY 是由阿里集团前端工程师们发起创建的一个开源 JS 框架.它具备模块化.高扩展性.组件齐全,接口一致.自主开发.适合多种应用场景等特性.本人在一次项目中层使用这个uploader组件. ...

  5. C#实现 word、pdf、ppt 转为图片

    office word文档.pdf文档.powerpoint幻灯片是非常常用的文档类型,在现实中经常有需求需要将它们转换成图片 -- 即将word.pdf.ppt文档的每一页转换成一张对应的图片,就像 ...

  6. 压力测试工具ab使用

    ab全名是apache bench,是apache自带的一款压力测试工具.它通过创建多个线程来模拟并发,测试目标是基于URL的,因此不论是什么web服务器都可以支持. 使用ab非常简单,进入apach ...

  7. Java设计模式3:工厂方法模式

    工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...

  8. 团队项目——站立会议DAY7

    第七次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:对功能模块代码进行近一步的审查和辅助,并对出错处进行修改和完善. 2.钟灵毓秀:对代码近一步的修改,将各个 ...

  9. c++实现冒泡排序

    # include<iostream> #include<stdio.h> using namespace std; void maopao(int *list){ int i ...

  10. [转]quick-cocos2d-x 多分辨率适配详解

    http://cn.quick-x.com/?p=1436 多种分辨率的适配一直都是一个蛋疼的问题,各家公司可能都有自己的一套方案.今天我为大家介绍的是我们在多款游戏里实践后的解决方案,相对来说成本和 ...