聚合的范围是search query过滤出的数据

四种聚合类型:

一、Bucketing

桶聚合,常规的分类然后计算每个分类的文档数量

二、Metric

分类并对一组文档进行sum、avg等数学运算

三、Matrix

可在多个字段上计算,生成矩阵结果

四、Pipeline

对聚合的结果再次聚合

Pipeline aggregations 会在所有的聚类执行完毕之后才执行

聚合语句的结构

"aggs" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"meta" : { [<meta_data_body>] } ]?
[,"aggregations" : { [<sub_aggregation>]+ } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}

Terms Aggregation

会根据字段的值动态构建buckets

{
"aggs" : {
"genres" : {
"terms" : { "field" : "genre" }
}
}
}

返回:

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

当字段的值很多的时候,elasticsearch只会返回部分buckets,sum_other_doc_count表示没有被返回的 buckets 中 document 的数量之和

size

默认情况下,elasticsearch只会返回按照doc_count降序排序的前10个terms,可以配置size参数来修改这一默认行为

terms聚合的结果是不精确的

https://mp.weixin.qq.com/s/V4cGqvkQ7-DgeSvPSketgQ

比如设置size = 3,表示希望返回TOP3的结果

每个索引分片会取自己分片上TOP3返回协调节点,协调节点汇总后再取汇总结果的TOP3

因此,这个结果是跟全量取TOP3不一样的,所以说terms聚合的结果是不精确的

size 和 shard_size 有什么区别?

  • size:是聚合结果的返回值,客户期望返回聚合排名前三,size值就是 3。
  • shard_size: 每个分片上聚合的数据条数。shard_size 原则上要大于等于 size(若设置小于size,实则没有意义,elasticsearch 会默认置为size)

请求的size值越高,结果将越准确,但计算最终结果的成本也将越高。

推荐设置 shard_size 为比较大的值,官方推荐:size*1.5+10

Order

buckets的排序可以由order参数定义

按doc数量升序排序:

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

按terms的字符升序排序:

{
"aggs" : {
"genres" : {
"terms" : {
"field" : "genre",
"order" : { "_term" : "asc" }
}
}
}
}

按子聚类的结果排序:

{
"aggs" : {
"genres" : {
"terms" : {
"field" : "genre",
"order" : { "max_play_count" : "desc" }
},
"aggs" : {
"max_play_count" : { "max" : { "field" : "play_count" } }
}
}
}
}

min_doc_count

默认值为1,表示只返回doc_count大于等于1的buckets

{
"aggs" : {
"tags" : {
"terms" : {
"field" : "tags",
"min_doc_count": 10
}
}
}
}

Nested Aggregation

针对nested字段的聚合,比如

{
... "product" : {
"properties" : {
"resellers" : {
"type" : "nested",
"properties" : {
"name" : { "type" : "text" },
"price" : { "type" : "double" }
}
}
}
}
}

求价格最低的产品的聚合语句可以写成:

{
"query" : {
"match" : { "name" : "led tv" }
},
"aggs" : {
"resellers" : {
"nested" : {
"path" : "resellers"
},
"aggs" : {
"min_price" : { "min" : { "field" : "resellers.price" } }
}
}
}
}

需要在顶层聚类的path字段填入nested的字段名称,然后,在子聚类中再针对子字段聚类

Date Histogram Aggregation 日期直方图

比如,想要统计每天的商品销量

GET /goods/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"date_list": {
"gte": "2020-8-1",
"lt": "2020-8-2"
}
}
}
]
}
},
"size": 0,
"aggs": {
"date_count": {
"date_histogram": {
"field": "date_list",
"format": "yyyy-MM-dd",
"interval": "day"
}
}
}
}

根据过滤的结果数据,以天为间隔聚类绘制直方图

{
"took": 82,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 34841,
"max_score": 0,
"hits": []
},
"aggregations": {
"date_count": {
"buckets": [
{
"key_as_string": "2020-06-02",
"key": 1591056000000,
"doc_count": 17
},
{
"key_as_string": "2020-06-03",
"key": 1591142400000,
"doc_count": 387
},
...

会出现6月的聚类结果是因为date_list是一组数据,可能某个document的这个字段即包含8月2日又包含6月2日,那么它将即被放到8-2的桶也被放到6-2的桶

时间间隔

时间间隔单位的可选项:year, quarter, month, week, day, hour, minute, second

精确指定时间间隔:1.5h也可以写成90m

时间格式

在es内部,日期被表示为一个64位的时间戳(milliseconds-since-the-epoch),这正是bucket key字段的值。key_as_string字段的格式可以由format参数决定

如果不指定format,则es会选此字段mapping的第一个日期格式

offset

当使用day作为时间间隔的时候,每个桶的范围是0点至0点,设置offset+6h表示将桶的范围改为6am to 6am

GET my_index/_search?size=0
{
"aggs": {
"by_day": {
"date_histogram": {
"field": "date",
"interval": "day",
"offset": "+6h"
}
}
}
}

Keyed Response

keyed标签置为true表示bucket将以hashmap格式返回,key_as_string作为key

POST /sales/_search?size=0
{
"aggs" : {
"sales_over_time" : {
"date_histogram" : {
"field" : "date",
"interval" : "1M",
"format" : "yyyy-MM-dd",
"keyed": true
}
}
}
}

Response:

{
...
"aggregations": {
"sales_over_time": {
"buckets": {
"2015-01-01": {
"key_as_string": "2015-01-01",
"key": 1420070400000,
"doc_count": 3
},
"2015-02-01": {
"key_as_string": "2015-02-01",
"key": 1422748800000,
"doc_count": 2
},
"2015-03-01": {
"key_as_string": "2015-03-01",
"key": 1425168000000,
"doc_count": 2
}
}
}
}
}

Missing value

如果不定义missingdate字段缺失的文档将被忽略。这样定义后,这些文档会被归入2000/01/01

POST /sales/_search?size=0
{
"aggs" : {
"sale_date" : {
"date_histogram" : {
"field" : "date",
"interval": "year",
"missing": "2000/01/01"
}
}
}
}

根据聚合的结果进行过滤

https://elasticsearch.cn/article/13501

每个IP登录次数超过5次的IP

{
"aggs": {
"IP": {
"terms": {
"field": "IP",
"size": 3000,
"order": {
"_count": "desc"
},
"min_doc_count": 5
}
}
},
"size": 0
}

会筛选出大于或等于5的buckets

每个IP登录人数超过2的IP

{
"aggs": {
"IP": {
"terms": {
"field": "IP",
"size": 3000,
"order": {
"distinct": "desc"
},
"min_doc_count": 5
},
"aggs": {
"distinct": {
"cardinality": {
"field": "IP.keyword"
}
},
"dd":{
"bucket_selector": {
"buckets_path": {"userCount":"distinct"},
"script": "params.userCount > 2"
}
}
}
}
},
"size": 0
}

bucket_selector必须出现在子聚合中,并且只能针对子聚合的数字结果过滤,script必须返回一个bool

Post Filter

post filter允许用户在执行聚合函数之后再对hits做过滤,比如:

GET /shirts/_search
{
"query": {
"bool": {
"filter": {
"term": { "brand": "gucci" }
}
}
},
"aggs": {
"colors": {
"terms": { "field": "color" }
},
"color_red": {
"filter": {
"term": { "color": "red" }
},
"aggs": {
"models": {
"terms": { "field": "model" }
}
}
}
},
"post_filter": {
"term": { "color": "red" }
}
}

由于aggs的范围取决于query,因此不能在一开始就过滤出颜色为红色的

Elasticsearch聚合语句的更多相关文章

  1. ElasticSearch聚合分析

    聚合用于分析查询结果集的统计指标,我们以观看日志分析为例,介绍各种常用的ElasticSearch聚合操作. 目录: 查询用户观看视频数和观看时长 聚合分页器 查询视频uv 单个视频uv 批量查询视频 ...

  2. ElasticSearch聚合(转)

    ES之五:ElasticSearch聚合 前言 说完了ES的索引与检索,接着再介绍一个ES高级功能API – 聚合(Aggregations),聚合功能为ES注入了统计分析的血统,使用户在面对大数据提 ...

  3. Elasticsearch聚合问题

    在测试Elasticsearch聚合的时候报了一个错误.具体如下: GET /megacorp/employee/_search { "aggs": { "all_int ...

  4. elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg

    分析 Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计.它很像SQL中的GROUP BY但是功能更强大. 举个例子,让我们找到所有职员中最大 ...

  5. ElasticSearch 聚合函数

    一.简单聚合 桶 :简单来说就是满足特定条件的文档的集合. 指标:大多数 指标 是简单的数学运算(例如最小值.平均值.最大值,还有汇总),这些是通过文档的值来计算. 桶能让我们划分文档到有意义的集合, ...

  6. elasticsearch聚合--桶(Buckets)和指标(Metrics)的概念

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 聚合的两个核 ...

  7. Elasticsearch聚合初探——metric篇

    Elasticsearch是一款提供检索以及相关度排序的开源框架,同时,也支持对存储的文档进行复杂的统计--聚合. 前言 ES中的聚合被分为两大类:Metric度量和bucket桶(原谅我英语差,找不 ...

  8. Elasticsearch聚合 之 Histogram 直方图聚合

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

  9. Elasticsearch聚合 之 Date Histogram聚合

    Elasticsearch的聚合主要分成两大类:metric和bucket,2.0中新增了pipeline还没有研究.本篇还是来介绍Bucket聚合中的常用聚合--date histogram.参考: ...

随机推荐

  1. sqlserver安装出现找不到数据库引擎错误

    sqlserver安装出现找不到数据库引擎错误 问题的解决 第一次安装SQL server,发现它较于Oracle,都有安装卸载十分麻烦的特点.刚开始安装,就让我频繁遇到这个“找不到数据库引擎”的错误 ...

  2. 手把手教你基于C#开发WinCC语音报警插件「附源代码」

    写在前面 众所周知,WinCC本身是可以利用C脚本或者VBS脚本来做语音报警,但是这种方式的本质是调用已存在的音频文件,想要实现实时播报报警信息是不行的,灵活性还不够,本文主要介绍基于C#/.NET开 ...

  3. 基于.Net Core的Redis:基本数据类型及其应用场景与命令行操作

    参考自:https://blog.csdn.net/only_yu_yy/article/details/78873735 https://blog.csdn.net/fenghuoliuxing99 ...

  4. 今天上午完成了devicescan,发送了rar包到yzx3233@sina.com

    今天上午完成了devicescan,发送了rar包到yzx3233@sina.com 可以正常扫描和输入了. 还有一个最后的问题,就是选择退出后,程序还在后台

  5. matplotlib图表介绍

    Matplotlib 是一个python 的绘图库,主要用于生成2D图表. 常用到的是matplotlib中的pyplot,导入方式import matplotlib.pyplot as plt 一. ...

  6. Android性能优化----卡顿优化

    前言 无论是启动,内存,布局等等这些优化,最终的目的就是为了应用不卡顿.应用的体验性好坏,最直观的表现就是应用的流畅程度,用户不知道什么启动优化,内存不足,等等,应用卡顿,那么这个应用就不行,被卸载的 ...

  7. JPA第三天

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springdata"获取视频和教程资料! b站在线视 ...

  8. 《JavaScript语言入门教程》记录整理:入门和数据类型

    目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...

  9. PHP preg_replace() 函数

    preg_replace 函数执行一个正则表达式的搜索和替换.高佣联盟 www.cgewang.com 语法 mixed preg_replace ( mixed $pattern , mixed $ ...

  10. PHP zip_entry_name() 函数

    定义和用法 zip_entry_name() 函数返回 zip 档案的名称.高佣联盟 www.cgewang.com 语法 zip_entry_name(zip_entry) 参数 描述 zip_en ...