Elasticsearch統計去重後的數量

2021-10-25 00:01:28 字數 2332 閱讀 4851

elasticsearch 提供的首個近似聚合是cardinality(注:基數)度量。 它提供乙個欄位的基數,即該字段的 distinct 或者 unique 值的數目。 你可能會對 sql 形式比較熟悉:

select count(distinct color)

from cars

去重是乙個很常見的操作,可以回答很多基本的業務問題:

我們可以用cardinality度量確定經銷商銷售汽車顏色的數量:

get /cars/transactions/_search}}

}

返回的結果表明已經售賣了三種不同顏色的汽車:

...

"aggregations":

}...

可以讓我們的例子變得更有用:每月有多少顏色的車被售出?為了得到這個度量,我們只需要將乙個cardinality度量嵌入乙個date_histogram

get /cars/transactions/_search

, "aggs": }}

}}}

正如我們本章開頭提到的,cardinality度量是乙個近似演算法。 它是基於 hyperloglog++ (hll)演算法的。 hll 會先對我們的輸入作雜湊運算,然後根據雜湊運算的結果中的 bits 做概率估算從而得到基數。

get /cars/transactions/_search}}

}

precision_threshold接受 0–40,000 之間的數字,更大的值還是會被當作 40,000 來處理。

示例會確保當欄位唯一值在 100 以內時會得到非常準確的結果。儘管演算法是無法保證這點的,但如果基數在閾值以下,幾乎總是 100% 正確的。高於閾值的基數會開始節省記憶體而犧牲準確度,同時也會對度量結果帶入誤差。

對於指定的閾值,hll 的資料結構會大概使用precision_threshold * 8位元組的記憶體,所以就必須在犧牲記憶體和獲得額外的準確度間做平衡。

在實際應用中,100的閾值可以在唯一值為百萬的情況下仍然將誤差維持 5% 以內。

如果想要獲得唯一值的數目, 通常 需要查詢整個資料集合(或幾乎所有資料)。 所有基於所有資料的操作都必須迅速,原因是顯然的。 hyperloglog 的速度已經很快了,它只是簡單的對資料做雜湊以及一些位操作。

但如果速度對我們至關重要,可以做進一步的優化。 因為 hll 只需要字段內容的雜湊值,我們可以在索引時就預先計算好。 就能在查詢時跳過雜湊計算然後將雜湊值從 fielddata 直接載入出來。

預先計算雜湊值只對內容很長或者基數很高的字段有用,計算這些欄位的雜湊值的消耗在查詢時是無法忽略的。

儘管數值字段的雜湊計算是非常快速的,儲存它們的原始值通常需要同樣(或更少)的記憶體空間。這對低基數的字串字段同樣適用,elasticsearch 的內部優化能夠保證每個唯一值只計算一次雜湊。

基本上說,預先計算並不能保證所有的字段都更快,它只對那些具有高基數和/或者內容很長的字串欄位有作用。需要記住的是,預計算只是簡單的將查詢消耗的時間提前轉移到索引時,並非沒有任何代價,區別在於你可以選擇在 什麼時候 做這件事,要麼在索引時,要麼在查詢時。

要想這麼做,我們需要為資料增加乙個新的多值字段。我們先刪除索引,再增加乙個包括雜湊值字段的對映,然後重新索引:

delete /cars/

put /cars/}}

}}

}}post /cars/transactions/_bulk}}

}}}}

}}

多值字段的型別是murmur3,這是乙個雜湊函式。

現在當我們執行聚合時,我們使用color.hash欄位而不是color字段:

get /cars/transactions/_search}}

}

注意我們指定的是雜湊過的多值字段,而不是原始字段。

現在cardinality度量會讀取"color.hash"裡的值(預先計算的雜湊值),取代動態計算原始值的雜湊。

單個文件節省的時間是非常少的,但是如果你聚合一億資料,每個欄位多花費 10 納秒的時間,那麼在每次查詢時都會額外增加 1 秒,如果我們要在非常大量的資料裡面使用cardinality,我們可以權衡使用預計算的意義,是否需要提前計算 hash,從而在查詢時獲得更好的效能,做一些效能測試來檢驗預計算雜湊是否適用於你的應用場景。。

Elasticsearch 實現分組統計

之前有個查詢es分組求和的需求,類似關係型資料庫 select a b sum c from table group by a,b 當時用dsl查詢語句實現 這邊記錄下 get my index my type search aggs aggs 說明 1.環境居於es 5.4.3 版本,查詢語句在k...

Elasticsearch的查詢和統計

1.查詢所有 get fei search 2.id到排序 get fei search sort 3.只返回部分字段 get fei search source name price 4.條件查詢 get fei search 5.分頁查詢 get fei search from 1,size 3...

elasticsearch 7 聚合統計 分組聚合

原文 get index type search 返回值表示,15,20 區間內的值有1個,20,25 區間內的值有0個,25,30 區間內的值有1個,30,35 區間內的值有1個。1 直方圖篩選規則 舉個例子,有乙個price欄位,這個字段描述了商品的 現在想每隔5就建立乙個桶,統計每隔區間都有多...