Elasticのelasticsearch集計操作

集計により、データの統計と分析を非常に便利に実現できます。例えば:

  • 最も人気のある携帯電話のブランドは?

  • これらの電話の平均価格、最高価格、最低価格は?

  • これらの電話は毎月どのように販売されていますか?

これらの統計機能を実現することは、データベースの sql よりもはるかに便利であり、クエリ速度が非常に高速であるため、リアルタイムの検索効果を実現できます。

 0. データ準備

POST /liush/_bulk
{"index":{"_id":1}}
{ "title":"小米手机", "images":"http://image.jd.com/12479122.jpg", "price":1999, "stock": 200, "attr": { "category": "手机", "brand": "小米" } }
{"index":{"_id":2}}
{"title":"超米手机", "images":"http://image.jd.com/12479122.jpg", "price":2999, "stock": 300, "attr": { "category": "手机", "brand": "小米" } }
{"index":{"_id":3}}
{ "title":"小米电视", "images":"http://image.jd.com/12479122.jpg", "price":3999, "stock": 400, "attr": { "category": "电视", "brand": "小米" } }
{"index":{"_id":4}}
{ "title":"小米笔记本", "images":"http://image.jd.com/12479122.jpg", "price":4999, "stock": 200, "attr": { "category": "笔记本", "brand": "小米" } }
{"index":{"_id":5}}
{ "title":"华为手机", "images":"http://image.jd.com/12479122.jpg", "price":3999, "stock": 400, "attr": { "category": "手机", "brand": "华为" } }
{"index":{"_id":6}}
{ "title":"华为笔记本", "images":"http://image.jd.com/12479122.jpg", "price":5999, "stock": 200, "attr": { "category": "笔记本", "brand": "华为" } }
{"index":{"_id":7}}
{ "title":"荣耀手机", "images":"http://image.jd.com/12479122.jpg", "price":2999, "stock": 300, "attr": { "category": "手机", "brand": "华为" } }
{"index":{"_id":8}}
{ "title":"oppo手机", "images":"http://image.jd.com/12479122.jpg", "price":2799, "stock": 400, "attr": { "category": "手机", "brand": "oppo" } }
{"index":{"_id":9}}
{ "title":"vivo手机", "images":"http://image.jd.com/12479122.jpg", "price":2699, "stock": 300, "attr": { "category": "手机", "brand": "vivo" } }
{"index":{"_id":10}}
{ "title":"华为nova手机", "images":"http://image.jd.com/12479122.jpg", "price":2999, "stock": 300, "attr": { "category": "手机", "brand": "华为" } }

1. 基本コンセプト

Elasticsearch の集約には多くのタイプが含まれます。最も一般的に使用される 2 つは「bucket」と呼ばれ、もう 1 つは「measure」と呼ばれます。

①バケット

バケットの役割は、データを特定の方法でグループ化することです. ES では、データの各グループを「バケット」と呼びます. たとえば、国籍別に人を分けると、「中国のバケット」、「英国のバケット」、 「ジャパニーズバケツ」... または、0~10歳、10~20歳、20~30歳、30~40歳などの年齢層で分けています。

Elasticsearch で提供されるバケットを分割する方法は多数あります。


- 日付ヒストグラム集計: 日付ラダーに従ってグループ化します。たとえば、特定のラダーが 1 週間の場合、毎週自動的にグループに
グループ化されます 完全一致はグループです
- 範囲集計: 値の範囲グループ化および日付、開始日と終了日を指定してから、セグメントごとにグループ化します
- …

バケット集計はデータのグループ化のみを担当し、計算は実行しないため、別のタイプの集計がバケットにネストされることがよくあります: メトリック集計はメトリックです

②指標

グループ化が完了したら、通常、グループ内のデータに対して平均、最大、最小、合計などの集計操作を実行します。これらはES では「メジャー」と呼ばれます。

一般的に使用されるいくつかのメトリック集計方法:

- Avg Aggregation: 平均値
- Max Aggregation: 最大値
- Min Aggregation: 最小値
- Percentiles Aggregation: パーセンテージ
- Stats Aggregation: 平均、最大、最小、合計、カウントなどを同時に返す
- Sum Aggregation: 合計
-トップ ヒットの集計: 最初の数件を検索
- 値カウント集計: 合計を検索
-...

2. バケットに集約する

まず、電話のブランド「attr.brand.keyword」で「bucket」を分割します。

 - size: クエリの数。ここでは 0 に設定されています。これは、検索されたデータを気にしないためです。効率を向上させるために集計結果のみを気にするためです。 - aggs: これが集計クエリであることを宣言します。これは略語です
。集約の
  - ブランド: この集約に名前を付けます。
    - terms: バケットの分割方法、ここでは用語に従って分割されます
      - field: バケットの分割フィールド

GET /liush/_search
{
    "size" : 0,
    "aggs" : { 
        "brands" : { 
            "terms" : { 
              "field" : "attr.brand.keyword"
            }
        }
    }
}

- hits: サイズを 0 に設定したため、クエリ結果は空です
- 集計: 集計の結果
- Brands: 定義した集計の名前
- buckets: 見つかったバケット、それぞれの異なるブランド フィールド値がバケットを形成します
  - key : このバケットに対応するブランド フィールドの値
  - doc_count: このバケット内のドキュメントの数 

3. バケットのメトリクス

前の例は、各バケット内のドキュメントの数を示しており、これは役に立ちます。しかし、多くの場合、アプリケーションはより複雑なドキュメント メトリックを提供する必要があります。たとえば、各ブランドの携帯電話の平均価格はいくらですか?

そのため、Elasticsearch に「どのフィールドを使用するか」「どのような測定方法を使用して計算するか」を伝える必要があります.これらの情報は「バケット」にネストされ、「メトリック」の操作は「バケット」に基づいて実行されます. 「バケット」内のドキュメント

それでは、集計結果に価格を平均化するためのメトリックを追加しましょう。

- aggs: 以前の aggs(ブランド) に新しい aggs を追加します。`measure` も集計であることがわかります
- avg_price: 集計の名前
- avg: 測定のタイプ、ここでは平均値
- field: 測定操作のフィールド 

GET /liush/_search
{
    "size" : 0,
    "aggs" : { 
        "brands" : { 
            "terms" : { 
              "field" : "attr.brand.keyword"
            },
            "aggs":{
                "avg_price": { 
                   "avg": {
                      "field": "price" 
                   }
                }
            }
        }
    }
}

各バケットには、メトリック集計の結果である独自の「avg_price」フィールドがあることがわかります

4.バケット内のネストされたバケット

先ほどのケースでは、メトリックをバケット内にネストしました。実際、バケットは操作をネストできるだけでなく、他のバケットもネストできます。つまり、各グループで、さらにグループに分けます。

例: ブランドごとにどの製品が生産されているかをカウントし、「attr.category.keyword」フィールドに従ってそれらをバケットに分割します。

GET /liush/_search
{
    "size" : 0,
    "aggs" : { 
        "brands" : { 
            "terms" : { 
              "field" : "attr.brand.keyword"
            },
            "aggs":{
                "avg_price": { 
                   "avg": {
                      "field": "price" 
                   }
                },
                "categorys": {
                  "terms": {
                    "field": "attr.category.keyword"
                  }
                }
            }
        }
    }
}

- ご覧のとおり、新しい集計の「categorys」は、元の「brands」バケットのそれぞれにネストされています。
- 各ブランドは `attr.category.keyword` フィールドに従ってグループ化されています
- 読み取ることができる情報:
  - Huawei には 4 つの製品があります
  - Huawei 製品の平均販売価格は $3999.0 です。
  - うち、ケータイ商品3種、ノート商品1種

Guess you like

Origin blog.csdn.net/qq_45037155/article/details/129697995