Elasticsearch聚合初探——metric篇

Elasticsearch是一款提供檢索以及相關度排序的開源框架,同時,也支持對存儲的文檔進行復雜的統計——聚合。框架

前言

ES中的聚合被分爲兩大類:Metric度量和bucket桶(原諒我英語差,找不到合適的詞語.....就用單詞來講吧!)。說的通俗點,metric很像SQL中的avg、max、min等方法,而bucket就有點相似group by了。性能

本篇就簡單的介紹一下metric聚合的用法。

metric的聚合按照值的返回類型能夠分爲兩種:單值聚合 和 多值聚合。優化

單值聚合

Sum 求和

這個聚合返回的是單個值,dsl能夠參考以下:code

"aggs" : {
        "intraday_return" : { "sum" : { "field" : "change" } }
    }

返回的是change字段的和:排序

{
    ...

    "aggregations": {
        "intraday_return": {
           "value": 2.18
        }
    }
}

其中intraday_return是聚合的名字,同時也會做爲請求返回的id值。另外,聚合中是支持腳本的,這裏就不過多贅述了,詳細參考官方文檔便可。ip

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" } }
    }
}

請求後會直接顯示多種聚合結果:it

{
    ...

    "aggregations": {
        "grades_stats": {
            "count": 6,
            "min": 60,
            "max": 98,
            "avg": 78.5,
            "sum": 471
        }
    }
}

extend stats 擴展統計

{
    "aggs" : {
        "grades_stats" : { "extended_stats" : { "field" : "grade" } }
    }
}

在統計的基礎上還增長了多種複雜的統計信息:io

{
    ...

    "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等等。ast

  • 在性能上,ES也作了不少的優化:好比max和min,若是對於排序的字段,那麼就直接跳過了計算的步驟,直接取出目標值便可。
  • 固然有些聚合也是須要特定的場合的,好比cardinality計算惟一值是經過哈希的方式,若是字段數據規模很大,那麼會消耗不少的性能。
  • 另外桶之間是能夠嵌套的,好比在range聚合下嵌套了一個max聚合,那麼會在range獲得的每一個結果組上,再次進行max的統計。
  • 在聚合中支持腳本的使用,能夠增長統計的靈活度。

不少內容還須要在實踐中使用,才能瞭解它的優點。

相關文章
相關標籤/搜索