Tablestore Python SDK を使用して、多次元インデックスの結果でメトリクスの集計とグルーピングを実行します。
前提条件
Tablestore Python SDK をインストールし、クライアントを初期化します。
集約機能には SDK バージョン 5.2.1 以降が必要です。最新の SDK バージョンの使用を推奨します。
説明
集計では、検索インデックスのクエリ結果からメトリクスを計算したり、グループを作成したりします。メトリクス集計オブジェクトを SearchQuery.aggs に、グルーピングオブジェクトを SearchQuery.group_bys に追加します。リクエスト内の各 name は一意である必要があり、対応するレスポンス結果を識別します。集計結果のみを取得するには、limit を 0 に設定します。
|
機能 |
説明 |
|
Min、Max、Sum、Avg |
最小値、最大値、合計、平均を計算します。 |
|
Count、個別カウント |
|
|
パーセンタイル |
1 つ以上のパーセンタイルを計算します。 |
|
TopRows |
各グループ内で上位にソートされた行をサブアグリゲーションとして返します。 |
|
GroupByField、GroupByComposite |
1 つのフィールド値またはフィールドの組み合わせでグループ化します。 |
|
GroupByRange、GroupByGeoDistance、GroupByFilter |
数値範囲、地理的距離、またはフィルター条件でグループ化します。 |
|
GroupByHistogram、GroupByDateHistogram、GroupByGeoGrid |
数値ヒストグラム、日付ヒストグラム、または GeoHash グリッドグループを作成します。 |
アグリゲーションで使用する検索インデックスフィールドでは、ソートとアグリゲーションを有効にする必要があります。サポートされているフィールドタイプは、アグリゲーションとグループ化のタイプによって異なります。同じレベルに最大 5 つのグループ化を設定できます。個別カウント、パーセンタイル、およびフィールドのグループ化では、概算計算を使用します。アグリゲーションの数が多い場合や、アグリゲーションが深くネストされている場合は、リクエストの複雑さとレイテンシーが増加します。
次の例では、 price の最小値、最大値、平均値を計算し、 category ごとに行をグループ化します。
search_query = SearchQuery(
MatchAllQuery(),
limit=0,
aggs=[
Min("price", name="min_price"),
Max("price", name="max_price"),
Avg("price", name="avg_price"),
],
group_bys=[
GroupByField("category", name="by_category"),
],
)
response = client.search(
"example_table",
"example_index",
search_query,
)
for result in response.agg_results:
print(result.name, result.value)
for result in response.group_by_results:
print(result.name, result.items)
パラメーター
検索リクエスト
search メソッドには、次のパラメーターが含まれています。
|
名前 |
タイプ |
説明 |
|
table_name (必須) |
|
データテーブルの名前。 |
|
index_name (必須) |
|
検索インデックスの名前。 |
|
search_query (必須) |
|
クエリ条件と共通のクエリ設定。 |
|
columns_to_get (任意) |
|
返す列の設定。このパラメーターが指定されていない場合、プライマリキー列のみが返されます。 |
|
routing_keys (任意) |
|
カスタムルーティングフィールドのプライマリキー値。カスタムルーティングが設定されていない場合、このパラメーターは不要です。 |
|
timeout_s (任意) |
|
リクエストタイムアウト (秒単位)。このパラメーターが指定されていない場合、クライアントレベルのタイムアウトが使用されます。 |
クエリ設定
search_query は SearchQuery 型で、次の集計関連パラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
query (required) |
|
集計範囲を決定するクエリ条件。すべての行を集計するには、 |
|
aggs (optional) |
|
メトリック集計のリスト。名前が異なる集計を組み合わせることができます。 |
|
group_bys (optional) |
|
グルーピングのリスト。名前が異なるグルーピングを組み合わせることができます。 |
|
limit (optional) |
|
返すクエリ行の数。このパラメーターを |
メトリック集計
次のオブジェクトを search_query.aggs に追加します。 field は集計フィールド、 name は結果を識別し、 missing_value はフィールドが欠損している場合に使用します。 missing_value が指定されていない場合、そのフィールドを持たない行は無視されます。
最小値、最大値、平均値
|
名前 |
タイプ |
説明 |
|
field (必須) |
|
集計フィールド。サポートされるタイプ: |
|
missing_value (任意) |
|
フィールドが欠損している場合に使用する値。 |
|
name (任意) |
|
集計名。デフォルト値: それぞれ |
合計
|
名前 |
タイプ |
説明 |
|
field (必須) |
|
集計フィールド。サポートされるタイプ: |
|
missing_value (任意) |
|
フィールドが欠損している場合に合計に使用する値。 |
|
name (任意) |
|
集計名。デフォルト値: |
カウント
|
名前 |
タイプ |
説明 |
|
field (必須) |
|
空でない行をカウントするためのフィールド。サポートされるタイプ: |
|
name (任意) |
|
集計名。デフォルト値: |
DistinctCount
|
名前 |
タイプ |
説明 |
|
field (必須) |
|
個別の値をカウントするためのフィールド。サポートされるタイプ: |
|
missing_value (任意) |
|
フィールドが欠損している場合に個別カウントに含める値。 |
|
name (任意) |
|
集計名。デフォルト値: |
パーセンタイル
|
名前 |
タイプ |
説明 |
|
field (必須) |
|
集計フィールド。サポートされるタイプ: |
|
percentiles_list (必須) |
|
計算するパーセンタイル。例: |
|
missing_value (任意) |
|
フィールドが欠損している場合に使用する値。 |
|
name (任意) |
|
集計名。デフォルト値: |
TopRows
|
名前 |
タイプ |
説明 |
|
limit (必須) |
|
各グループから返す行の最大数。 |
|
sort (必須) |
|
各グループ内の行のソート順。 |
|
name (任意) |
|
集計名。デフォルト値: |
DistinctCount は近似値です。個別の値の数が 10,000 未満の場合は正確な値に近く、1億個の場合は誤差が約 2% です。 Percentiles も近似値であり、極端なパーセンタイルの近似精度は通常、中央値よりも高くなります。 TopRows は、グループ化のサブ集計としてのみ使用してください。
グルーピング
次のオブジェクトを search_query.group_bys に追加します。sub_aggs と sub_group_bys を使用して、各グループでメトリックのサブ集計とサブグループ化を実行します。
GroupByField
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
グループ化フィールド。サポートされている型: |
|
size (任意) |
|
返すグループ数。デフォルト値: |
|
group_by_sort (任意) |
|
グループの並べ替えルール。デフォルトでは、グループは行数の降順で並べ替えられます。 |
|
sub_aggs (任意) |
|
メトリックのサブ集約。 |
|
sub_group_bys (任意) |
|
サブグルーピング。 |
|
name (任意) |
|
グルーピング名。デフォルト値は |
GroupByComposite
|
名前 |
型 |
説明 |
|
sources (必須) |
|
複数フィールドグルーピングのソース。 |
|
size (任意) |
|
返されるグループ数。デフォルト値: |
|
next_token (任意) |
|
次のグループページ用のトークン。最初のリクエストでは省略します。 |
|
suggested_size (任意) |
|
高スループットコンピューティングシナリオ向けのソフトリミットです。 |
|
sub_aggs (任意) |
|
メトリックのサブ集約。 |
|
sub_group_bys (任意) |
|
サブグループ。 |
|
name (任意) |
|
グルーピング名。デフォルト値: |
GroupByRange
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
グループ化フィールド。サポートされる型は |
|
ranges (必須) |
|
|
|
sub_aggs (任意) |
|
メトリックのサブ集約。 |
|
sub_group_bys (任意) |
|
サブグルーピング。 |
|
name (任意) |
|
グループ化名。デフォルト値: |
GroupByGeoDistance
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
|
|
origin (必須) |
|
中心点。コンストラクターのパラメーターは緯度、経度の順で指定します。 |
|
ranges (必須) |
|
メートル単位の距離範囲。各範囲は左閉右開です。 |
|
sub_aggs (任意) |
|
メトリックのサブ集約。 |
|
sub_group_bys (任意) |
|
サブグルーピング。 |
|
name (任意) |
|
グルーピング名。デフォルト値は |
GroupByFilter
|
名前 |
型 |
説明 |
|
filters (必須) |
|
フィルター条件。結果の順序は条件の順序と一致します。 |
|
sub_aggs (任意) |
|
メトリックのサブ集約。 |
|
sub_group_bys (任意) |
|
サブグルーピング。 |
|
name (任意) |
|
グルーピング名。デフォルト値: |
GroupByHistogram
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
グループ化フィールド。サポートされているタイプは |
|
interval (必須) |
|
数値ヒストグラムの間隔。 |
|
field_range (必須) |
|
集計範囲。 |
|
missing_value (optional) |
|
The value used in the histogram when the field is missing. |
|
min_doc_count (任意) |
|
バケットの最小行数。これより少ない行数のバケットは返されません。 |
|
group_by_sort (任意) |
|
グループのソート規則。 |
|
sub_aggs (任意) |
|
メトリックのサブ集約。 |
|
sub_group_bys (任意) |
|
サブグルーピング。 |
|
name (任意) |
|
グルーピング名。デフォルト値: |
GroupByDateHistogram
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
|
|
interval (必須) |
|
日付または時間間隔は、値と |
|
field_range (必須) |
|
集約範囲。Python コンストラクターでは省略できますが、サーバーではこのパラメーターが必要です。 |
|
missing (任意) |
|
フィールドが欠損している場合にヒストグラムで使用される日付値。 |
|
min_doc_count (任意) |
|
バケットの最小行数。これより少ない行数のバケットは返されません。 |
|
time_zone (任意) |
|
|
|
group_by_sort (任意) |
|
グループのソート規則。 |
|
offset (任意) |
|
デフォルトの起点からのバケット境界のオフセット。 |
|
sub_aggs (任意) |
|
メトリックのサブ集約。 |
|
sub_group_bys (任意) |
|
サブグルーピング。 |
|
name (任意) |
|
グループ化名。デフォルト値: |
GroupByGeoGrid
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
|
|
precision (必須) |
|
GeoHash グリッドの精度。enum の数値が大きいほど、グリッドは小さくなります。 |
|
size (optional) |
|
The number of grid groups to return. |
|
sub_aggs (任意) |
|
メトリックのサブ集約。 |
|
sub_group_bys (任意) |
|
サブグルーピング。 |
|
name (任意) |
|
グルーピング名。デフォルト値: |
GroupByComposite は Tablestore Python 用 SDK 6.4.4 以降が必要です。多くのグループが存在する場合、size を指定し、トークンが空になるまで各結果の next_token を使用してページ分割します。
返す列
columns_to_get は ColumnsToGet タイプで、次のパラメーターを含みます。
|
名前 |
タイプ |
説明 |
|
column_names (任意) |
|
返す属性列の名前です。このパラメーターは、 |
|
return_type (任意) |
|
返す列のモードです。 |
レスポンス
search メソッドは SearchResponse を返します。
|
フィールド |
タイプ |
説明 |
|
rows |
|
クエリによって返される行。行数は |
|
next_token |
|
次のページ用のトークン。空の値は、それ以上データがないことを示します。 |
|
total_count |
|
一致する行の数。この値は |
|
is_all_succeed |
|
すべてのインデックスパーティションがクエリされたかどうかを示します。値が |
|
agg_results |
|
メトリック集計の結果。 |
|
group_by_results |
|
グルーピングの結果。 |
|
search_hits |
|
検索ヒット。行、関連度スコア、ハイライトなどの拡張情報を含みます。 |
agg_results の各項目は、name と value を使い、集計とその値を識別します。group_by_results の各項目は、name と items を持ち、その items フィールドに各グループのグループキー、行数、サブ集計、およびサブグルーピングの結果が格納されます。GroupByComposite の結果には、続きを読み取るために source_group_by_names と next_token も含まれます。各グループの keys は、sources に対応する文字列リストです。欠損しているフィールドの値は None で表されます。
タプル互換のレスポンス
Tablestore SDK for Python 5.2.0 以降では、search API はタプルの代わりにレスポンスオブジェクトを返します。バージョン 5.1.0 以前では、タプルが直接返されます。バージョン 5.2.1 以降では、SearchResponse.v1_response() を呼び出して、以前のバージョンと互換性のあるタプルを取得できます。新しいコードでは、レスポンスフィールドが拡張された場合のアンパックエラーを避けるために、SearchResponse の属性に直接アクセスしてください。
(
rows,
next_token,
total_count,
is_all_succeed,
agg_results,
group_by_results,
search_hits,
) = response.v1_response()
例
複数フィールドグループのページ分割
次の例では、category と price でグループ化し、1 ページあたり 2 つのグループを返します。
sources = [
GroupByField("category", name="category_source"),
GroupByField("price", name="price_source"),
]
next_token = None
all_items = []
while True:
group_by = GroupByComposite(
sources,
size=2,
next_token=next_token,
name="by_category_and_price",
)
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), limit=0, group_bys=[group_by]),
)
result = response.group_by_results[0]
all_items.extend(result.items)
next_token = result.next_token
if not next_token:
break
for item in all_items:
print(item.keys, item.row_count)
日付ヒストグラムと地理グリッドの作成
次の例では、日次の日付ヒストグラムを作成し、位置情報を約 39 km × 19 km の GeoHash グリッドにグループ化します。
group_bys = [
GroupByDateHistogram(
"event_date",
DateTimeValue(1, DateTimeUnit.DAY),
field_range=FieldRange("2026-08-01", "2026-08-04"),
name="by_day",
),
GroupByGeoGrid(
"location",
GeoHashPrecision.GHP_39KM_19KM_4,
name="by_geo_grid",
),
]
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), limit=0, group_bys=group_bys),
)
for result in response.group_by_results:
print(result.name, result.items)