elasticsearch(7)聚合統計-分組聚合
阿新 • • 發佈:2018-11-16
直方圖聚合
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_histogram": {
"histogram": {
"field": "field1",
"interval": 5
}
}
}
}
返回值表示,[15,20)區間內的值有1個,[20,25)區間內的值有0個,[25,30)區間內的值有1個,[30,35)區間內的值有1個。
{ "aggregations": { "test_histogram": { "buckets": [ { "key": 15, "doc_count": 1 }, { "key": 20, "doc_count": 0 }, { "key": 25, "doc_count": 1 }, { "key": 30, "doc_count": 1 } ] } } }
1、直方圖篩選規則
舉個例子,有一個price欄位,這個欄位描述了商品的價格,現在想每隔5就建立一個桶,統計每隔區間都有多少個文件(商品)。
如果有一個商品的價格為32,那麼它會被放入30的桶中,計算的公式如下:
rem = value % interval
if (rem < 0) {
rem += interval
}
bucket_key = value - rem
通過上面的方法,就可以確定文件屬於哪一個桶。
不過也有一些問題存在,由於上面的方法是針對於整型資料的,因此如果欄位是浮點數,那麼需要先轉換成整型,再呼叫上面的方法計算。問題來了,正數還好,如果該值是負數,就會出現計算出錯。比如,一個欄位的值為-4.5,在進行轉換整型時,轉換成了-4。那麼按照上面的計算,它就會放入-4的桶中,但是其實-4.5應該放入-6的桶中。
2、extended_bounds
extended_bounds
可以強制直方圖聚合從指定最小值開始建立分組,直到最大值,即使沒有任何文件存在。
且extended_bounds
不會過濾分組,即使實際上的分組不在extended_bounds
的最小值最大值區間內,直方圖聚合依然以實際的最小值或最大值建立分組。
GET /index/type/_search { "size": 0, "aggs": { "test_histogram": { "histogram": { "field": "field1", "interval": 5, "extended_bounds":{ "min": 0, "max": 20 } } } } }
3、排序
按直方圖分組的key排序:
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_histogram": {
"histogram": {
"field": "field1",
"interval": 5,
"order": {
"_key": "asc"
}
}
}
}
}
按直方圖分組的value排序:
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_histogram": {
"histogram": {
"field": "field1",
"interval": 5,
"order": {
"_count": "desc"
}
}
}
}
}
4、偏移
分組預設從0開始以interval
為間隔步進,可以通過offset
修改分組的開始位置。
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_histogram": {
"histogram": {
"field": "field1",
"interval": 5,
"offset": 8
}
}
}
}
日期直方圖聚合
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_date_histogram": {
"date_histogram": {
"field": "field1",
"interval": "1M",
"format": "yyyy-MM-dd"
}
}
}
}
interval
支援的表示式有:year、month、week、day、hour、quarter、minute、second。
日期範圍聚合
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_date_range": {
"date_range": {
"field": "field1",
"format": "yyyy-MM-dd",
"ranges": [
{
"from": "now-10M/M",
"to": "now"
}
]
}
}
}
}
範圍聚合
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_range": {
"range": {
"field": "field1",
"ranges": [
{
"from": 0,
"to": 10
}
]
}
}
}
}
過濾聚合
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_filter": {
"aggs": {
"test_histogram": {
"histogram": {
"field": "field1",
"interval": 10
}
}
},
"filter": {
"range": {
"field2": {
"gte": 10
}
}
}
}
}
}
多重過濾聚合
等價於批量過濾聚合。
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_filters": {
"aggs": {
"test_histogram": {
"histogram": {
"field": "field1",
"interval": 10
}
}
},
"filters": {
"filters": {
"test_range": {
"range": {
"field2": {
"gte": 10
}
}
},
"test_range2" :{
"range": {
"field2": {
"lte": 20
}
}
}
}
}
}
}
}
空值集合
GET /testindex/testtype/_search
{
"size": 0,
"aggs": {
"test_missing": {
"missing": {
"field": "field1"
}
}
}
}
索引詞聚合
通過制定欄位的值統計聚合。
GET /index/type/_search
{
"size": 0,
"aggs": {
"test_terms": {
"terms": {
"field": "field1"
}
}
}
}
1、規模
通過size
引數指定返回的分組數量,size
設定為0表示規模大小為Integer.MAX_VALUE
。
2、排序
通過order
自定義分組排序方式,預設根據分組的doc_count
值降序排序。
GET /testindex/testtype/_search
{
"size": 0,
"aggs": {
"test_terms": {
"terms": {
"field": "field1",
"size": 10,
"order": {
"_count": "desc"
}
}
}
}
}
3、過濾
GET /testindex/testtype/_search
{
"size": 0,
"aggs": {
"test_terms": {
"terms": {
"field": "field1",
"size": 10,
"include": "*",
"exclude": "water.*"
}
}
}
}