ElasticSearchの集約について説明

ElasticSearchの集約について説明

  • 人工知能(AI)
5分で読めます 更新日 Jul 8, 2019

ポイント: ElasticSearchの集約は、ユーザーがSQLのGROUP BY機能に似たデータをグループ化および分析できることを可能にします。ログからのウェブヒットのカウントなど、これらの操作は複雑で、ネストされたクエリを許可します。

  • 集約は、効率的なデータ分析のために数値およびキーワードタイプを処理できます。
  • 一般的なタイプには、発生回数をカウントするためのバケット集約が含まれます。

ElasticSearchは、SQLのGROUP BY COUNTおよびAVERAGE関数に相当する機能を提供します。これらを集約と呼びます。言い換えれば、nginxウェブサーバーログを見ている場合は、

  • ユーザーが来た都市ごとに各ウェブヒット記録をグループ化
  • それらをカウントする

したがって、次のような結果が得られます:

都市 ウェブヒット
パリ 20
ロンドン 30
ベルリン 40

SQLでは、これは次のようなものになります:

    select city, count(city) from logs
 group by city

ここでは、最もシンプルな使用ケースであるウェブログを使用してこれを示します。前のドキュメントをフォローして、nginxウェブサーバーログでElasticSearchインスタンスを人口させることができます。集約 ElasticSearchはパフォーマンスに関心があるため、集約できるフィールドの種類に関するいくつかのルールがあります。数値フィールドでグループ化できますが、テキストフィールドはkeywordタイプである必要があります。またはfielddata=true.キーワードはインデックスのようなものと考えることができます。nginxデータをロードしたとき、最初にインデックスマッピングを作成しませんでした。ElasticSearchがその場で構築させました。したがって、すべてのテキストフィールドをインデックス化することを選択しました。それらはkeywordタイプとしてマップされています。このように:

    "geoip" : {
          "dynamic" : "true",
          "properties" : {
            "city_name" : {
              "type" : "text",
              "norms" : false,
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }

集約は複雑なトピックです。多くのバリエーションがあります。複雑なクエリを構築するためにネストすることができます。ここでは、最もシンプルで一般的な使用ケースであるバケット集約を見てみましょう。これは、値ごとのカウントを生成するためのselect、count SQLステートメントに似ています。以下の例では、都市名ごとのウェブヒットをカウントしたいと思います。ステートメントを構築する一般的なパターンは次のとおりです:

  • aggsを使用します。これは集約の略です。
  • aggに名前を付けます。ここではcityName.
  • 使用するフィールドを指定します。ここではドット表記geoip.city_nameを使用します。city_nameはgeo_ipのプロパティです。言い換えれば、深くネストされたJSON構造で階層を下るときにドットを入れます。JSON配列の場合は、ElasticSearchスクリプトを使用しますが、これはまだカバーしていないトピックです。
  • そのインデックスを使用することを示すためにkeywordという単語を追加します。
  • 集約操作タイプを指定します。ここではtermsを使用します。ave(平均)や他のいくつかも使用できます。

フィルターも使用できます。これについてはさらに下で説明します。このクエリは、都市ごとのウェブヒットのカウントを生成します。

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/logstash/_search?pretty -d '{
        "aggs": {
                "cityName": {
                        "terms": {
                                "field": "geoip.city_name.keyword",
                                "size": 10
                        }

ここに結果があります。デフォルトサイズとして10を指定しました。つまり、どれくらいまで行くべきか。データに18の都市があるため、"sum_other_doc_count" : 8は8つのレコードを省略したことを示しています。ElasticSearchにはパフォーマンスを高く保つための多くのルールがあることを忘れないでください。これらの下に各doc_countがあります。したがって、モンペリエの都市から6回のウェブヒットがありました。

    "aggregations" : {
    "cityName" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 8,
      "buckets" : [
        {
          "key" : "Montpellier",
          "doc_count" : 6
        },
        {
          "key" : "Suzano",
          "doc_count" : 3
        },
        {
          "key" : "Boardman",
          "doc_count" : 2
        },
        {
          "key" : "Mazatlán",
          "doc_count" : 2
        },
        {
          "key" : "New York",
          "doc_count" : 2
        },
        {
          "key" : "San Diego",
          "doc_count" : 2
        },
        {
          "key" : "Abadan",
          "doc_count" : 1
        },
        {
          "key" : "Ashburn",
          "doc_count" : 1
        },
        {
          "key" : "Bogotá",
          "doc_count" : 1
        },
        {
          "key" : "Cambe",
          "doc_count" : 1
        }
      ]
    }
  }
}

ここで、同じデータをレスポンス、例えば200、404などでカウントします。レスポンスがlongタイプであるため、末尾にkeywordを追加する必要はありません。

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/logstash/_search?pretty -d '{
        "aggs": {
                "responses": {
                        "terms": {
                                "field": "response",
                                "size": 10
                        }
                }
        }
}'

ここに結果があります。データに4種類のレスポンスしかないため、すべて表示されました。これは< 10です。

    "aggregations" : {
    "responses" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 200,
          "doc_count" : 23
        },
        {
          "key" : 400,
          "doc_count" : 13
        },
        {
          "key" : 404,
          "doc_count" : 8
        },
        {
          "key" : 304,
          "doc_count" : 5
        }
      ]
    }
  }

クエリの追加

ここでは、結果をフィルタリングするためにクエリを使用した例を示します。これはFDAの薬物相互作用データからのもので、今後の分析に関する投稿で探求します。このクエリは薬物タイプごとの薬物相互作用をカウントします。これはFDAデータベースの全目的であり、薬物相互作用と副作用を追跡することです。したがって、これはバケットタイプの集約クエリおよびサブクエリです。

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/fda/_search?pretty -d '{
"query": {
    "term": {
      "patient.drug.medicinalproduct.keyword": {
        "value": "METRONIDAZOLE"
      }
    }
  },
      "aggs" : {
         "drug": {
             "terms" : {
                "field": "patient.drug.medicinalproduct.keyword"

           }
         },
         "adverseaffect" : {
             "terms" : {
               "field": "patient.reaction.reactionmeddrapt.keyword"
             }
       }
   }
}'

これらの投稿は私自身の見解であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。

人工知能(AI)の関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。