原文链接: http://blog.csdn.net/dm_vincent/article/details/42407823
本章翻译自Elasticsearch官方指南的Aggregation Test-Drive一章。
聚合的测试数据(Aggregation Test-Drive)
我们将学习各种聚合以及它们的语法,但是最好的学习方法还是通过例子。一旦你了解了如何思考聚合以及如何对它们进行合适的嵌套,那么语法本身是不难的。
让我们从一个例子开始。我们会建立一个也许对汽车交易商有所用处的聚合。数据是关于汽车交易的:汽车型号,制造商,销售价格,销售时间以及一些其他的相关数据。
首先,通过批量索引(Bulk-Index)来添加一些数据:
POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" :
"2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19"}
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
现在我们有了一些数据,来创建一个聚合吧。一个汽车交易商也许希望知道哪种颜色的车卖的最好。这可以通过一个简单的聚合完成。使用terms桶:
GET /cars/transactions/_search?search_type=count
{
"aggs" : {
"colors" : {
"terms" : {
"field" : "color"
}
}
}
}
因为我们并不关心搜索结果,使用的search_type是count,它的速度更快。 聚合工作在顶层的aggs参数下(当然你也可以使用更长的aggregations)。 然后给这个聚合起了一个名字:colors。 最后,我们定义了一个terms类型的桶,它针对color字段。
聚合是以搜索结果为上下文而执行的,这意味着它是搜索请求(比如,使用/_search端点)中的另一个顶层参数(Top-level Parameter)。聚合可以和查询同时使用,这一点我们在后续的范围聚合(Scoping Aggregations)中介绍。
接下来我们为聚合起一个名字。命名规则是有你决定的; 聚合的响应会被该名字标记,因此在应用中你就能够根据名字来得到聚合结果,并对它们进行操作了。
然后,我们开始定义聚合本身。比如,我们定义了一个terms类型的桶。terms桶会动态地为每一个它遇到的不重复的词条创建一个新的桶。因为我们针对的是color字段,那么terms桶会动态地为每种颜色创建一个新桶。
让我们执行该聚合来看看其结果:
{
...
"hits": {
"hits": []
},
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4
},
{
"key": "blue",
"doc_count": 2
},
{
"key": "green",
"doc_count": 2
}
]
}
}
}
因为我们使用的search_type为count,所以没有搜索结果被返回。 每个桶中的key对应的是在color字段中找到的不重复的词条。它同时也包含了一个doc_count,用来表示包含了该词条的文档数量。
响应包含了一个桶列表,每个桶都对应着一个不重复的颜色(比如,红色或者绿色)。每个桶也包含了“掉入”该桶中的文档数量。比如,有4辆红色的车。
前面的例子是完全实时(Real-Time)的:如果文档是可搜索的,那么它们就能够被聚合。这意味着你能够将拿到的聚合结果置入到一个图形库中来生成实时的仪表板(Dashboard)。一旦你卖出了一台银色汽车,在图形上关于银色汽车的统计数据就会被动态地更新。
瞧!你的第一个聚合!
添加一个指标(Metric)
从前面的例子中,我们可以知道每个桶中的文档数量。但是,通常我们的应用会需要基于那些文档的更加复杂的指标(Metric)。比如,每个桶中的汽车的平均价格是多少?
为了得到该信息,我们得告诉ES需要为哪些字段计算哪些指标。这需要将指标嵌套到桶中。指标会基于桶中的文档的值来计算相应的统计信息。
让我们添加一个计算平均值的指标:
GET /cars/transactions/_search?search_type=count
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
我们添加了一个新的aggs层级来包含该指标。然后给该指标起了一个名字:avg_price。最后定义了该指标作用的字段为price。.
正如你所看到的,我们向前面的例子中添加了一个新的aggs层级。这个新的聚合层级能够让我们将avg指标嵌套在terms桶中。这意味着我们能为每种颜色都计算一个平均值。
同样的,我们需要给指标起一个名(avg_price)来让我们能够在将来得到其值。最后,我们指定了指标本身(avg)以及该指标作用的字段(price):
{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"avg_price": {
"value": 32500
}
},
{
"key": "blue",
"doc_count": 2,
"avg_price": {
"value": 20000
}
},
{
"key": "green",
"doc_count": 2,
"avg_price": {
"value": 21000
}
}
]
}
}
...
}
现在,在响应中多了一个avg_price元素。
尽管得到的响应只是稍稍有些变化,但是获得的数据增加的了许多。之前我们只知道有4辆红色汽车。现在我们知道了红色汽车的平均价格是32500刀。这些数据你可以直接插入到报表中。
桶中的桶(Buckets inside Buckets)
当你开始使用不同的嵌套模式时,聚合强大的能力才会显现出来。在前面的例子中,我们已经知道了如何将一个指标嵌套进一个桶的,它的功能已经十分强大了。
但是真正激动人心的分析功能来源于嵌套在其它桶中的桶。现在,让我们来看看如何找到每种颜色的汽车的制造商分布信息:
GET /cars/transactions/_search?search_type=count
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"make": {
"terms": {
"field": "make"
}
}
}
}
}
}
此时发生了一些有意思的事情。首先,你会注意到前面的avg_price指标完全没有变化。一个聚合的每个层级都能够拥有多个指标或者桶。avg_price指标告诉了我们每种汽车颜色的平均价格。为每种颜色创建的桶和指标是各自独立的。
这个性质对你的应用而言是很重要的,因为你经常需要收集一些互相关联却又完全不同的指标。聚合能够让你对数据遍历一次就得到所有需要的信息。
另外一件重要的事情是添加了新聚合make,它是一个terms类型的桶(嵌套在名为colors的terms桶中)。这意味着我们会根据数据集创建不重复的(color, make)组合。
让我们来看看得到的响应(有省略,因为响应太长了):
{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"make": {
"buckets": [
{
"key": "honda",
"doc_count": 3
},
{
"key": "bmw",
"doc_count": 1
}
]
},
"avg_price": {
"value": 32500
}
},
...
}
该响应告诉了我们如下信息:
- 有4辆红色汽车。
- 红色汽车的平均价格是32500美刀。
- 红色汽车中的3辆是Honda,1辆是BMW。
最后的一个修改(One Final Modification)
在继续讨论新的话题前,为了把问题讲清楚让我们对该例子进行最后一个修改。为每个制造商添加两个指标来计算最低和最高价格:
GET /cars/transactions/_search?search_type=count
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": { "avg": { "field": "price" }
},
"make" : {
"terms" : {
"field" : "make"
},
"aggs" : {
"min_price" : { "min": { "field": "price"} },
"max_price" : { "max": { "field": "price"} }
}
}
}
}
}
}
我们需要添加另一个aggs层级来进行对min和max的嵌套。
得到的响应如下(仍然有省略):
{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"make": {
"buckets": [
{
"key": "honda",
"doc_count": 3,
"min_price": {
"value": 10000
},
"max_price": {
"value": 20000
}
},
{
"key": "bmw",
"doc_count": 1,
"min_price": {
"value": 80000
},
"max_price": {
"value": 80000
}
}
]
},
"avg_price": {
"value": 32500
}
},
...
在每个make桶下,多了min和max的指标。
此时,我们可以得到如下信息:
- 有4辆红色汽车。
- 红色汽车的平均价格是32500美刀。
- 红色汽车中的3辆是Honda,1辆是BMW。
- 红色Honda汽车中,最便宜的价格为10000美刀。
- 最贵的红色Honda汽车为20000美刀。
相关推荐
主要功能是通过ElasticSearch实现实时计算、实时分析海量数据,聚合处理等。 项目搭建 Spring Boot + ElasticSearch集群 + RocketMQ集群 + Codis集群 RocketMQ:实现高并发、海量流量情况下的削峰,通过控制消费...
聚合测试 以桶和指标的形式提供用于聚合的用法和示例代码。 自动完成测试 提供了用于实现自动完成功能的分析方法和示例代码。 EsHashPartitionTest Elasticsearch 提供了用于文档分片分配的示例代码。 加入嵌套...
本项目主要是学习利用全文检索引擎框架ElasticSearch实现一个中文旅游网站搜索设计,通过建立一个hotel的索引库关联对应的mysql表数据,实现高效率的查询,解决了传统关系型数据因为数据量大导致的查询瓶颈问题。...
Elasticsearch数据,InfluxDB数据,Mysql数据监控,你只需要写一条查询就可以轻松搞定监控 多种数值聚合类型监控(计数,最小,最大,平均,和,唯一计数,百分位数,标准偏差) 数值双向监控 HTTP数据监控,js评估...
构建在全文检索开源软件Lucene之上的Elastic Search,不仅能对海量数据规模的数据完成分布式索引于检索,还能提供对数据进行聚合分析,据国际权威的数据库产品测试机构DB Engines的统计,在2016年1月,Elastic ...
还支持对从不同目标和其他来源(通信网络、模拟信号、模拟环境)获得的数据进行聚合。 ES TDK 独立于目标上使用的操作系统,不需要目标端软件支持。 该项目的想法是在由 BMWi(德国联邦经济事务部)资助的 FZI ...
Flink 完成数据清洗和聚合后,再使用 Elasticsearch + Kibana 的的技术路线,完成了客流信息,地铁收入、乘客车费、乘车区 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,...
也可以自己搭建 Elasticsearch 并通过配置进行集成 后续会对搜索功能进行加强,实现条件过滤,结果高亮等,敬请期待。 计划中的特性 信任系统 通过历史数据对用户进行分级提权,让用户从浏览者逐步变为参与者...
它使您能够使用Elasticsearch的搜索/聚合功能和Kibana的可视化功能来分析任何数据集。 :information: 支持该堆栈的Docker映像包括默认情况下启用了 (请参阅以禁用它们)。 有效期为30天。 该许可到期后,您可以...
Elasticsearch实时高效聚合计算应用实践 腾讯Elasticsearch大规模实践 阿里云Elasticsearch架构解析与性能优化实践 Go在区块链的发展和演进 Aliyun ApasaDB Go 微服务架构 罗辑思维Go语言微服务改造实践 Golang打造...
该插件已使用Elastic Search 5.5作为数据源进行了测试。 趋势是在该系列的最后一个日期和上一个日期聚合之间计算的。 安装 将dist文件夹复制到您的grafana插件目录中,并将其重命名为trafficlight。 屏幕截图 展示...
本书涵盖了以下激动人心的功能:使用AngularJS,Bootstrap模板和jQuery构建UI了解Spring WebFlux框架以及它如何使用Reactor库与Elasticsearch交互以对数据进行索引,查询和聚合使用Spring Security和Spring ...
事件导入:将naxsi事件导入到elasticsearch数据库中 白名单生成:从模板而不是从纯粹的统计方面生成白名单 事件管理:允许将事件标记到数据库中以将其从wl gen进程中排除 报告:显示有关当前数据库内容的信息 该...
交易“算法”将实施状态作为DDD聚合实体通过基于Stream的计算保存在内存中KeyValueStore :跟踪由key标识的value随时间的演变这是CQRS/ES ,可用于复制/还原应用程序或会话状态通过重播事件流并丢弃效果,可以重新...
7.3 创建测试工具来测试菜单 7.4 使用其他菜单类型 7.4.1 展开的菜单 7.4.2 使用图标菜单 7.4.3 使用子菜单 7.4.4 配置系统菜单 7.4.5 使用上下文菜单 7.4.6 使用交替菜单 7.4.7 使用菜单...
7.3 创建测试工具来测试菜单 7.4 使用其他菜单类型 7.4.1 展开的菜单 7.4.2 使用图标菜单 7.4.3 使用子菜单 7.4.4 配置系统菜单 7.4.5 使用上下文菜单 7.4.6 使用交替菜单 7.4.7 使用菜单...
该库通过使用协议缓冲区消息来定义es / cqrs核心组件(如api请求/响应, grpc服务,事件,命令和状态) ,帮助轻松编写lagom微服务。 特征 通过将api请求和响应定义为protobuf消息,使用REST接口实现基于...
此数据最初是从小鼠(C57BL / 6株,E14或8周龄)的大脑,心脏,肾脏,肝脏,小肠,脾脏,睾丸,胸腺和胚胎干(ES)细胞系中产生的ENCODE项目。 其次,我使用了基于泊松的多元隐马尔可夫模型(ChromHMM)来识别富含...