ES之五:ElasticSearch聚合
前言
说完了ES的索引与检索,接着再介绍一个ES高级功能API – 聚合(Aggregations),聚合功能为ES注入了统计分析的血统,使用户在面对大数据提取统计指标时变得游刃有余。同样的工作,你在Hadoop中可能需要写mapreduce或Hive,在mongo中你必须得用大段的mapreduce脚本,而在ES中仅仅调用一个API就能实现了。
开始之前,提醒老司机们注意,ES原有的聚合功能Facets在新版本中将被正式被移除,抓紧时间用Aggregations替换Facets吧。Facets真的很慢!
1 关于Aggregations
Aggregations的部分特性类似于sql语言中的group by,avg,sum等函数。但Aggregations API还提供了更加复杂的统计分析接口。
掌握Aggregations需要理解两个概念:
- 桶(Buckets):符合条件的文档的集合,相当于sql中的group by。比如,在users表中,按“地区”聚合,一个人将被分到北京桶或上海桶或其他桶里;按“性别”聚合,一个人将被分到男桶或女桶
对照一条sql来加深我们的理解:
SELECT COUNT(color) FROM table GROUP BY color
GROUP BY相当于做分桶的工作,COUNT是统计指标。
下面介绍一些常用的Aggregations API。
2 Metrics
2.1 AVG
2.2 Cardinality
2.3 Stats
2.4 Extended Stats
2.5 Percentiles
2.6 Percentile Ranks
3 Bucket
3.1 Filter
3.2 Range
3.3 Missing
3.4 Terms
3.5 Date Range
3.6 Global Aggregation
3.7 Histogram
3.8 Date Histogram
3.9 IPv4 range
3.10 Return only aggregation results
4 聚合缓存
ES中经常使用到的聚合结果集可以被缓存起来,以便更快速的系统响应。这些缓存的结果集和你掠过缓存直接查询的结果是一样的。因为,第一次聚合的条件与结果缓存起来后,ES会判断你后续使用的聚合条件,如果聚合条件不变,并且检索的数据块未增更新,ES会自动返回缓存的结果。
注意聚合结果的缓存只针对size=0的请求(参考3.10章节),还有在聚合请求中使用了动态参数的比如Date Range中的now(参考3.5章节),ES同样不会缓存结果,因为聚合条件是动态的,即使缓存了结果也没用了。
先加入几条index数据,如下:
curl -XPUT 'localhost:9200/testindex/orders/2?pretty' -d { "zone_id": "1","user_id": "100008","try_deliver_times": 102,"trade_status": "TRADE_FINISHED","trade_no": "xiaomi.21142736250938334726","trade_currency": "CNY","total_fee": 100,"status": "paid","sdk_user_id": "69272363","sdk": "xiaomi","price": 1,"platform": "android","paid_channel": "unknown","paid_at": 1427370289,"market": "unknown","location": "local","last_try_deliver_at": 1427856948,"is_guest": 0,"id": "fa6044d2fddb15681ea2637335f3ae6b7f8e76fef53bd805108a032cb3eb54cd","goods_name": "一小堆元宝","goods_id": "ID_001","goods_count": "1","expires_in": 2592000,"delivered_at": 0,"debug_mode": true,"created_at": 1427362509,"cp_result": "exception encountered","cp_order_id": "cp.order.id.test","client_id": "9c98152c6b42c7cb3f41b53f18a0d868","app_user_id": "fvu100006" }'
1、单值聚合
Sum求和,dsl参考如下:
[sfapp@cmos1 ekfile]$ curl http://10.202.11.117:9200/testindex/orders/_search?pretty > { > "size": 0,> "aggs": { > "return_expires_in": { > "sum": { > "field": "expires_in" > } > } > } > }' { "took" : 3, timed_out" : false,128); line-height:1.5!important">_shards" : { total" : 5, successful" : 5,128); line-height:1.5!important">Failed" : 0 },hits" : { total" : 2,128); line-height:1.5!important">max_score" : 0.0,128); line-height:1.5!important">hits" : [ ] },128); line-height:1.5!important">aggregations" : { return_expires_in" : { value" : 5184000.0 } } } [sfapp@cmos1 ekfile]$
返回expires_in之和,其中size=0 表示不需要返回参与查询的文档。
Min求最小值
Max求最大值
AVG求平均值