Elasticsearch是一款提供檢索以及相關度排序的開源框架,同時,也支持對存儲的文檔進行復雜的統計——聚合。
前言
ES中的聚合被分為兩大類:Metric度量和bucket桶(原諒我英語差,找不到合適的詞語.....就用單詞來說吧!)。說的通俗點,metric很像SQL中的avg、max、min
等方法,而bucket就有點類似group by
了。
本篇就簡單的介紹一下metric聚合的用法。
metric的聚合按照值的返回類型可以分為兩種:單值聚合 和 多值聚合。
單值聚合
Sum 求和
這個聚合返回的是單個值,dsl可以參考如下:
"aggs" : {
"intraday_return" : { "sum" : { "field" : "change" } }
}
返回的是change字段的和:
{
...
"aggregations": {
"intraday_return": {
"value": 2.18
}
}
}
其中intraday_return是聚合的名字,同時也會作為請求返回的id值。另外,聚合中是支持腳本的,這里就不過多贅述了,詳細參考官方文檔即可。
Min 求最小值
{
"aggs" : {
"min_price" : { "min" : { "field" : "price" } }
}
}
Max 求最大值
{
"aggs" : {
"max_price" : { "max" : { "field" : "price" } }
}
}
avg 求平均值
{
"aggs" : {
"avg_grade" : { "avg" : { "field" : "grade" } }
}
}
cardinality 求唯一值,即不重復的字段有多少
{
"aggs" : {
"author_count" : {
"cardinality" : {
"field" : "author"
}
}
}
}
多值聚合
percentiles 求百分比
{
"aggs" : {
"load_time_outlier" : {
"percentile_ranks" : {
"field" : "load_time",
"values" : [15, 30]
}
}
}
}
返回的結果包含多個值:
{
...
"aggregations": {
"load_time_outlier": {
"values" : {
"15": 92,
"30": 100
}
}
}
}
stats 統計
{
"aggs" : {
"grades_stats" : { "stats" : { "field" : "grade" } }
}
}
請求后會直接顯示多種聚合結果:
{
...
"aggregations": {
"grades_stats": {
"count": 6,
"min": 60,
"max": 98,
"avg": 78.5,
"sum": 471
}
}
}
extend stats 擴展統計
{
"aggs" : {
"grades_stats" : { "extended_stats" : { "field" : "grade" } }
}
}
在統計的基礎上還增加了多種復雜的統計信息:
{
...
"aggregations": {
"grade_stats": {
"count": 9,
"min": 72,
"max": 99,
"avg": 86,
"sum": 774,
"sum_of_squares": 67028,
"variance": 51.55555555555556,
"std_deviation": 7.180219742846005,
"std_deviation_bounds": {
"upper": 100.36043948569201,
"lower": 71.63956051430799
}
}
}
}
總結
上面並沒有列舉全面,比如2.0版本的ES,還支持多值的percentile Rank百分比排名,Geo Bounds地理位置信息,Scripted Metric腳本;單值的top hits等等。
- 在性能上,ES也做了很多的優化:比如max和min,如果對於排序的字段,那么就直接跳過了計算的步驟,直接取出目標值即可。
- 當然有些聚合也是需要特定的場合的,比如cardinality計算唯一值是通過哈希的方式,如果字段數據規模很大,那么會消耗很多的性能。
- 另外桶之間是可以嵌套的,比如在range聚合下嵌套了一個max聚合,那么會在range得到的每個結果組上,再次進行max的統計。
- 在聚合中支持腳本的使用,可以增加統計的靈活度。
很多內容還需要在實踐中使用,才能了解它的優勢。