聚合框架有助于提供基于搜索查询的聚合数据。它基于称为聚合的简单构建块,可以组合这些构建块来构建复杂的数据汇总。
让我们比较一下聚合和搜索的区别:
//搜索
Post//_ search {‘query’ 3360 {.查询类型.} }//聚合
Post//_ search {‘aggs’ : {.聚合类型.},’查询’ 3360 {.查询类型.},//可选部分’ size ‘ 3360 0 0//返回结果个数}aggs:此元素包含实际的聚合查询query:定义聚合的上下文。如果没有指定元素,将使用给定索引和类型的所有文档。如果我们不想考虑所有数据进行聚合,而只考虑一些满足一定条件的文档。该查询过滤要提供给实际aggs查询的文档。Size:指定响应中返回的命中数。默认值为10。通常,如果我们只对获得聚合结果感兴趣,我们应该将size元素设置为0。有许多不同类型的聚合,每种都有自己的目的和输出。为了更好地理解这些类型,通常更容易将它们分为四类:
存储桶聚合度量聚合矩阵聚合管道聚合1。时段聚集构建了一个聚集时段系列,其中每个时段都与一个关键字和一个文档标准相关联。执行聚合时,将为上下文中的每个文档计算所有时段条件。当一个条件匹配时,文档将被视为“落入”相关桶中。在聚集过程的最后,我们将得到一个桶列表3354。每个桶都有一组“属于”它的文档。
存储桶聚合可以出现在聚合查询的顶层或最外层。存储桶聚合也可以嵌套在其他存储桶聚合中。
2.指标聚合(Metric Aggregation)跟踪并计算一组文档中指标的聚合。例如,在我们之前导入的文档中,每条记录都包含产品的价格。测量聚合可以计算不同的聚合(总和、平均值、最小值、最大值等。).
度量值聚合可以放在聚合查询的顶层或最外层。度量聚合也可以嵌套在桶聚合中。度量聚合不能在其中嵌套其他类型的聚合。
3.矩阵聚合矩阵聚合是在ElasticSearch版中引入的。矩阵聚合处理多个字段,并计算查询上下文中所有文档的矩阵。与指标聚合和时段聚合不同,此聚合系列还不支持脚本。
矩阵聚合可以嵌套在存储桶聚合中,但是存储桶聚合不能嵌套在矩阵聚合中。这还是一个比较新的功能。
4.管道聚合管道聚合是一种高阶聚合,可以聚合其他聚合的输出。这些对于计算一些东西很有用,比如导数。
这是对Elasticsearch在高层次上支持的不同类型的聚合的概述。管道聚合和矩阵聚合相对较新,与度量聚合和桶聚合相比用例较少。
指标聚合在本节中,我们主要讨论以下指标聚合:
总和、平均值、最小值和最大值聚合统计信息和扩展统计信息聚合基本聚合1。Sum、average、minimum和maximum聚合(1)Sum聚合一种单值度量聚合,它对从聚合文档中提取的值进行汇总。这些值可以从文档中的特定数字字段中提取,也可以由提供的脚本生成。
//汇总特定文档中的价格
GET/Amazon/_ search size=0 { ‘ query ‘ : { ‘ constant _ score ‘ : { ‘ filter ‘ : { ‘ match ‘ : { ‘ manufacturer . raw ‘ : ‘ global software publishing ‘ } } },Aggs ‘ 3360 { 1 ‘ global _ prices ‘ 3360 { 2 ‘ sum ‘ 3360 { 3 ‘ field ‘ 3360 ‘ price ‘ 4 } } Aggs,也可以写成聚合聚合运算符字段聚合(2)平均聚合平均聚合查找特定文档的平均价格:
GET/Amazon/_ search { ‘ query ‘ : { ‘ constant _ score ‘ : { ‘ filter ‘ : { ‘ match ‘ : { ‘ manufacturer . raw ‘ : ‘ global software publishing ‘ } },’ aggs ‘ 3360 { ‘ global _ prices ‘ 3360 { ‘ avg ‘ 3360 { ‘ field ‘ 3360 ‘ price ‘ } },’ size ‘ 3360 }(3)min
Av更改为min(3)max,以聚合该字段的最小值来查找特定文档。
Avg更改为max。这些聚合非常简单。现在,让我们看看一些更高级的统计和扩展。
2.统计数据和统计数据扩展这些聚合在一个请求中计算一些公共统计数据,而无需发出多个请求。这也节省了Elasticsearch中的资源,因为统计数据是在一次传递中计算的,而不是多次请求。
(1)统计Stats聚集以计算一遍3360中文档的总数、平均值、最小值、最大值和计数。
get/Amazon/_ search { ‘ aggs ‘ : { ‘ global _ price ‘ 3360 { ‘ stats ‘ 3360 { ‘ field ‘ 3360 ‘ price ‘ } },’ size ‘ 3360 0 0 }//输出如下
{ ‘ took ‘ : 2,’ timed_out’ : false,’ _shards’ : { ‘total’ : 1,’ successful’ : 1,’ skipped ‘ : 0 0,’ failed ‘ : 0 0 },’ hits ‘ : { ‘ total ‘ : { ‘ value ‘ : 1363,’ relation’ : ‘eq’ },’ max_score’ :所有内容都包含在同一个响应中。这非常方便,因为它减少了多个请求的开销,并简化了客户端代码。
(2)扩展统计聚合除了stats聚合返回的统计,扩展统计聚合还返回更多的统计3360。
get/Amazon/_ search { ‘ aggs ‘ : { ‘ global _ price ‘ 3360 { ‘ extended _ stats ‘ 3360 { ‘ field ‘ 3360 ‘ price ‘ } },’ size ‘ 3360 0 0 }//返回
.aggregations ‘ : { ‘ global _ price ‘ : { ‘ count ‘ : 1363,’ min’ : 0.0,’ max’ : 101515.55,’ avg ‘ : 347.0741819515774,’ sum ‘ : 473062.11,’ sum _ of _ squares ‘ :
3.基数(Cardinality)聚合计算不同值的近似计数的单值度量聚合。查找特定字段的基数或唯一值的数量是一个非常常见的需求。如果你的网站有来自不同访问者的点击流,你可能想知道在给定的一天、一周或一个月有多少访问者。
//发现有多个制造商
get/Amazon/_ search size=0 { ‘ aggs ‘ : { ‘ manufacturer ‘ 3360 { ‘ cardinality ‘ 3360 { ‘ field ‘ 3360 ‘ manufacturer . raw ‘ } }//返回结果
{.}、’ aggregations ‘ : { ‘ manufacturer ‘ 3360 { ‘ value ‘ 3360 350 } }桶聚合桶聚合有助于分析整体与部分之间的关系,从而更好地理解数据。它们有助于将数据分成更小的部分。每种类型的聚合都将数据分成不同的段或桶。Bucket是任何分析过程中最常用的聚合类型。
1.对字符串数据进行分组有时候,我们可能需要根据具有字符串数据类型的字段(通常是Elasticsearch中具有关键字类型的字段)来提取或分割数据。
术语聚合术语聚合可能是应用最广泛的聚合。它有助于根据给定字段的不同值对数据进行分段或分组。
//查询销量最多的经销商。
get/Amazon/_ search size=0 { ‘ aggs ‘ : { ‘ by manufacturer ‘ 3360 { ‘ terms ‘ 3360 { ‘ field ‘ 3360 ‘ manufacturer . raw ‘ } },’ size’ 3360 0 0}指定size=0以防止返回原始搜索。在这个例子中,我们只想要聚合结果,而不是搜索结果。因为我们没有指定任何顶级查询元素,所以它匹配所有文档。
//响应如下
{ ‘ took ‘ : 5,’ timed_out’ : false,’ _shards’ : { ‘total’ : 1,’ successful’ : 1,’ skipped ‘ : 0 0,’ failed ‘ : 0 0 },’ hits ‘ : { ‘ total ‘ : { ‘ value ‘ : 1363,’ relation’ : ‘eq’ },’ max_score’ :因为指定了size: 0,所以hits.hit数组为空。
//只显示前三名经销商
get/Amazon/_ search { ‘ aggs ‘ : { ‘ by manu ‘ 3360 { ‘ terms ‘ 3360 { ‘ field ‘ 3360 ‘ manufacturer . raw ‘,’ size’ 3360 3}}},’ size ‘ 3360 0 0 }[在顶级,size参数用于防止任何搜索命中,而在术语聚合中使用的size参数指示要返回的术语桶的最大数量。
2.分析数值型数据的另一个常见情况是,当我们需要时,我们根据数值型字段将数据分段或切片到各个桶中。比如我们可能想把商品数据按照不同的价格区间进行切片,比如最高10元,10元到50元,50元到100元等等。
(1)直方图聚合直方图聚合可以将数据按照一个数值域划分成不同的块。每个切片的范围,也称为间隔,可以在查询的输入中指定。
post/Amazon/_ search size=0 { ‘ aggs ‘ : { ‘ by _ price ‘ 3360 { ‘ histogram ‘ 3360 { ‘ field ‘ 3360 ‘ price ‘,’ interval’ 3360 500}}},’ size’ 3360 0 0}}
{ ‘ took ‘ : 3,’ timed_out’ : false,’ _shards’ : { ‘total’ : 1,’ successful’ : 1,’ skipped ‘ : 0 0,’ failed ‘ : 0 0 },’ hits ‘ : { ‘ total ‘ : { ‘ value ‘ : 1363,’ relation’ : ‘eq’ },’ max_score’ :这就是直方图聚合如何使用查询中指定的间隔来创建具有相等范围的存储桶。默认情况下,它包含给定间隔的所有存储桶,不管该存储桶中是否有任何文档。只有那些至少包含一些文档桶可以被返回。这可以通过使用min_doc_count参数来实现。如果指定,直方图聚合仅返回至少具有指定文档数的存储桶。
(2)范围聚合如果我们不想让所有的桶都有相同的范围呢?使用范围聚合创建不同大小的存储桶。
从到的范围是可选的。如果仅指定了to,则存储桶包含存储桶中指定值之前的所有文档。To值是互斥的,并且不包括在当前桶3360的范围内
POST/Amazon/_ search size=0 { ‘ aggs ‘ : { ‘ by _ price ‘ : { ‘ range ‘ : { ‘ field ‘ : ‘ price ‘,’ ranges’: [ { ‘to’: 10 },{ ‘ from ‘ 3360 10,To’ 3360 60},{‘from’ 3360 60}},’ size ‘ 3360 0 }//响应为as
{ ‘ took ‘ : 6,’ timed_out’ : false,’ shards’ : { ‘total’ : 1,’ successful’ : 1,’ skipped ‘ : 0 0,’ failed ‘ : 0 0 },’ hits ‘ : { ‘ total ‘ : { ‘ value ‘ : 1363,’ relation’ : ‘eq’ },’ max _ score ‘ :可以为范围桶指定自定义标签
POST/Amazon/_ search size=0 { ‘ aggs ‘ : { ‘ by _ price ‘ : { ‘ range ‘ : { ‘ field ‘ : ‘ price ‘,’ ranges ‘ :[{ ‘ key ‘ : ‘ price 0-10 ‘,’ to’: 10 },{ ‘key’: ‘price 10-60 ‘,’ from’: 10,’ to’: 60生成的水桶将使用每个水桶设置键。这有助于在不遍历所有桶的情况下从响应中查找相关桶。
3.嵌套聚合当度量标准聚合嵌套在桶聚合内时,将在每个桶中计算度量标准聚合。
//查询价格为10-20的产品,然后统计这个区段的,各个生产商的产品总和。
GET/Amazon/_ search size=0 { ‘ query ‘ : { ‘ bool ‘ : { ‘ must ‘ :[{ ‘ range ‘ : { ‘ price ‘ : { ‘ GTE ‘ : 10,’ LTE ‘ : 200 } } } },’ aggs ‘ : { ‘ by _ manu ‘ : { ‘ terms ‘ : { ‘输出如下
.聚合: { ‘ by _ manu ‘ : { ‘ doc _ count _ error _ upper _ bound ‘ : 0,’ sum_other_doc_count’ : 525,’ buckets ‘ :[{ ‘key’ : ‘ encore software ‘,’ doc_count’ : 59,’ total _ price ‘ 3360 { ‘ value ‘ : 1986.13 } },{ ‘ key ‘ ://按照降序进行排序
GET/Amazon/_ search size=0 { ‘ query ‘ : { ‘ bool ‘ : { ‘ must ‘ :[{ ‘ range ‘ : { ‘ price ‘ : { ‘ GTE ‘ : 10,’ LTE ‘ : 200 } } } },’ aggs ‘ : { ‘ by _ manu ‘ : { ‘ terms ‘ : { ‘查找价格范围是10-200的产品,并找出每家生产商每个产品的价格的总和的前三个。
GET/Amazon/_ search size=0 { ‘ query ‘ : { ‘ bool ‘ : { ‘ must ‘ :[{ ‘ range ‘ : { ‘ price ‘ : { ‘ GTE ‘ : 10,’ LTE ‘ : 200 } } } },’ aggs ‘ : { ‘ by _ man ‘ : { ‘ terms ‘ : { ‘根据自定义条件进行调整有时,我们可能更想子句控制创建存储桶。以下聚合允许我们根据选择的查询/过滤器创建一个或多个存储桶。
(1)过滤器聚合过滤器聚合允许您使用任意筛选器创建单个水桶,并计算该水桶中的指标
POST/Amazon/_ search size=0 { ‘ aggs ‘ : { ‘ bucket _ encore ‘ : { ‘ filter ‘ : { ‘ term ‘ : { ‘制造商。raw ‘ : ‘ encore software ‘ } } } }//返回如下:
{ ‘ took ‘ : 1,’ timed_out’ : false,’ _shards’ : { ‘total’ : 1,’ successful’ : 1,’ skipped ‘ : 0 0,’ failed ‘ : 0 0 },’ hits ‘ : { ‘ total ‘ : { ‘ value ‘ : 1363,’ relation’ : ‘eq’ },’ max_score’ :
GET/Amazon/_ search size=0 { ‘ aggs ‘ : { ‘ bucket _ class ‘ : { ‘ filters ‘ : { ‘ encore ‘ : { ‘ match ‘ : { ‘ manufacturer . raw ‘ : ‘ encore of tware ‘ } },’ global ‘ : { ‘ match ‘ : { ‘ manufacturer . raw ‘ : ‘
.value’ : 1363,’ relation’ : ‘eq’ },’ max_score’ : null,’ hits’ : [ ] },’ aggregations ‘ : { ‘ bucket _ class ‘ : { ‘ bucket ‘ : { ‘ encore ‘ : { ‘ doc _ count ‘ : 76 },’ global ‘ : { ‘ doc _ count ‘ : 11 }收集日期/时间数据Elasticsearch有一个非常强大的日期直方图集合。使用日期直方图聚合,我们将看到如何在日期字段上创建存储桶。在这个过程中,我们将经历以下几个阶段:
(1)创建跨时间段的存储桶。//以天为单位切片数据。
get/file beat-7 . 2 . 0-2019 . 08 . 30-00001/_ search size=0 { ‘ aggs ‘ 3360 { ‘ counts _ over _ time ‘ 3360 { ‘ date _ histogram ‘ 3360 { ‘ field ‘ 3330。
.聚合’ : { ‘ counts _ over _ time ‘ : { ‘ buckets ‘ :[{ ‘ key _ as _ string ‘ : ‘ 2018-12-27t 00:00:00.000 z ‘,’ key’ : 1545868800000,’ doc _ count ‘ : 537 },{ ‘ key _ as _ string ‘ 33366
(2)使用不同的时区。如果我们想使用IST时区进行切片,我们可以指定time_zone参数。
GET/file beat-7 . 2 . 0-2019 . 08 . 30-000001/_ search size=0 { ‘ aggs ‘ : { ‘ counts _ over _ time ‘ : { ‘ date _ histogram ‘ : { ‘ field ‘ : ‘ @ timestamp ‘,’ fixed _ interval ‘ : ‘ 1d ‘,’ time _ zone’ 3360′ 08336000′}}}返回的结果是:
.聚合’ : { ‘ counts _ over _ time ‘ : { ‘ buckets ‘ :[{ ‘ key _ as _ string ‘ : ‘ 2018-12-27t 00:00:00.000 08:00 ‘,’ key ‘ : 1545840000000,’ doc_count’ : 521 },{ ‘ key _ key
管道聚合管道聚合,即允许您聚合另一个聚合的结果。它们允许您将一个聚合的结果作为输入导入到另一个聚合中。管道聚合是一个相对较新的功能,还没有专门研究过。
暂无讨论,说说你的看法吧