ES聚合查询详解(二):桶聚合

简介: ES聚合查询详解(二):桶聚合

前言


前面介绍了ES的简单使用,并说明了ES聚合查询主要分为3类:指标聚合、桶聚合和管道聚合。

本文主要是介绍其中桶聚合的相关使用。


一、桶聚合


Bucket 聚合不像Metric聚合那样计算字段上的指标,而是创建多个“存放“文档的桶。每个桶都与一个标准相关联(取决于聚合类型) ,该标准确定当前上下文中的文档是否“落入”它。换句话说,bucket 有效地定义了文档集。除了 bucket 本身之外,bucket 聚合还计算并返回“落入”每个 bucket 中的文档数量。


与Metric聚合不同的是,Bucket 聚合可以包含子聚合。这些子聚合将聚合它们的“父”bucket 聚合创建的 bucket。


不同的桶式聚合器有不同的“分桶”策略。有些定义单个桶,有些定义固定数量的多个桶,还有一些在聚合过程中动态创建桶。


二、使用场景


桶聚合查询主要用来做分组统计。

其中每个桶代表一个分组。


三、桶聚合的分类


官方文档:桶聚合

11.png


四、典型使用


1、单值聚合统计 terms

一个基于多桶值源的聚合,其中桶是动态构建的——每个唯一值一个桶。主要使用做分组个数统计,

类似mysql中的 select type , count(type) from table group by type;


示例:统计每个类型的记录数,基于genre的唯一值个数创建多个桶,并统计每个桶的记录数。


GET /_search
{
  "aggs": {
    "genres": {
      "terms": { "field": "genre" }
    }
  }
}


执行结果:

{
  ...
  "aggregations": {
    "genres": {
      "doc_count_error_upper_bound": 0,   
      "sum_other_doc_count": 0,           
      "buckets": [                        
        {
          "key": "electronic",
          "doc_count": 6
        },
        {
          "key": "rock",
          "doc_count": 3
        },
        {
          "key": "jazz",
          "doc_count": 2
        }
      ]
    }
  }
}


如果想基于分组的个数排序,可以使用如下语句:

GET /_search
{
  "aggs": {
    "genres": {
      "terms": {
        "field": "genre",
        "order": { "_count": "asc" }
      }
    }
  }
}


如果希望基于分组的key值排序,可以使用如下语句:


GET /_search
{
  "aggs": {
    "genres": {
      "terms": {
        "field": "genre",
        "order": { "_key": "asc" }
      }
    }
  }
}


使用 min_doc_count 选项可以只返回匹配超过配置的命中数的结果:


GET /_search
{
  "aggs": {
    "tags": {
      "terms": {
        "field": "tags",
        "min_doc_count": 10
      }
    }
  }
}


2、时间范围分组date_range

统计10个月前和近10个月的记录数。

POST /sales/_search?size=0
{
  "aggs": {
    "range": {
      "date_range": {
        "field": "date",
        "format": "MM-yyyy",
        "ranges": [
          { "to": "now-10M/M" },  
          { "from": "now-10M/M" } 
        ]
      }
    }
  }
}


3、多值分组Multi Terms

根据多个字段进行分组统计,类比sql:select genre ,product, count(*) from products group by genre,product;

GET /products/_search
{
  "aggs": {
    "genres_and_products": {
      "multi_terms": {
        "terms": [{
          "field": "genre" 
        }, {
          "field": "product"
        }]
      }
    }
  }
}


4、自定义分组查询 Range Aggregation

Range Aggregation基于多桶值源的聚合,使用户能够定义一组范围——每个范围代表一个桶。在聚合过程中,将根据每个 bucket 范围检查从每个文档中提取的值,并对相关/匹配文档进行“ bucket”检查。

请注意,这个聚合包括 from 值,并为每个范围排除 to 值。


示例:根据自定义的价格范围统计买卖订单数。

GET sales/_search
{
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 100.0 },
          { "from": 100.0, "to": 200.0 },
          { "from": 200.0 }
        ]
      }
    }
  }
}


5、日期分组聚合 Date Histogram

按月分组聚合:

POST /sales/_search?size=0
{
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      }
    }
  }
}


按2天的日历单元聚合:


POST /sales/_search?size=0
{
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "2d"
      }
    }
  }
}


6、自动日期分组聚合 Auto Date Histogram

自动根据日期分组聚合,还提供了一个目标桶数,表示所需桶数,并自动选择桶的间隔,以最好地实现该目标。返回的桶数总是小于或等于这个目标数。Bucket 字段是可选的,如果没有指定,则默认为10个 bucket。

示例:要求10桶的目标。


POST /sales/_search?size=0
{
  "aggs": {
    "sales_over_time": {
      "auto_date_histogram": {
        "field": "date",
        "buckets": 10
      }
    }
  }
}

7、聚合中使用过滤器filter

POST /sales/_search?size=0&filter_path=aggregations
{
  "aggs": {
    "avg_price": { "avg": { "field": "price" } },
    "t_shirts": {
      "filter": { "term": { "type": "t-shirt" } },
      "aggs": {
        "avg_price": { "avg": { "field": "price" } }
      }
    }
  }
}

8、稀有值查询 Rare terms

示例:查询桶中最多包含2条记录的类型genre。

GET /_search
{
  "aggs": {
    "genres": {
      "rare_terms": {
        "field": "genre",
        "max_doc_count": 2
      }
    }
  }
}


9、嵌套聚合 Nested Aggregation

创建嵌套索引

PUT /products
{
  "mappings": {
    "properties": {
      "resellers": { 
        "type": "nested",
        "properties": {
          "reseller": {
            "type": "keyword"
          },
          "price": {
            "type": "double"
          }
        }
      }
    }
  }
}

添加数据:

PUT /products/_doc/0?refresh
{
  "name": "LED TV", 
  "resellers": [
    {
      "reseller": "companyA",
      "price": 350
    },
    {
      "reseller": "companyB",
      "price": 500
    }
  ]
}


根据嵌套聚合查询:

GET /products/_search?size=0
{
  "query": {
    "match": {
      "name": "led tv"
    }
  },
  "aggs": {
    "resellers": {
      "nested": {
        "path": "resellers"
      },
      "aggs": {
        "min_price": {
          "min": {
            "field": "resellers.price"
          }
        }
      }
    }
  }
}


执行结果:

{
  ...
  "aggregations": {
    "resellers": {
      "doc_count": 2,
      "min_price": {
        "value": 350.0
      }
    }
  }
}


10、缺少聚合 Missing aggregation

Missing聚合属于单桶聚合,对空值数据统计。


示例:统计没有价格的产品总数。

POST /sales/_search?size=0
{
  "aggs": {
    "products_without_a_price": {
      "missing": { "field": "price" }
    }
  }
}


11、全局聚合 Global aggregators

定义搜索执行上下文中所有文档的单个存储桶。此上下文由您正在搜索的索引和文档类型定义,但不受搜索查询本身的影响。


示例:

聚合查询all_products中的平均价格统计不受外层query中的查询添加的影响。

POST /sales/_search?size=0
{
  "query": {
    "match": { "type": "t-shirt" }
  },
  "aggs": {
    "all_products": {
      "global": {}, 
      "aggs": {     
      "avg_price": { "avg": { "field": "price" } }
      }
    },
    "t_shirts": { "avg": { "field": "price" } }
  }
}


总结


本文主要是对ES中典型的桶聚合查询进行了介绍,特别要注意以下几个分组统计。

1、单值分组统计 Terms aggregation

2、多值分组统计 Multi Terms

3、自定义分组统计 Range Aggregation

4、时间范围分组 date_range

目录
相关文章
|
SQL 存储 关系型数据库
HarmonyOS学习路之开发篇—数据管理(关系型数据库)
关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。HarmonyOS关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。HarmonyOS提供的关系型数据库功能更加完善,查询效率更加高效。
|
10月前
|
人工智能 JSON 搜索推荐
《镜界构图师:Rokid AI眼镜赋能实时摄影构图AR指导系统》
基于Rokid CXR-M SDK,本文设计了一套AR实时摄影构图指导系统,融合AI分析与经典构图法则,通过智能眼镜叠加三分法、黄金分割等辅助线,提供场景自适应的可视化指导。系统实现相机控制、AR渲染与智能建议闭环,助力用户提升构图水平,推动摄影教育智能化升级。(239字)
|
数据采集 搜索推荐 数据可视化
基于python大数据的商品数据可视化及推荐系统
本系统基于Python、Django与ECharts,构建大数据商品可视化及推荐平台。通过爬虫获取商品数据,利用可视化技术呈现销售趋势与用户行为,结合机器学习实现个性化推荐,助力电商精准营销与用户体验提升。
|
Cloud Native 算法 中间件
如何使用服务网格实现全方位的流量调度场景
阿里云服务网格(ASM)通过流量调度套件扩展了Istio的限流、熔断能力,实现分用户限流、请求排队等复杂流量管理功能,提升分布式系统高可用性与可观测性。
|
缓存 NoSQL Linux
Redis(一)Centos7.6安装Redis服务
Centos的yum源中没有redis;这里我们需要安装一个第三方的yum源,这里用了Fedora的epel仓库。
3493 0
Redis(一)Centos7.6安装Redis服务
|
存储 监控 测试技术
Kibana 的 Alert—Elastic Stack 实战手册
Kibana 的 Alert 模块主要用于 Elastic Stack 的监控告警。以一种相对较低的使用成本,将复杂的查询条件,编辑完成后监控不同的 Elastic Stack 的技术产品中产生的数据,最终把符合条件的告警信息以需要的方式反馈给用户。
5942 0
Kibana 的 Alert—Elastic Stack 实战手册
|
机器学习/深度学习 消息中间件 数据安全/隐私保护
|
大数据 Python
Python 高级编程:深入探索高级代码实践
本文深入探讨了Python的四大高级特性:装饰器、生成器、上下文管理器及并发与并行编程。通过装饰器,我们能够在不改动原函数的基础上增添功能;生成器允许按需生成值,优化处理大数据;上下文管理器确保资源被妥善管理和释放;多线程等技术则助力高效完成并发任务。本文通过具体代码实例详细解析这些特性的应用方法,帮助读者提升Python编程水平。
820 5
|
Java API 数据库
Squirrel(松鼠)状态机的介绍及使用
Squirrel(松鼠)状态机的介绍及使用
4495 1
Squirrel(松鼠)状态机的介绍及使用