すべてのプロダクト
Search
ドキュメントセンター

Tablestore:Aggregation

最終更新日:Jul 29, 2026

Tablestore SDK for Java を使用して、メトリックの計算や多次元インデックスのクエリ結果のグループ化ができます。これには、ヒストグラム、ネストされたグループ化、グループ内の上位行の使用などが含まれます。

前提条件

Tablestore Java SDK をインストールし、クライアントを初期化します。

仕組み

多次元インデックスのクエリが完了した後、集約はメトリックを計算するか、一致するすべての行をグループ化します。メトリック集約は、フィールドの最小値、最大値、合計、平均値、カウント、個別カウント、またはパーセンタイルを計算します。グループ化は、フィールド値、複数フィールド、数値範囲、地理的距離、フィルター、数値間隔、日付間隔、または地理的グリッドによって行をグループ化します。また、グループ内にメトリック集約やグループ化を追加することもできます。

カテゴリ

構成タイプ

説明

メトリック集約

MinAggregation

フィールドの最小値を返します。SQL の MIN に似ています。

メトリック集約

MaxAggregation

フィールドの最大値を返します。SQL の MAX に似ています。

メトリック集約

SumAggregation

数値フィールドの合計を返します。SQL の SUM に似ています。

メトリック集約

AvgAggregation

フィールドの平均値を返します。SQL の AVG に似ています。

メトリック集約

CountAggregation

指定されたフィールドに値を持つ行の数を返します。SQL の COUNT(field) に似ています。

メトリック集約

DistinctCountAggregation

フィールド内の一意な値の数を返します。SQL の COUNT(DISTINCT field) に似ています。

メトリック集約

PercentilesAggregation

フィールドの 1 つ以上のパーセンタイルを返します。

メトリック集約

TopRowsAggregation

指定された順序に基づいて、各グループの最初の数行を返します。

グループ化

GroupByField

1 つのフィールドの値で行をグループ化します。

グループ化

GroupByComposite

複数のフィールドで行をグループ化し、ページネーショントークンをサポートします。

グループ化

GroupByRange

数値範囲で行をグループ化します。

グループ化

GroupByGeoDistance

中心点からの距離範囲で行をグループ化します。

グループ化

GroupByFilter

複数のフィルターで行をグループ化します。

グループ化

GroupByHistogram

固定の数値間隔を使用してヒストグラムを作成します。

グループ化

GroupByDateHistogram

固定の日付または時間間隔を使用してヒストグラムを作成します。

グループ化

GroupByGeoGrid

GeoHash グリッドで行をグループ化します。

重要
  • 集約で使用される多次元インデックスフィールドに対して、ソートと集約を有効にする必要があります。サポートされるフィールドタイプは集約タイプによって異なります。多次元インデックスのフィールドタイプとデータテーブルのフィールドタイプとのマッピングについては、「データ型」をご参照ください。

  • 集約はクエリに一致した結果に対して操作を行います。集約を含むリクエストは、行をクエリするだけのリクエストよりも複雑です。応答に行が必要ない場合は、limit0 に設定します。

  • 個別カウント、パーセンタイル、フィールドのグループ化では近似計算が使用されます。10,000 未満の個別カウントは正確な値に近くなります。個別カウントが 1 億の場合、誤差は約 2% です。両端に近いパーセンタイルは通常、より正確です。たとえば、P1 と P99 は通常 P50 よりも正確です。フィールドのグループ化の並列計算も、わずかな誤差を生じさせる可能性があります。

  • 複数の集約を組み合わせることができます。多数の集約や深いネストはリクエストの複雑さを増し、レイテンシを増加させる可能性があります。ネストの制限については、「多次元インデックスの制限事項」をご参照ください。

search を呼び出してデータをクエリします。メトリック集約には SearchQuery.aggregationList を、グループ化には SearchQuery.groupByList を構成します。

SearchResponse search(SearchRequest request)

次の例では、多次元インデックス内のすべての行をクエリし、価格の最小値、最大値、合計、平均値、カウント、個別カテゴリ数、および P50 を計算し、カテゴリごとに行をグループ化します。

SearchQuery searchQuery = SearchQuery.newBuilder()
        .query(QueryBuilders.matchAll())
        .limit(0)
        .addAggregation(AggregationBuilders.min("min_price", "price"))
        .addAggregation(AggregationBuilders.max("max_price", "price"))
        .addAggregation(AggregationBuilders.sum("sum_price", "price"))
        .addAggregation(AggregationBuilders.avg("avg_price", "price"))
        .addAggregation(AggregationBuilders.count("price_count", "price"))
        .addAggregation(AggregationBuilders.distinctCount(
                "category_count", "category"))
        .addAggregation(AggregationBuilders.percentiles(
                "price_percentiles", "price")
                .percentiles(Arrays.asList(50.0)))
        .addGroupBy(GroupByBuilders.groupByField(
                "category_group", "category").size(10))
        .build();

SearchRequest request =
        new SearchRequest("example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);

AggregationResults aggregationResults = response.getAggregationResults();
System.out.println(aggregationResults
        .getAsMinAggregationResult("min_price").getValue());
System.out.println(aggregationResults
        .getAsMaxAggregationResult("max_price").getValue());
System.out.println(aggregationResults
        .getAsSumAggregationResult("sum_price").getValue());
System.out.println(aggregationResults
        .getAsAvgAggregationResult("avg_price").getValue());
System.out.println(aggregationResults
        .getAsCountAggregationResult("price_count").getValue());
System.out.println(aggregationResults
        .getAsDistinctCountAggregationResult("category_count").getValue());
System.out.println(aggregationResults
        .getAsPercentilesAggregationResult("price_percentiles")
        .getPercentilesAggregationItems());

GroupByFieldResult groupResult = response.getGroupByResults()
        .getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
        groupResult.getGroupByFieldResultItems()) {
    System.out.println(item.getKey() + ": " + item.getRowCount());
}

パラメーター

クエリリクエスト

request の型は SearchRequest です。次の表に、そのパラメーターを示します。

名前

説明

tableName (必須)

String

データテーブルの名前。

indexName (必須)

String

検索インデックスの名前

searchQuery (必須)

SearchQuery

クエリ条件と集約構成。

columnsToGet (オプション)

SearchRequest.ColumnsToGet

返す列。このパラメーターは、TopRowsAggregation がグループ内の行を返す場合にのみ適用されます。このパラメーターが構成されていない場合、プライマリキー列のみが返されます。

timeoutInMillisecond (オプション)

int

リクエストレベルのクエリタイムアウト (ミリ秒単位)。デフォルト値:-1。これは、個別のクエリタイムアウトが構成されていないことを示します。

routingValues (オプション)

List<PrimaryKey>

カスタムルーティングフィールドのプライマリキー値。カスタムルーティングを使用しない場合は、このパラメーターを構成する必要はありません。

クエリ構成

request.searchQuery の型は SearchQuery です。次の表に、集約に関連するパラメーターを示します。

名前

説明

query (必須)

Query

集約範囲を決定するクエリ条件。多次元インデックス内のすべての行を集約するには、MatchAllQuery を使用します。

aggregationList (オプション)

List<Aggregation>

メトリック集約の構成。このパラメーターと groupByList の少なくとも 1 つを構成します。

groupByList (オプション)

List<GroupBy>

グループ化の構成。このパラメーターと aggregationList の少なくとも 1 つを構成します。

limit (オプション)

Integer

返す行の最大数。デフォルト値:10。集約結果のみが必要な場合は、このパラメーターを 0 に設定します。

offset (オプション)

Integer

クエリを開始する行の位置。デフォルト値:0

sort (オプション)

Sort

クエリ結果のソート順。このパラメーターは、メトリック集約または通常のグループ化の範囲を変更しません。

trackTotalCount (オプション)

int

カウントする一致行の予想最大数。このパラメーターが TRACK_TOTAL_COUNT に設定されている場合、SearchResponse.totalCount からクエリに一致する合計数を取得できます。

filter (オプション)

SearchFilter

query の結果に適用されるフィルター。集約はフィルター処理された結果に対して操作を行います。

メトリック集約

次のパラメーターオブジェクトを request.searchQuery.aggregationList[] に追加します。aggName は対応する結果を識別し、リクエスト内で一意である必要があります。

MinAggregation、MaxAggregation、および AvgAggregation

名前

説明

aggName (必須)

String

集約の名前。

fieldName (必須)

String

集約フィールドの名前。Long、Double、および Date フィールドがサポートされています。

missing (オプション)

ColumnValue

fieldName が欠落している場合に使用される値。このパラメーターが構成されていない場合、フィールドが欠落している行は無視されます。

SumAggregation

名前

説明

aggName (必須)

String

集約の名前。

fieldName (必須)

String

集約フィールドの名前。Long および Double フィールドがサポートされています。

missing (オプション)

ColumnValue

fieldName が欠落している場合に合計で使用される値。このパラメーターが構成されていない場合、フィールドが欠落している行は無視されます。

CountAggregation

名前

説明

aggName (必須)

String

集約の名前。

fieldName (必須)

String

null 以外の値がカウントされるフィールド。Long、Double、Boolean、Keyword、Date、IP、および Geo-point フィールドがサポートされています。スパース列でフィールドを含まない行はカウントされません。

クエリに一致するすべての行をカウントするには、SearchQuerytrackTotalCount を構成し、SearchResponse.totalCount を読み取ります。多次元インデックス内のすべての行をカウントするには、MatchAllQuery を使用します。

DistinctCountAggregation

名前

説明

aggName (必須)

String

集約の名前。

fieldName (必須)

String

一意な値がカウントされるフィールド。Long、Double、Boolean、Keyword、Date、IP、および Geo-point フィールドがサポートされています。

missing (オプション)

ColumnValue

fieldName が欠落している場合に個別カウントに使用される値。このパラメーターが構成されていない場合、フィールドが欠落している行は無視されます。

PercentilesAggregation

名前

説明

aggName (必須)

String

集約の名前。

fieldName (必須)

String

集約フィールドの名前。Long、Double、および Date フィールドがサポートされています。

percentiles (必須)

List<Double>

計算するパーセンタイル。例:25.050.090.099.0

missing (オプション)

ColumnValue

fieldName が欠落している場合にパーセンタイル計算で使用される値。このパラメーターが構成されていない場合、フィールドが欠落している行は無視されます。

TopRowsAggregation

TopRowsAggregation をグループ化のサブ集約として使用します。

名前

説明

aggName (必須)

String

集約の名前。

limit (オプション)

Integer

各グループから返す行の最大数。デフォルト値:1

sort (オプション)

Sort

グループ内の行のソート順。

request.columnsToGet パラメーターは、返される属性列をコントロールします。多次元インデックスから属性列を直接返すには、多次元インデックスを作成するときにフィールドを保存します。列が指定されていない場合、プライマリキーのみが返されます。

グループ化

次のパラメーターオブジェクトを request.searchQuery.groupByList[] に追加します。groupByName は対応する結果を識別し、リクエスト内で一意である必要があります。

GroupByField

名前

説明

groupByName (必須)

String

グループ化の名前。

fieldName (必須)

String

グループ化フィールドの名前。Long、Double、Boolean、Keyword、Date、および IP フィールドがサポートされています。

size (オプション)

Integer

返すグループの数。デフォルト値:10。最大値:2000

minDocCount (オプション)

Long

グループ内の最小行数。行数が少ないグループは返されません。

groupBySorters (オプション)

List<GroupBySorter>

グループのソートルール。デフォルトでは、グループは行数の降順でソートされます。複数のルールは追加された順に有効になります。

subAggregations (オプション)

List<Aggregation>

各グループ内で計算されるメトリック集約。

subGroupBys (オプション)

List<GroupBy>

各親グループ内で適用されるグループ化。

groupBySorters[] は次の値をサポートします。

説明

groupKeySortInAsc

グループをキーの辞書順の昇順でソートします。

groupKeySortInDesc

グループをキーの辞書順の降順でソートします。

rowCountSortInAsc

グループを行数の昇順でソートします。

rowCountSortInDesc

グループを行数の降順でソートします。これがデフォルトです。

subAggSortInAsc

指定されたサブ集約の値の昇順でグループをソートします。

subAggSortInDesc

指定されたサブ集約の値の降順でグループをソートします。

GroupByComposite

名前

説明

groupByName (必須)

String

グループ化の名前。

sources (必須)

List<GroupBy>

複数フィールドのグループ化ソース。最大 32 フィールドがサポートされています。ソースは GroupByFieldGroupByHistogram、または GroupByDateHistogram にすることができます。フィールドソースは、その名前、フィールド、およびソート順を指定できます。数値ヒストグラムソースは間隔も指定でき、日付ヒストグラムソースはさらにタイムゾーンを指定できます。ソースはキーでのみソートできます。デフォルトの順序は降順です。フィールドが欠落している場合、対応するキーは null です。

nextToken (オプション)

String

次のグループページのページネーショントークン。最初のリクエストではこのパラメーターを省略します。応答の nextToken が空でない場合、次のリクエストでその値を変更せずに使用します。

size (オプション)

Integer

返すグループの数。デフォルト値:10。最大値:2000。ほとんどの場合、このパラメーターを使用してグループの数を制限します。

suggestedSize (オプション)

Integer

Spark や Presto などのコンピュートエンジンとの高スループット統合のためのソフトリミット。このパラメーターを -1 またはサーバーの制限より大きい値に設定できます。実際に返される数は min(suggestedSize, サーバー側のグループ制限, 合計グループ数) です。このパラメーターと size を同じリクエストで構成しないでください。

subAggregations (オプション)

List<Aggregation>

サブ集約。

subGroupBys (オプション)

List<GroupBy>

サブグループ化。GroupByComposite 自体はサブグループ化として使用できません。

説明

Tablestore SDK for Java は nextToken を文字列として表します。トークンを永続化または転送する場合、その内容を変更しないでください。

GroupByRange

名前

説明

groupByName (必須)

String

グループ化の名前。

fieldName (必須)

String

グループ化フィールドの名前。Long および Double フィールドがサポートされています。

ranges (必須)

List<Range>

範囲。各範囲は左閉じ右開きです:[from, to)Double.MIN_VALUEDouble.MAX_VALUE を境界として使用できます。

subAggregations (オプション)

List<Aggregation>

サブ集約。

subGroupBys (オプション)

List<GroupBy>

サブグループ化。

GroupByGeoDistance

名前

説明

groupByName (必須)

String

グループ化の名前。

fieldName (必須)

String

グループ化フィールドの名前。Geo-point フィールドのみがサポートされています。

origin (必須)

GeoPoint

中心点。コンストラクターのパラメーターは緯度、経度の順です。緯度の範囲は [-90,+90]、経度の範囲は [-180,+180] です。

ranges (必須)

List<Range>

距離範囲 (メートル単位)。各範囲は左閉じ右開きです:[from, to)

subAggregations (オプション)

List<Aggregation>

サブ集約。

subGroupBys (オプション)

List<GroupBy>

サブグループ化。

GroupByFilter

名前

説明

groupByName (必須)

String

グループ化の名前。

filters (必須)

List<Query>

フィルター。結果はフィルターが追加された順に返されます。

subAggregations (オプション)

List<Aggregation>

サブ集約。

subGroupBys (オプション)

List<GroupBy>

サブグループ化。

GroupByHistogram

名前

説明

groupByName (必須)

String

グループ化の名前。

fieldName (必須)

String

グループ化フィールドの名前。Long および Double フィールドがサポートされています。

interval (必須)

ColumnValue

ヒストグラムの間隔。

fieldRange (オプション)

FieldRange

集約範囲。minmax を含みます。(max-min)/interval の値は 2000 を超えることはできません。

offset (オプション)

ColumnValue

デフォルトの開始点からのバケット境界のオフセット。

minDocCount (オプション)

Long

バケット内の最小行数。行数が少ないバケットは返されません。

missing (オプション)

ColumnValue

fieldName が欠落している場合にヒストグラムで使用される値。このパラメーターが構成されていない場合、フィールドが欠落している行は無視されます。

groupBySorters (オプション)

List<GroupBySorter>

バケットのソートルール。

subAggregations (オプション)

List<Aggregation>

サブ集約。

subGroupBys (オプション)

List<GroupBy>

サブグループ化。

GroupByDateHistogram

重要

日付ヒストグラム集約は、Tablestore SDK for Java 5.16.1 以降でサポートされています。多次元インデックスの Date フィールドタイプは、Tablestore SDK for Java 5.13.9 以降でサポートされています。バージョン情報については、「Tablestore SDK for Java のバージョン履歴」をご参照ください。

名前

説明

groupByName (必須)

String

グループ化の名前。

fieldName (必須)

String

グループ化フィールドの名前。Date フィールドのみがサポートされています。

interval (必須)

DateTimeValue

日付または時間の間隔。値と DateTimeUnit で構成されます。

fieldRange (オプション)

FieldRange

集約範囲。minmax を含みます。(max-min)/interval の値は 2000 を超えることはできません。

minDocCount (オプション)

Long

バケット内の最小行数。行数が少ないバケットは返されません。

missing (オプション)

ColumnValue

fieldName が欠落している場合にヒストグラムで使用される日付値。このパラメーターが構成されていない場合、フィールドが欠落している行は無視されます。

timeZone (オプション)

String

+hh:mm または -hh:mm 形式のタイムゾーン。例:+08:00。Date フィールドの形式にタイムゾーン情報が含まれていない場合、集約結果の時刻オフセットを防ぐためにこのパラメーターを構成します。

groupBySorters (オプション)

List<GroupBySorter>

バケットのソートルール。

subAggregations (オプション)

List<Aggregation>

サブ集約。

subGroupBys (オプション)

List<GroupBy>

サブグループ化。

GroupByGeoGrid

名前

説明

groupByName (必須)

String

グループ化の名前。

fieldName (必須)

String

グループ化フィールドの名前。Geo-point フィールドのみがサポートされています。

precision (必須)

GeoHashPrecision

GeoHash グリッドの精度。値の範囲は、約 5,009 km × 4,992 km の GHP_5009KM_4992KM_1 から、約 37 mm × 19 mm の GHP_37MM_19MM_12 までです。末尾の数字が大きいほど、グリッドは小さくなります。

size (オプション)

Integer

返すグリッドグループの数。

subAggregations (オプション)

List<Aggregation>

サブ集約。

subGroupBys (オプション)

List<GroupBy>

サブグループ化。

応答

search メソッドは SearchResponse を返します。次の表に、集約に関連するフィールドを示します。

名前

説明

aggregationResults

AggregationResults

メトリック集約の結果。getAggregationResults() を呼び出して値を取得し、集約名を使用して特定の型の結果を取得します。

groupByResults

GroupByResults

グループ化の結果。getGroupByResults() を呼び出して値を取得し、グループ化名を使用して特定の型の結果を取得します。

totalCount

long

クエリに一致した数。getTotalCount() を呼び出して値を取得します。値は trackTotalCount に依存します。

isAllSuccess

boolean

すべてのインデックスパーティションがクエリされたかどうかを示します。isAllSuccess() を呼び出して値を取得します。このフィールドが false の場合、集約結果が不完全である可能性があります。

メトリック集約の結果

構成タイプ

結果の型

結果フィールドとアクセサー

MinAggregation

MinAggregationResult

valuedouble です。getAsMinAggregationResult(aggName).getValue() を呼び出します。

MaxAggregation

MaxAggregationResult

valuedouble です。getAsMaxAggregationResult(aggName).getValue() を呼び出します。

SumAggregation

SumAggregationResult

valuedouble です。getAsSumAggregationResult(aggName).getValue() を呼び出します。

AvgAggregation

AvgAggregationResult

valuedouble です。getAsAvgAggregationResult(aggName).getValue() を呼び出します。

CountAggregation

CountAggregationResult

valuelong です。getAsCountAggregationResult(aggName).getValue() を呼び出します。

DistinctCountAggregation

DistinctCountAggregationResult

valuelong です。getAsDistinctCountAggregationResult(aggName).getValue() を呼び出します。

PercentilesAggregation

PercentilesAggregationResult

percentilesAggregationItemsList<PercentilesAggregationItem> です。getAsPercentilesAggregationResult(aggName).getPercentilesAggregationItems() を呼び出します。各項目には keyvalue が含まれます。

TopRowsAggregation

TopRowsAggregationResult

rowsList<Row> です。getAsTopRowsAggregationResult(aggName).getRows() を呼び出します。

グループ化の結果

構成タイプ

結果の型

コア結果フィールド

GroupByField

GroupByFieldResult

groupByFieldResultItems。各項目には keyrowCountsubAggregationResults、および subGroupByResults が含まれます。

GroupByComposite

GroupByCompositeResult

sourceNamesgroupByCompositeResultItems、および nextToken。各項目の keys の位置は sourceNames に対応します。

GroupByRange

GroupByRangeResult

groupByRangeResultItems。各項目には fromto、および rowCount が含まれます。

GroupByGeoDistance

GroupByGeoDistanceResult

groupByGeoDistanceResultItems。各項目には距離の fromto、および rowCount が含まれます。

GroupByFilter

GroupByFilterResult

groupByFilterResultItems。各項目には rowCount が含まれ、項目の順序はフィルターの順序と一致します。

GroupByHistogram

GroupByHistogramResult

groupByHistogramItems。各項目にはバケットの開始 key と行数 value が含まれます。

GroupByDateHistogram

GroupByDateHistogramResult

groupByDateHistogramItems。各項目にはミリ秒単位のタイムスタンプ timestamprowCount が含まれます。

GroupByGeoGrid

GroupByGeoGridResult

groupByGeoGridResultItems。各項目には GeoHash key、左上と右下の座標を持つ geoGrid、および rowCount が含まれます。

サブ集約とサブグループ化の使用

次の例では、カテゴリごとに行をグループ化し、各カテゴリの最高価格を計算し、その後、各カテゴリの行を都市ごとにグループ化します。グループのソートルールは追加された順に有効になります。

SearchQuery searchQuery = SearchQuery.newBuilder()
        .query(QueryBuilders.matchAll())
        .limit(0)
        .addGroupBy(GroupByBuilders.groupByField(
                "category_group", "category")
                .size(10)
                .addGroupBySorter(GroupBySorter.groupKeySortInAsc())
                .addSubAggregation(AggregationBuilders.max(
                        "max_price", "price"))
                .addSubGroupBy(GroupByBuilders.groupByField(
                        "city_group", "city").size(10)))
        .build();

SearchRequest request =
        new SearchRequest("example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);

GroupByFieldResult result = response.getGroupByResults()
        .getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
        result.getGroupByFieldResultItems()) {
    double maxPrice = item.getSubAggregationResults()
            .getAsMaxAggregationResult("max_price")
            .getValue();
    GroupByFieldResult cityResult = item.getSubGroupByResults()
            .getAsGroupByFieldResult("city_group");
    System.out.println(item.getKey() + ": " + maxPrice);
    System.out.println(cityResult.getGroupByFieldResultItems());
}

複数フィールドのグループ化のページネーション

GroupByComposite は、複数列のキーをフラットな構造で返し、nextToken によるページネーションをサポートします。

GroupByComposite.Builder compositeBuilder = GroupByBuilders
        .groupByComposite("category_city_group")
        .addSources(GroupByBuilders.groupByField(
                "category", "category")
                .addGroupBySorter(GroupBySorter.groupKeySortInAsc()))
        .addSources(GroupByBuilders.groupByField(
                "city", "city")
                .addGroupBySorter(GroupBySorter.groupKeySortInAsc()))
        .size(100);

String nextToken = null;
do {
    GroupByComposite groupBy = nextToken == null
            ? compositeBuilder.build()
            : compositeBuilder.nextToken(nextToken).build();
    SearchQuery searchQuery = SearchQuery.newBuilder()
            .query(QueryBuilders.matchAll())
            .limit(0)
            .addGroupBy(groupBy)
            .build();
    SearchRequest request = new SearchRequest(
            "example_table", "example_index", searchQuery);
    SearchResponse response = client.search(request);

    GroupByCompositeResult result = response.getGroupByResults()
            .getAsGroupByCompositeResult("category_city_group");
    for (GroupByCompositeResultItem item :
            result.getGroupByCompositeResultItems()) {
        System.out.println(item.getKeys() + ": " + item.getRowCount());
    }
    nextToken = result.getNextToken();
} while (nextToken != null);

範囲、距離、フィルターによるグループ化

次のコードは、3 種類のグループ化のコア構成を示しています。これらを同じ SearchQuery で組み合わせることができます。

GroupByRange priceRanges = GroupByBuilders
        .groupByRange("price_ranges", "price")
        .addRange(0, 100)
        .addRange(100, 500)
        .build();

GroupByGeoDistance distanceRanges = GroupByBuilders
        .groupByGeoDistance("distance_ranges", "location")
        .origin(30.2741, 120.1551)
        .addRange(0, 10000)
        .addRange(10000, 100000)
        .build();

GroupByFilter categoryFilters = GroupByBuilders
        .groupByFilter("category_filters")
        .addFilter(QueryBuilders.term("category", "books"))
        .addFilter(QueryBuilders.term("category", "games"))
        .build();

数値および日付ヒストグラムの作成

次の例では、20 の数値間隔と 1 か月の日付間隔で行をグループ化します。

GroupByHistogram priceHistogram = GroupByBuilders
        .groupByHistogram("price_histogram", "price")
        .interval(20)
        .offset(0)
        .minDocCount(1L)
        .addFieldRange(0, 100)
        .addGroupBySorter(GroupBySorter.groupKeySortInAsc())
        .build();

GroupByDateHistogram dateHistogram = GroupByBuilders
        .groupByDateHistogram("date_histogram", "event_date")
        .interval(1, DateTimeUnit.MONTH)
        .fieldRange("2026-01-01", "2026-06-01")
        .timeZone("+08:00")
        .minDocCount(1L)
        .addGroupBySorter(GroupBySorter.groupKeySortInAsc())
        .build();

SearchQuery searchQuery = SearchQuery.newBuilder()
        .query(QueryBuilders.matchAll())
        .limit(0)
        .addGroupBy(priceHistogram)
        .addGroupBy(dateHistogram)
        .build();
SearchResponse response = client.search(new SearchRequest(
        "example_table", "example_index", searchQuery));

地理的グリッドによるグループ化

次の例では、地理的フィールドを約 39 km × 19 km の GeoHash グリッドにグループ化します。

SearchQuery searchQuery = SearchQuery.newBuilder()
        .query(QueryBuilders.matchAll())
        .limit(0)
        .addGroupBy(GroupByBuilders.groupByGeoGrid(
                "geo_grid", "location")
                .precision(GeoHashPrecision.GHP_39KM_19KM_4)
                .size(100))
        .build();

SearchResponse response = client.search(new SearchRequest(
        "example_table", "example_index", searchQuery));
GroupByGeoGridResult result = response.getGroupByResults()
        .getAsGroupByGeoGridResult("geo_grid");
System.out.println(result.getGroupByGeoGridResultItems());

グループからの行の返却

次の例では、カテゴリごとに行をグループ化し、各カテゴリで最も価格の高い行を返します。

SearchQuery searchQuery = SearchQuery.newBuilder()
        .query(QueryBuilders.matchAll())
        .limit(0)
        .addGroupBy(GroupByBuilders.groupByField(
                "category_group", "category")
                .size(10)
                .addSubAggregation(AggregationBuilders.topRows(
                        "top_price")
                        .limit(1)
                        .sort(new Sort(Arrays.asList(
                                new FieldSort(
                                        "price", SortOrder.DESC))))))
        .build();

SearchRequest.ColumnsToGet columnsToGet =
        new SearchRequest.ColumnsToGet();
columnsToGet.setColumns(Arrays.asList("category", "price"));

SearchRequest request =
        new SearchRequest("example_table", "example_index", searchQuery);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);

GroupByFieldResult result = response.getGroupByResults()
        .getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
        result.getGroupByFieldResultItems()) {
    List<Row> rows = item.getSubAggregationResults()
            .getAsTopRowsAggregationResult("top_price")
            .getRows();
    System.out.println(item.getKey() + ": " + rows);
}

複数フィールドのグループ化の比較

複数のフィールドでグループ化するには、複数の GroupByField 構成をネストするか、GroupByComposite を直接使用します。ページネーションの要件、応答構造、およびソートルールに基づいて選択します。

項目

ネストされたフィールドのグループ化

複合グループ化

構成

親の GroupByFieldsubGroupBys を追加します。

GroupByComposite.sources に複数のグループ化ソースを追加します。

グループ数

各レベルで最大 2,000 グループ。

ページごとに最大 2,000 グループ。

フィールド数

最大 3 つのネストレベル。

最大 32 フィールド。

応答構造

親と子のレベルでネストされます。

複数列のキーはフラットなリストとして返されます。

ページネーション

サポートされていません。

nextToken によってサポートされます。

ソート

グループキー、行数、またはサブ集約の値によるソートをサポートします。

各グループ化ソースは、キーによる辞書順のソートのみをサポートします。デフォルトの順序は降順です。

サブ集約

サポートされています。

サポートされています。

Date フィールドの互換性

グループキーは、フィールドに定義された日付形式を使用します。

日付グループキーはタイムスタンプ文字列として返されます。