ポイント: 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"
}
}
}
}'
ElasticSearchガイド
- 初心者のためのElasticSearchチュートリアル: ElasticSearchの基本
- ElasticSearchでApache Hiveを使用する
- ElasticSearchでApache Sparkを使用する
- Curl ElasticSearchコマンドチートシート
- Spark ElasticSearch Hadoopの更新とUpsertの例および説明
- Pythonを使用してApache SparkデータをElasticSearchに書き込む方法
- ElasticSearch検索構文とブールおよび集約検索
- ElasticSearchネストされたクエリ: 埋め込みドキュメントの検索方法
- ElasticSearchの結合: Has_Child、Has_parentクエリ
- Elastic Version 7クラスターのセットアップ方法
- nginxとElasticSearchのためのFilebeatの設定方法
- BeatsとLogstashを使用してElasticSearchにログを送信する
- Logstashを使用してCSVファイルをElasticSearchにロードする方法
- ElasticSearchの集約について説明
- ELKスタックとは何ですか?
- Logstash 101: データ処理パイプラインでのLogstashの使用
- Kibanaを使用してElasticSearchでLuceneおよびKibanaクエリ言語を実行する
- ElasticSearchの機械学習
- Elastic Enterprise Searchのインストール方法
- GitHubでElastic Enterprise Searchを使用する方法
これらの投稿は私自身の見解であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。