【Elasticsearch 入門4】集計・分類 (Aggregations)

本記事は Elasticsearch 入門記事の第4回「集計・分類 (Aggregations)」です。

その他の Elasticsearch の使い方は以下の記事をご覧ください。

  1. Elasticsearch とは (概要/できること/検索方法)
  2. マッピング管理とテンプレート
  3. Analyzer の設定 (日本語検索、トークナイズ)
  4. 集計・分類 (Aggregations)
  5. Dynamic index settings の変更
  6. データ構造
スポンサーリンク

集計・分類 (Aggregations)

Aggregations には次の2種類が存在します。

以下の "demo_agg" インデックスを利用して、Aggregations の動きを確認します。

POST /_bulk
{ "index" : { "_index" : "demo_agg", "_id" : "1" } }
{ "text" : "This is Elasticsearch test.","num":1 }
{ "index" : { "_index" : "demo_agg", "_id" : "2" } }
{ "text" : "Elasticsearch is God.","num":2 }
{ "index" : { "_index" : "demo_agg", "_id" : "3" } }
{ "text" : "This is a pen.","num":3 }
{ "index" : { "_index" : "demo_agg", "_id" : "4" } }
{ "text" : "I have a pen.","num":2 }

集計 (Metrics Aggregations)

Metrics Aggregations は、集計したドキュメントから指定の方法でメトリクスを計算します

メトリクスの指定できる計算方法の例は以下です。

ここでは、Avg Aggregation (平均) を利用してみます。

GET demo_agg/_search
{
  "size": 0,
  "aggs": {
    "hoge_name": {
      "avg": {
        "field":"num"
      }
    }
  }
}
  "aggregations" : {
    "hoge_name" : {
      "value" : 2.0
    }
  }

"num" フィールドの値は [1, 2, 3, 2] なので、平均の 2.0 を正しく計算できています。

分類 (Buckets Aggregations)

Buckets Aggregations とは、フィールドの値を分類し、各バケットに格納します。

Buckets Aggregations として、次の2種類を紹介します。

Range aggregation

Range aggregation とは、指定した範囲の値を格納するバケットを作成する方法です。

例として、次の2つのバケットを作成します。

  • num フォールドの値が [0 ~ 2] のドキュメントを格納するバケット
  • num フォールドの値が [2 以上] のドキュメントを格納するバケット
GET demo_agg/_search
{
  "size": 0,
  "aggs": {
    "bucket_name": {
      "range": {
        "field":"num",
        "ranges": [
          {
            "from": 0, 
            "to":2
          },
          {
            "from": 2
          }
        ]
      }
    }
  }
}
  "aggregations" : {
    "bucket_name" : {
      "buckets" : [
        {
          "key" : "0.0-2.0",
          "from" : 0.0,
          "to" : 2.0,
          "doc_count" : 1
        },
        {
          "key" : "2.0-*",
          "from" : 2.0,
          "doc_count" : 3
        }
      ]
    }

次の結果が確認できます。

  • num フォールドの値が [0 ~ 2] を格納するバケット: 1つのドキュメント (num = [1])
  • num フォールドの値が [2 以上] を格納するバケット: 3つのドキュメント (num = [2, 3, 2])

Histogram aggregation

Histogram aggregation とは、等間隔でバケットを作成する方法です。

1000 間隔でバケットを分けたヒストグラムの例

"num" フィールドを、1間隔でバケットを作成した例は、以下のとおりです。

GET demo_agg/_search
{
  "size": 0,
  "aggs": {
    "bucket_name": {
      "histogram": {
        "field":"num",
        "interval": 1
      }
    }
  }
}
  "aggregations" : {
    "bucket_name" : {
      "buckets" : [
        {
          "key" : 1.0,
          "doc_count" : 1
        },
        {
          "key" : 2.0,
          "doc_count" : 2
        },
        {
          "key" : 3.0,
          "doc_count" : 1
        }
      ]

num の値が1ごとにバケットが作成されていることがわかります。

スポンサーリンク

関連情報

関連記事

  1. Elasticsearch とは (概要/できること/検索方法)
  2. マッピング管理とテンプレート
  3. Analyzer の設定 (日本語検索、トークナイズ)
  4. 集計・分類 (Aggregations)
  5. Dynamic index settings の変更
  6. データ構造