1. 程式人生 > >elasticsearch(7)聚合統計-分組聚合

elasticsearch(7)聚合統計-分組聚合

直方圖聚合

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