1. 程式人生 > >elasticsearch聚合操作——本質就是針對搜索後的結果使用桶bucket(允許嵌套)進行group by,統計下分組結果,包括min/max/avg

elasticsearch聚合操作——本質就是針對搜索後的結果使用桶bucket(允許嵌套)進行group by,統計下分組結果,包括min/max/avg

per 找到 只需要 語句 所有 smi 即使 log 以及

分析

Elasticsearch有一個功能叫做聚合(aggregations),它允許你在數據上生成復雜的分析統計。它很像SQL中的GROUP BY但是功能更強大。

舉個例子,讓我們找到所有職員中最大的共同點(興趣愛好)是什麽:

GET .monitoring-es-6-2018.08.16/_search
{
"aggs": {
"all_interests": {
"terms": {
"field": "source_node.host"
}
}
}
}

暫時先忽略語法只看查詢結果:

"aggregations": {
"all_interests": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "10.96.141.205",
"doc_count": 383515
},
{
"key": "10.96.141.203",
"doc_count": 8868
},
{
"key": "10.96.141.204",
"doc_count": 8866
},
{
"key": "10.96.141.209",
"doc_count": 8864
},
{
"key": "10.96.141.210",
"doc_count": 8862
}
]
}
}

我們可以看到兩個職員對音樂有興趣,一個喜歡林學,一個喜歡運動。這些數據並沒有被預先計算好,它們是實時的從匹配查詢語句的文檔中動態計算生成的。如果我們想知道所有姓"Smith"的人最大的共同點(興趣愛好),我們只需要增加合適的語句既可:

GET /megacorp/employee/_search
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}

all_interests聚合已經變成只包含和查詢語句相匹配的文檔了:

  ...
  "all_interests": {
     "buckets": [
        {
           "key": "music",
           "doc_count": 2
        },
        {
           "key": "sports",
           "doc_count": 1
        }
     ]
  }

聚合也允許分級匯總。例如,讓我們統計每種興趣下職員的平均年齡:

GET /megacorp/employee/_search
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}

雖然這次返回的聚合結果有些復雜,但任然很容易理解:

3

  ...
  "all_interests": {
     "buckets": [
        {
           "key": "music",
           "doc_count": 2,
           "avg_age": {
              "value": 28.5
           }
        },
        {
           "key": "forestry",
           "doc_count": 1,
           "avg_age": {
              "value": 35
           }
        },
        {
           "key": "sports",
           "doc_count": 1,
           "avg_age": {
              "value": 25
           }
        }
     ]
  }

該聚合結果比之前的聚合結果要更加豐富。我們依然得到了興趣以及數量(指具有該興趣的員工人數)的列表,但是現在每個興趣額外擁有avg_age字段來顯示具有該興趣員工的平均年齡。

2

即使你還不理解語法,但你也可以大概感覺到通過這個特性可以完成相當復雜的聚合工作,你可以處理任何類型的數據。

為了掌握聚合aggs語法,你一定要了解兩個主要概念:

Buckets(桶):

滿足某個條件的文檔集合。

Metrics(指標):

為某個桶中的文檔計算得到的統計信息。

就是這樣!每個聚合只是簡單地由一個或者多個桶,零個或者多個指標組合而成。


桶和SQL中的組(Grouping)擁有相似的概念,而指標則與COUNT(),SUM(),MAX(),MIN(), AVG()等相似。

讓我們仔細看看這些概念。

桶(Buckets)

一個桶就是滿足特定條件的一個文檔集合:

一名員工要麽屬於男性桶,或者女性桶。

一個聚合就是一些桶和指標的組合。一個聚合可以只有一個桶,或者一個指標,或者每樣一個。在桶中甚至可以有多個嵌套的桶。比如,我們可以將文檔按照其所屬國家進行分桶,然後對每個桶計算其平均薪資(一個指標)。

因為桶是可以嵌套的,我們能夠實現一個更加復雜的聚合操作:

將文檔按照國家進行分桶。(桶)
然後將每個國家的桶再按照性別分桶。(桶)
然後將每個性別的桶按照年齡區間進行分桶。(桶)
最後,為每個年齡區間計算平均薪資。

大家一定要理解Buckets(桶)及Metrics(指標)概念,buckets多層嵌套的概念,想基於哪個桶做統計計算,只需要嵌入一層aggs就可以了。

本文轉自張昺華-sky博客園博客,原文鏈接:http://www.cnblogs.com/bonelee/p/6344688.html,如需轉載請自行聯系原作者

elasticsearch聚合操作——本質就是針對搜索後的結果使用桶bucket(允許嵌套)進行group by,統計下分組結果,包括min/max/avg