1. 程式人生 > >Elasticsearch Terms Aggregation 根據某一項的聚合

Elasticsearch Terms Aggregation 根據某一項的聚合

根據某一項的每個唯一的值的聚合。
舉例:

{
    "aggs" : {
        "genres" : {
            "terms" : { "field" : "genre" }
        }
    }
}

返回

{ 
    "aggregations" : {
        "genres" : {
            "doc_count_error_upper_bound": 0, 
            "sum_other_doc_count": 0, 
            "buckets" : [ 
                {
                    "key
" : "jazz", "doc_count" : 10 }, { "key" : "rock", "doc_count" : 10 }, { "key" : "electronic", "doc_count" : 10 }, ]
}
}
}

上面 ,對於genre 這個欄位,對它裡面的各個值的文件數量進行統計。
doc_count_error_upper_bound 未知
sum_other_doc_count 當有大量不同值時,ES只返回數量最多的項。這個數字表示有多少文件的統計數量沒有返回。
預設情況,對於某一項的聚合,只會返回數量最高的10項,通過調整size引數,可以控制預設的行為。
我測試到,令size=0時候,會返回所有的項。

Size
size引數用來指定在列表中返回多少項。如果該項的值的個數要大於這個size ,那麼返回的結果可能會不準確,有輕微的誤差。甚至文件數最多的那個值沒有的返回。

文件的數量是大約的量
文件的數量是不準確的,只是一個大概值。因為每個分片給出它排好的前n的部分,然後再把各個分片的結果聯合成最後的結果。
官方文件給了一個非常好的例子,還有幾張表格,說明造成這個情況的原因。可以自己跳過去閱讀以下就明白了。這一切的原因都是因為 ES是一個分散式的儲存方式。

Shard size
取得size的值越大,結果會越接近準確,當然這樣導致的負載也會越高(因為更多的查詢和節點之間大資料量的傳輸)。
預設shard_size是等於size的。如果shard_size 取更大的值,結果會更準確。

計算文件數錯誤

有兩個錯誤值會顯示在項的聚合上,第一個doc_count_error_upper_bound ,給出個沒有被算進最後的結果的最大可能的數字。這個表明在最壞情況下,有doc_count_error_upper_bound 這麼多文件個數的一個值被遺漏了。 這就是doc_count_error_upper_bound (文件數錯誤上界)這個引數的意義。

每個桶裡的錯誤數
如果設定show_term_doc_count_error這個引數為ture,還會對每個 bucket都顯示一個錯誤數,表示最大可能的誤差情況。

而且,如果不是按照排序的話,這個錯誤是算不出來的,這時候,會給一個-1來表示這種有錯,但是不知道錯誤邊界的情況。

Order
用order引數可以做排序,預設是按照doc_count倒序排列的。
可以改變預設情況
“order” : { “_count” : “asc” } 這是按照doc_count升序排列
“order” : { “_term” : “asc” } 這是按照字母表升序排列。