ElasticSearchアグリゲーションを学ぶ方法

みなさん、こんにちは、カカです不期速成,日拱一卒

ElasticSearchは検索専用ですが、リアルタイムの分析データを集約する機能も提供します。集約は、複雑なデータに対して一連の計算を実行した後、必要なデータを実現できます。

アグリゲーションの機能は検索とは全く異なりますが、使用するデータ構造は全く同じであるため、アグリゲーションの実行速度は非常に速く、同じデータを同時に検索・フィルタリング・分析することができます。 1つのリクエストで時間。

ElasticSearchの集約は、次の4つのカテゴリに分類されます。

  • バケット集約:バケットタイプ、列が特定の条件を満たすドキュメントのコレクション

  • メトリック集約:メトリック分析タイプ。最大値と最小値の検索など、データに対して数学演算を実行します。

  • パイプライン集約:パイプライン分析のタイプであり、集約された結果は2回集約されます

  • Matix Aggregation:複数のフィールドでの操作をサポートし、結果マトリックスを提供するマトリックス分析タイプ

単純さから始めて、バケットとメトリックの2つのタイプを見てみましょう。バケットの実装の結果はMySQLでgroupキーワードを使用し、メトリックはMySQLでmax関数とmin関数を使用します。

一、バッカートアグリゲーション

導入する

上の図からわかるように、データは3つのバケットに分割され、最初のバケットは300未満の高さをカウントし、2番目のバケットは600を超える高さをカウントし、3番目のバケットは300〜600の高さをカウントします。はい、この場合、さまざまな高さに応じてさまざまなバケットに分割されます。

集計分析メカニズムを使用して、年齢、地理的な場所、性別、給与範囲、注文の伸び、職位などで配布することもできます。いくつかの共通データがある限り、集計をアーカイブに使用できます。

一般的なバケットバケット戦略

  • 用語:用語に応じたバケット、テキストタイプの場合は、単語のセグメンテーションの結果に応じたバケット

  • 範囲:バケットルールを設定する値の範囲を指定します

  • データ範囲:バケットルールを設定する日付の範囲を指定します

  • ヒストグラム:バケットルールを設定するための固定間隔

  • データヒストグラム:日付に対するヒストグラムまたはヒストグラム

条項

目的地別のバケット

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "destcountry_term":{
      "terms": {
        "field""DestCountry"
      }
    }
  },
  "profile":"true"
}

返された結果から、フライト情報が目的地ごとに分類されていることがわかります。同時に、ElasticSearchでサイズ値が手動で定義されていない場合、デフォルトで10件の結果のみが返されることがわかります。

"aggregations" : {
    "destcountry_term" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 3187,
      "buckets" : [
        {
          "key" : "IT",
          "doc_count" : 2371
        },
        {
          "key" : "US",
          "doc_count" : 1987
        },
        {
          "key" : "CN",
          "doc_count" : 1096
        },
        {
          "key" : "CA",
          "doc_count" : 944
        },
        {
          "key" : "JP",
          "doc_count" : 774
        },
        {
          "key" : "RU",
          "doc_count" : 739
        },
        {
          "key" : "CH",
          "doc_count" : 691
        },
        {
          "key" : "GB",
          "doc_count" : 449
        },
        {
          "key" : "AU",
          "doc_count" : 416
        },
        {
          "key" : "PL",
          "doc_count" : 405
        }
      ]
    }
  }

範囲

平均価格が300未満、300〜600、600を超える場合を照会したい

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "avgticketprice_range":{
      "range": {
        "field""AvgTicketPrice",
        "ranges": [
          {"to":300},
          {"from":300,"to":600},
          {"from":600}
        ]
      }
    }
  }
}

返される結果は次のとおりです。異なる間隔に従って3つの結果のキー値を設定できます。

"aggregations" : {
    "avgticketprice_range" : {
      "buckets" : [
        {
          "key" : "*-300.0",
          "to" : 300.0,
          "doc_count" : 1816
        },
        {
          "key" : "300.0-600.0",
          "from" : 300.0,
          "to" : 600.0,
          "doc_count" : 4115
        },
        {
          "key" : "600.0-*",
          "from" : 600.0,
          "doc_count" : 7128
        }
      ]
    }
  }

keyed:trueを設定することにより、各間隔に特定の名前を返すようにすることができます。

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "avgticketprice_range":{
      "range": {
        "field""AvgTicketPrice",
        "keyed":"true",
        "ranges": [
          {"to":300},
          {"from":300,"to":600},
          {"from":600}
        ]
      }
    }
  }
}

前のケースとの違いを比較できます。

"aggregations" : {
    "avgticketprice_range" : {
      "buckets" : {
        "*-300.0" : {
          "to" : 300.0,
          "doc_count" : 1816
        },
        "300.0-600.0" : {
          "from" : 300.0,
          "to" : 600.0,
          "doc_count" : 4115
        },
        "600.0-*" : {
          "from" : 600.0,
          "doc_count" : 7128
        }
      }
    }
  }

もちろん、間隔の名前を指定することもできます

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "avgticketprice_range":{
      "range": {
        "field""AvgTicketPrice",
        "keyed":"true",
        "ranges": [
          {"key":"小于300","to":300},
          {"key":"300到600之间","from":300,"to":600},
          {"key":"大于600","from":600}
        ]
      }
    }
  }
}

結果を返す

"aggregations" : {
    "avgticketprice_range" : {
      "buckets" : {
        "小于300" : {
          "to" : 300.0,
          "doc_count" : 1816
        },
        "300到600之间" : {
          "from" : 300.0,
          "to" : 600.0,
          "doc_count" : 4115
        },
        "大于600" : {
          "from" : 600.0,
          "doc_count" : 7128
        }
      }
    }
  }

データ範囲

設定した期間に応じてタイムスタンプフィールドをバケット化するなど、日付範囲を指定してバケット化ルールを設定します。

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "data_range_timestamp":{
      "date_range":{
        "field":"timestamp",
        "format":"yyyy-MM",
        "ranges":[
          {"from":"2022-01","to":"2022-02"},
          {"from":"2022-02","to":"2022-03"}
        ]
      }
    }
  }
}

結果を返します。固定キー値を設定する場合は、どのように設定するかを考えてください。注意すべきもう1つのことは、日付形式ですyyyy-MM-dd HH:mm:ss

"aggregations" : {
    "data_range_timestamp" : {
      "buckets" : [
        {
          "key" : "2022-01-2022-02",
          "from" : 1.6409952E12,
          "from_as_string" : "2022-01",
          "to" : 1.6436736E12,
          "to_as_string" : "2022-02",
          "doc_count" : 9580
        },
        {
          "key" : "2022-02-2022-03",
          "from" : 1.6436736E12,
          "from_as_string" : "2022-02",
          "to" : 1.6460928E12,
          "to_as_string" : "2022-03",
          "doc_count" : 1837
        }
      ]
    }
  }

ヒストリグラム

100の間隔でAvgTicketPriceフィールドをバケット化するなど、固定間隔の戦略でデータを分割するヒストグラム。

  • 間隔:すべての間隔は50です

  • min_doc_count:既存のドキュメントの最小数は0です

  • extended_bounds:この値は、min_doc_countが0の場合にのみ意味があります

実装すると、extended_boundsはバケットをフィルタリングしないことがわかります。extended_bounds.minがドキュメントから抽出された値よりも大きい場合でも、ドキュメントは最初のバケットが何であるかを指示します(extended_bounds.maxと最後のバケットについても同じです)。バケットをフィルタリングするには、適切なfrom / to設定を使用して、範囲フィルター集約内にヒストグラム集約をネストする必要があります。

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "price_histogram":{
      "histogram": {
        "field""AvgTicketPrice",
        "interval": 50,
        "min_doc_count":"0",
        "extended_bounds":{
          "min":0,
          "max":600
        }
      }
    }
  }
}

結果を返す

"aggregations" : {
    "price_histogram" : {
      "buckets" : [
        {
          "key" : 0.0,
          "doc_count" : 0
        },
        {
          "key" : 50.0,
          "doc_count" : 0
        },
        {
          "key" : 100.0,
          "doc_count" : 380
        },
        {
          "key" : 150.0,
          "doc_count" : 369
        },
        {
          "key" : 200.0,
          "doc_count" : 398
        }
      ]
    }
  }

データヒストグラム

日付のヒストグラムまたはヒストグラムは、月ごとの間隔に従ってタイムスタンプフィールドをバケット化するなど、時系列データ分析で一般的に使用される集計分析タイプです。

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "timestamp_data_histogram":{
      "date_histogram": {
        "field""timestamp",
        "interval""month",
        "min_doc_count": 0,
        "format""yyyy-MM-dd",
        "extended_bounds": {
          "min""2021-10-10",
          "max""2022-01-19"
        }
      }
    }
  }
}

結果を返す

"aggregations" : {
    "timestamp_data_histogram" : {
      "buckets" : [
        {
          "key_as_string" : "2021-10-01",
          "key" : 1633046400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2021-11-01",
          "key" : 1635724800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2021-12-01",
          "key" : 1638316800000,
          "doc_count" : 1642
        },
        {
          "key_as_string" : "2022-01-01",
          "key" : 1640995200000,
          "doc_count" : 9580
        },
        {
          "key_as_string" : "2022-02-01",
          "key" : 1643673600000,
          "doc_count" : 1837
        }
      ]
    }
  }

2.ネストされたクエリ

5つのバケットの実装を上に示します。実際の開発では、単一の集計クエリを実行することは非常にまれです。ほとんどの場合、ネストされた操作が実行されます。

最初に航空券に従ってバケットを分割し、次にバケット化されたデータの合計、最小、最大、平均、および合計を取得します。

post /kibana_sample_data_flights/_search
{
  "size":0,
  "aggs":{
    "price_range":{
      "range": {
        "field""AvgTicketPrice",
        "ranges": [
          {"to":300},
          {"from":300,"to":600},
          {"from":600}
        ]
      },
      "aggs":{
        "price_status":{
          "stats": {
            "field""AvgTicketPrice"
          }
        }
      }
    }
  }
}

結果を返します(返された結果はインターセプトされて表示されます)

"aggregations" : {
    "price_range" : {
      "buckets" : [
        {
          "key" : "*-300.0",
          "to" : 300.0,
          "doc_count" : 1816,
          "price_status" : {
            "count" : 1816,
            "min" : 100.0205307006836,
            "max" : 299.9529113769531,
            "avg" : 212.5348257619379,
            "sum" : 385963.2435836792
          }
        }
      ]
    }
  }

私たちが掘り下げて、最初に基本を成し遂げるのを待っているより多くの操作があります、不期速成,日拱一卒

「「

学習の粘り強さ、執筆の忍耐力、共有の忍耐力は、カカが彼女のキャリア以来支持してきた信念です。この記事が巨大なインターネットであなたに少しの助けをもたらすことを願っています、私はカカです、次の号でお会いしましょう。

 

{{o.name}}
{{m.name}}

おすすめ

転載: my.oschina.net/u/3828348/blog/5518210