Elasticsearch 6 を使ったデータ検証 その6( Aggregation を使った分類・集計 ) - 株式会社CoLabMix

Elasticsearch 6 を使ったデータ検証 その6( Aggregation を使った分類・集計 )

さて、前回に引き続き Elasticsearch の検証ですが、今回は Aggregattion を使って分類や集計を行っていきます。

★関連記事
Elasticsearch 6 を使ったデータ検証 その1(Dockerでコンテナの作成と確認)

Elasticsearch 6 を使ったデータ検証 その2(マッピングの登録をしてみる)

Elasticsearch 6 を使ったデータ検証 その3(bulkでデータを投入してみる)

Elasticsearch 6 を使ったデータ検証 その4(チュートリアル記事とデータの検索での比較)

Elasticsearch 6 を使ったデータ検証 その5(クエリでの検索)

Elasticsearch 6 を使ったデータ検証 その7(Analyzerについて)

 

データセットは前回と同じものを使います。

今回はRDMSの「Group by」に似た「Aggregation」を使ってドキュメントを特定のグループに分類して、さらにそのグループごとの件数、最大値、平均値といった統計量の値を検索してみます。

Aggregationについて

Aggregationは、統計情報を出したり、分類・集計を行うためのいくつかのカテゴリに分けることができます。

カテゴリとしては「Metrics」、「Buckets」、「Pipeline」、「Matrix」の4つです。

データセットに対しては以下の2つでデータを抽出できます。

  • query句で検索条件を指定してデータを絞り込んで抽出
  • Bucketsを使ってドキュメントをグループ化してグループ化されたデータから抽出

 

平均、最大、最小などの統計値を求める

Aggregationでは「aggs」句を利用して分類を行います。

尚、以下のAggregation全般でsize句に0を指定するとAggregationで計算した統計量の数値だけが返されます。

平均を抽出

avg句を使うとグループ化したものに対して平均を求めることができます。

上記ではカテゴリー317のアクセス数の平均を求めています。(今回はkeywordにmatch句を使っています。)

 

最大値、最小値を抽出

max, minを使うと最大値と最小値の集計を行えます。

同じくcategoryのアクセス数の最大値と最小値を抽出しています。

今回は「term」を利用しています。(こちらが適切)

 

概算値を抽出

「cardinality」はフィールドの数の概算値を抽出します。

非常に早いハッシュのアルゴリズム(HyperLogLog++)を使い全件を捜査せずに値の概算を出します。
(概算ですので金額などの数字には不向きです。)

 

集計値をまとめて抽出

statsを使うと1回のクエリで、複数の統計値をまとめて抽出できます。

最小、最大、平均、合計を抽出しました。

 

フィールドを分類する

termsを使ってグルーピング化したフィールド定義

terms句を使うとフィールドをグルーピング化できます。(「group by」に似ている)

以下ではグループピング化したフィールドの上位3件抽出しています。

結果としてグループ化されたフィールドの値の「key」とドキュメント数の「doc_count」が結果に表示されています。

 

 

値の範囲を指定しての抽出

ranges句を使うと数値型の値の範囲を使って分類を行えます。

 

 

日付の範囲での分類

「date_range」句を使うと日付の範囲での分類が行えます。

ログ分析など非常に大きな効果が発揮できそうな機能です。

 

段階の値での抽出

histgram区を使うと自動的に値を段階的に設定して、分類を行うことができます。

 

histgramはrangeと同様に数値型のフィールドに対して値の範囲でBucketsを分類します。
範囲を指定するのではなく、増分値(interval)を指定します。

 

複数の抽出条件の組み合わせ

上記の複数の抽出条件を合わせた集計を行えます。

ネスト化され複雑にはなっていきますが、様々な条件での分類・集計を行うことができます。

 

特殊な集計

特異点を持つ分類の抽出

「significant terms」区では今までのように最大・最小などの集計ではなく、分類した時に特異点を持つ特徴を見つけ出すことができます。

「事故率の多い種別」や「予想しにくい販売の傾向」など特異点から様々な角度でのデータ分析を行うことができるaggregationタイプです。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html

スコアが大きいほど平均から離れた特異点のデータとなります。

上記ではカテゴリで分類された情報から、閉店された店で特定ジャンルでの閉店傾向などとして調べています。

一件、「3.8331003046076514E-4」とスコアが「0.000383310030460765」と極端に小さくなる値があり、調べていくことで特殊な関連など見るけることができるかもしれません。

 

今回はここまでで。

次回はAnalyzerの設定を確認し、より日本語などの検索に適した設定などを確認してみます。

 

★関連記事
Elasticsearch 6 を使ったデータ検証 その1(Dockerでコンテナの作成と確認)

Elasticsearch 6 を使ったデータ検証 その2(マッピングの登録をしてみる)

Elasticsearch 6 を使ったデータ検証 その3(bulkでデータを投入してみる)

Elasticsearch 6 を使ったデータ検証 その4(チュートリアル記事とデータの検索での比較)

Elasticsearch 6 を使ったデータ検証 その5(クエリでの検索)

Elasticsearch 6 を使ったデータ検証 その7(Analyzerについて)

 

このブログは株式会社CoLabMixによる技術ブログです。

GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。

Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。

開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。

お問い合わせやご依頼・ご相談など

     

    関連記事

    1. python3でGoogleDriveからファイルの取得

    2. Scrapyでデータの保存をmongodbにしてみる(Scrapy そ…

    3. DockerでRails5.2の環境を構築する その2

    4. terraformでVPC+EC2+RDS(aurora-mysql)…

    5. curlでSSL接続しようとすると「curl: (35) SSL co…

    6. IT完全未経験からWebエンジニア転職の為に行った活動