Elasticsearch の使用 - ターム アグリゲーション、レア ターム アグリゲーション、マルチターム アグリゲーション

用語集

つまり、用語バケット集約です。これは、Elasticsearch で最も一般的に使用される集計であり、リレーショナル データベースのキー フィールドに基づくグループ化に似ています。

  • size: 返される用語バケットの数。デフォルトは 10 です。しきい値 65535。デフォルトでは、コーディネーターは各シャードから最大サイズの期間バケットを要求し、すべてのシャードが応答した後、結果が縮小されてクライアントに返されます。実際の用語バケットの数がサイズより大きい場合、返される用語バケットは偏りがあり、不正確である可能性があります。

  • shard_size: 各シャードによって返される用語バケットの数。デフォルトはサイズ * 1.5 + 10 です。shard_size が大きいほど、結果はより正確になりますが、最終的な計算のコストが高くなります (各シャードの優先キューが大きくなり、ノードとクライアント間のデータ転送量が大きくなります)。shard_size を size より小さくすることはできません。それ以外の場合、Elasticsearch はプロパティ値をオーバーライドし、size と同じ値に設定します。

  • min_doc_count: 返された用語バケット内の対応するドキュメントが満たす必要があるヒットの最小数を制限します。デフォルトは 1 です。

  • shard_min_doc_count: 各シャードによって返されるアイテム バケット内の対応するドキュメントのヒット数によって満たされなければならないヒットの最小数を制限します. デフォルトは 0 です. min_doc_count 未満である必要があります。推奨値は min_doc_count / フラグメント数です。

  • show_term_doc_count_error: 用語バケット統計のエラー メッセージを表示します。デフォルトは false です。集計によって返された各用語のエラー値を表示するために使用されます。エラー値は、ドキュメント数の最悪のエラーを表します。このエラー値は、shard_size パラメーターの値を決定するときに役立ちます。

  • order: ソート規則を指定します。デフォルトでは、doc_count の逆順でソートされます。

  • missing: 指定されたフィールドの値が存在しない場合、ドキュメントに与えられるデフォルト値。デフォルトでは無視されます。

返される用語バケット数のしきい値を変更します。

PUT _cluster/settings
{
  "transient": {
    "search.max_buckets": 10
  }
}

フライトの目的地が最も多い上位 10 か国を確認してください。

GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10
      }
    }
  }
}

結果の出力は次のとおりです。

{
  "took" : 38,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "DestCountry" : {
      "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
        }
      ]
    }
  }
}

用語バケット集計によって返される doc_count 値は概算です。次の 2 つの指標を使用して、doc_count 値が正確かどうかを判断できます。

  • sum_other_doc_count: クエリ結果に表示されないすべての用語のドキュメントの総数。

  • doc_count_error_upper_bound: クエリ結果に表示されない用語のドキュメントの最大可能数。その値は、すべてのシャードによって返された最後の用語のドキュメント数の合計です。show_term_doc_count_errorパラメータが true に設定されている場合、各タームに対応するドキュメント数のエラーを表示できます。これらのエラーは、集計結果がドキュメント数で降順にソートされている場合にのみカウントされます。さらに、用語値自体、ドキュメント数の昇順、またはサブ集計結果による並べ替えでエラーのカウントに失敗した場合、doc_count_error_upper_bound は -1 を返します。

GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "show_term_doc_count_error": true
      }
    }
  }
}

結果の出力は次のとおりです。

{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "DestCountry" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 3187,
      "buckets" : [
        {
          "key" : "IT",
          "doc_count" : 2371,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "US",
          "doc_count" : 1987,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "CN",
          "doc_count" : 1096,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "CA",
          "doc_count" : 944,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "JP",
          "doc_count" : 774,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "RU",
          "doc_count" : 739,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "CH",
          "doc_count" : 691,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "GB",
          "doc_count" : 449,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "AU",
          "doc_count" : 416,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "PL",
          "doc_count" : 405,
          "doc_count_error_upper_bound" : 0
        }
      ]
    }
  }
}

分類する

デフォルトでは、doc_count の逆順でソートされます。doc_count による昇順の並べ替えや、サブ集計での並べ替えはお勧めしません。これにより、ドキュメント数のカウント エラーが増加します。ただし、単一のシャードまたは集約で使用されるフィールドがインデックス作成時にルーティング キーとして使用される場合は、どちらの場合も当てはまります。

_count: デフォルトのソート方法である、数量でソートします。

_key: 用語で並べ替えます。

_term: 用語で並べ替えます。

ドキュメント数の昇順で並べ替えます。

GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "show_term_doc_count_error": true,
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}

キーのアルファベットの昇順で並べ替えます。

GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "show_term_doc_count_error": true,
        "order": {
          "_key": "asc"
        }
      }
    }
  }
}

フライトが最も短い上位 10 か国を検索します。

GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "order": {
          "min_FlightTimeMin": "desc"
        }
      },
      "aggs": {
        "min_FlightTimeMin": {
          "min": {
            "field": "FlightTimeMin"
          }
        }
      }
    }
  }
}
GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "order": {
          "stats_FlightTimeMin.max": "desc"
        }
      },
      "aggs": {
        "stats_FlightTimeMin": {
          "stats": {
            "field": "FlightTimeMin"
          }
        }
      }
    }
  }
}

期間のネストされたバケット

ネストの深さは 3 レベルを超えないようにすることをお勧めします。

GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "show_term_doc_count_error": true
      },
      "aggs": {
        "OriginCountry": {
          "terms": {
            "field": "OriginCountry",
            "size": 10
          }
        }
      }
    }
  }
}

スクリプト メソッド

GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "script": {
          "source": """
            doc['DestCountry'].value + "-DEMO";
          """,
          "lang": "painless"
        },
        "size": 10
      }
    }
  }
}

結果の出力は次のとおりです。

{
  "took" : 56,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "DestCountry" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 3187,
      "buckets" : [
        {
          "key" : "IT-DEMO",
          "doc_count" : 2371
        },
        {
          "key" : "US-DEMO",
          "doc_count" : 1987
        },
        {
          "key" : "CN-DEMO",
          "doc_count" : 1096
        },
        {
          "key" : "CA-DEMO",
          "doc_count" : 944
        },
        {
          "key" : "JP-DEMO",
          "doc_count" : 774
        },
        {
          "key" : "RU-DEMO",
          "doc_count" : 739
        },
        {
          "key" : "CH-DEMO",
          "doc_count" : 691
        },
        {
          "key" : "GB-DEMO",
          "doc_count" : 449
        },
        {
          "key" : "AU-DEMO",
          "doc_count" : 416
        },
        {
          "key" : "PL-DEMO",
          "doc_count" : 405
        }
      ]
    }
  }
}

用語バケットのキー値フィルタリング

正確なキー値フィルタリングとあいまい一致 (正規表現による) フィルタリングをサポートします。個人的には、Elasticsearch バージョン 7.14 のあいまい一致方式が実際の動作で機能しないことがわかりました。

  • include: 指定された用語バケット値を含めます。
  • exclude: 指定された用語バケット値を含めません。
GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "show_term_doc_count_error": true,
        "include": ["US", "IT", "CN"]
      }
    }
  }
}

結果の出力は次のとおりです。

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "DestCountry" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "IT",
          "doc_count" : 2371,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "US",
          "doc_count" : 1987,
          "doc_count_error_upper_bound" : 0
        },
        {
          "key" : "CN",
          "doc_count" : 1096,
          "doc_count_error_upper_bound" : 0
        }
      ]
    }
  }
}

ターム バケット パーティションの集計

多くの場合、カウントする必要があるバケットが多すぎるため、操作が非常に遅くなります。マージは、パーティション メカニズムを使用してクライアント側で実行できます。可能なすべてのバケットを分割します。

パーティション: パーティション番号。0 から始めます。

num_partitions: パーティションの数。

GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "show_term_doc_count_error": true,
        "include": {
          "partition": 2,
          "num_partitions": 5
        }
      }
    }
  }
}

実際の運用では、パーティションの値を調整するたびに、返されるバケットの数が異なる場合があることがわかりました。たとえば、パーティションが 2 に設定されている場合、結果として 8 個のバケットが返され、パーティションが 1 に設定されている場合、結果として 6 個のバケットが返されます。

期間バケット統計収集モデル

  • collect_mode: 期間バケット統計収集モデル。
    • depth_first: (デフォルト) 深さ優先。バケット化された少量のデータに適しており、バケットは比較的固定されており、10,000 以内が推奨されます。
    • width_first: 幅優先。大量のデータをバケット化するのに適しています。
GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "show_term_doc_count_error": true,
        "collect_mode": "depth_first"
      }
    }
  }
}

用語バケット ストレージの選択

  • execution_hint: ターム バケットの一時保存設定。
    • map: マップ構造を使用します。少数のバケットに適した集計統計。
    • global_ordinals: (デフォルト) グローバル序数構造を使用します。多数のバケットに適した集計統計。
GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 10,
        "show_term_doc_count_error": true,
        "execution_hint": "map"
      }
    }
  }
}

グローバル序数を事前にロードする

Elasticsearch がグローバル序数を使用する場合、最初に doc_values からすべての値を読み取ってグローバル序数を構築する必要があります。クエリの応答が遅くならないように、事前にメモリにロードするように設定できます。

  • eager_global_ordinals: グローバル シリアル番号を事前に読み込んで構築するには、true に設定します。
PUT my-index-000001/_mapping
{
	"properties": {
		"tags": {
			"type": "keyword",
			"eager_global_ordinals": true
		}
	}
}

サブ集計のメトリック集計

サブ集計としての統計メトリック集計。

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "city_name": {
      "terms": {
        "field": "geoip.city_name",
        "size": 10
      },
      "aggs": {
        "taxful_total_price": {
          "stats": {
            "field": "taxful_total_price"
          }
        }
      }
    }
  }
}

サブ集計としての top_hits メトリック集計。

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "aggs_customer_id": {
      "terms": {
        "field": "customer_id",
        "size": 10
      },
      "aggs": {
        "top_hits": {
          "top_hits": {
            "size": 2, 
            "_source": {
              "includes": ["customer_id", "order_date", "products"]
            },
            "sort": [
              {
                "order_date": {
                  "order": "desc"
                }
              }  
            ]
          }
        }
      }
    }
  }
}

サブ集計としての top_metrics メトリック集計。

GET kibana_sample_data_ecommerce/_search
{
  "size": 0, 
  "aggs": {
    "aggs_customer_id": {
      "terms": {
        "field": "customer_id",
        "size": 2
      },
      "aggs": {
        "top_metrics_total_price": {
          "top_metrics": {
            "metrics": {
              "field": "taxful_total_price"
            },
            "sort": {
              "order_date": "desc"
            },
            "size": 1
          }
        }
      }
    }
  }
}

デフォルトでは、テキスト タイプは用語のバケット化をサポートしておらず、エラーが直接報告されます。ただし、テキスト型の fielddata 属性値は変更できます (デフォルトは false)。

fielddata は既定でメモリを使用し、多くのメモリ リソースを消費します。使うか使わないか、キーワード型を使うように営業形態を変えることをお勧めします。

GET kibana_sample_data_flights_3shard/_search
{
    
    
  "size": 0,
  "aggs": {
    
    
    "Dest": {
    
    
      "terms": {
    
    
        "field": "Dest",
        "size": 10
      }
    }
  }
}

出力結果は、 illegal_argument_exception 例外を報告します。

この問題を解決するために。新しいインデックスを作成します。

PUT kibana_sample_data_flights_fielddata
{
    
    
  "mappings": {
    
    
    "properties": {
    
    
      "Dest": {
    
    
        "type": "text",
        "fielddata": true,
        "fields": {
    
    
          "keyword": {
    
    
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}
POST _reindex
{
    
    
  "source": {
    
    
    "index": "kibana_sample_data_flights"
  },
  "dest": {
    
    
    "index": "kibana_sample_data_flights_fielddata"
  }
}

上記のクエリをもう一度実行してみましょう。

GET kibana_sample_data_flights_fielddata/_search
{
    
    
  "size": 0,
  "aggs": {
    
    
    "Dest": {
    
    
      "terms": {
    
    
        "field": "Dest",
        "size": 10
      }
    }
  }
}

出力は次のとおりです。

{
    
    
  "took" : 799,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    
    
    "Dest" : {
    
    
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 22047,
      "buckets" : [
        {
    
    
          "key" : "airport",
          "doc_count" : 12527
        },
        {
    
    
          "key" : "international",
          "doc_count" : 7954
        },
        {
    
    
          "key" : "zurich",
          "doc_count" : 691
        },
        {
    
    
          "key" : "xi'an",
          "doc_count" : 526
        },
        {
    
    
          "key" : "xianyang",
          "doc_count" : 526
        },
        {
    
    
          "key" : "air",
          "doc_count" : 490
        },
        {
    
    
          "key" : "base",
          "doc_count" : 490
        },
        {
    
    
          "key" : "armstrong",
          "doc_count" : 486
        },
        {
    
    
          "key" : "shanghai",
          "doc_count" : 479
        },
        {
    
    
          "key" : "james",
          "doc_count" : 460
        }
      ]
    }
  }
}

レアタームズアグリゲーション

つまり、まれな用語はバケットに集約されます。用語バケット集約が_count順序無制限のエラーがあり、まれな用語バケット集約を使用できます。

breadth_firstドキュメントの数がしきい値に達すると、用語を削除する必要があるため、まれな用語のバケット集約では、幅優先 ( ) モードが使用されます。depth_firstこれはまた、レア タームのバケット集約が深さ優先 ( ) モードの集約と互換性がないことを意味します. たとえば、ネストされた集約のサブ集約として使用される場合、操作の結果として例外がスローされます.

  • field: (必須) 集約されたフィールド。
  • max_doc_count: グループあたりのドキュメントの最大数。デフォルトは 1 です。最大値は 100 です。
  • precision: カッコウ フィルタの精度。値が小さいほど、精度が高くなり、メモリ使用量が高くなります。0.00001 未満にすることはできません。デフォルトは 0.01 です。
  • include: 集計結果に含まれる値。複数指定可能で、正規表現がサポートされています。
  • exclude: 集計結果から除外する必要がある値。複数指定可能で、正規表現がサポートされています。include と exclude を同時に指定すると、exclude が優先されます (つまり、include パラメータが最初に使用され、次に exclude パラメータが使用されます)。
  • missing: ドキュメントに集計用のフィールドがない場合は、指定されたデフォルト値を指定します。
GET kibana_sample_data_flights/_search
{
    
    
  "track_total_hits": true,
  "size": 0,
  "aggs": {
    
    
    "DestCityName": {
    
    
      "rare_terms": {
    
    
        "field": "DestCityName",
        "max_doc_count": 3,
        "precision": 0.001,
        "include": "(A.*|B.*)",
        "exclude": ["Albuquerque", "Baltimore"]
      }
    }
  }
}

出力は次のとおりです。

{
    
    
  "took" : 25,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 13059,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    
    
    "DestCityName" : {
    
    
      "buckets" : [
        {
    
    
          "key" : "Adelaide",
          "doc_count" : 1
        },
        {
    
    
          "key" : "Buffalo",
          "doc_count" : 1
        },
        {
    
    
          "key" : "Abu Dhabi",
          "doc_count" : 2
        },
        {
    
    
          "key" : "Billings",
          "doc_count" : 2
        },
        {
    
    
          "key" : "Amsterdam",
          "doc_count" : 3
        },
        {
    
    
          "key" : "Birmingham",
          "doc_count" : 3
        }
      ]
    }
  }
}

まれな用語のバケット集約によって取得されたバケットの数が多すぎる場合は、search.max_buckets のパラメーター値を変更して制限することができます。デフォルトは 65535 です。

# 临时修改
PUT _cluster/settings
{
    
    
  "transient": {
    
    
    "search.max_buckets": 100
  }
}

# 永久修改
PUT _cluster/settings
{
    
    
  "persistent": {
    
    
    "search.max_buckets": 100
  }
}

multi_terms 集計

つまり、複数期間のバケット集約です。

使用できるパラメータはタームバケット集計と同じなのでここには記載していません。

GET kibana_sample_data_flights/_search
{
    
    
  "track_total_hits": true, 
  "size": 0,
  "aggs": {
    
    
    "DestCountry_OriginCountry": {
    
    
      "multi_terms": {
    
    
        "terms": [
          {
    
    
            "field": "DestCountry"
          },
          {
    
    
            "field": "OriginCountry"
          }
        ]
      }
    }
  }
}

出力は次のとおりです。

{
    
    
  "took" : 71,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 13059,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    
    
    "DestCountry_OriginCountry" : {
    
    
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 10516,
      "buckets" : [
        {
    
    
          "key" : [
            "IT",
            "IT"
          ],
          "key_as_string" : "IT|IT",
          "doc_count" : 459
        },
        {
    
    
          "key" : [
            "IT",
            "US"
          ],
          "key_as_string" : "IT|US",
          "doc_count" : 379
        },
        {
    
    
          "key" : [
            "US",
            "IT"
          ],
          "key_as_string" : "US|IT",
          "doc_count" : 328
        },
        {
    
    
          "key" : [
            "US",
            "US"
          ],
          "key_as_string" : "US|US",
          "doc_count" : 322
        },
        {
    
    
          "key" : [
            "CN",
            "IT"
          ],
          "key_as_string" : "CN|IT",
          "doc_count" : 195
        },
        {
    
    
          "key" : [
            "CA",
            "IT"
          ],
          "key_as_string" : "CA|IT",
          "doc_count" : 192
        },
        {
    
    
          "key" : [
            "IT",
            "JP"
          ],
          "key_as_string" : "IT|JP",
          "doc_count" : 192
        },
        {
    
    
          "key" : [
            "CN",
            "US"
          ],
          "key_as_string" : "CN|US",
          "doc_count" : 185
        },
        {
    
    
          "key" : [
            "CA",
            "US"
          ],
          "key_as_string" : "CA|US",
          "doc_count" : 147
        },
        {
    
    
          "key" : [
            "CH",
            "CH"
          ],
          "key_as_string" : "CH|CH",
          "doc_count" : 144
        }
      ]
    }
  }
}

おすすめ

転載: blog.csdn.net/qq_34561892/article/details/129183161