Tablestore SDK for Go を使用して、メトリクスを計算するか、検索インデックスのクエリ結果をグループ化します。
前提条件
Tablestore Go SDK をインストールし、クライアントを初期化します。
説明
アグリゲーションは、クエリ結果の平均値、最大値、最小値、合計、カウント、個別カウント、パーセンタイル、または上位行を算出します。また、結果をフィールド、範囲、日付、地理的位置、フィルター、または複合キーでグループ化することもできます。メトリクスアグリゲーション、またはフィールド、範囲、もしくはヒストグラムに基づくグループ化で使用するフィールドは、ソートとアグリゲーションを有効にする必要があります。GroupByFilter のフィルターは、対応するクエリタイプのフィールド要件に従います。
個別カウントやパーセンタイル、フィールド値のグループ化では、近似計算を使用します。個別カウントが 10,000 未満の場合は正確な値に近く、1 億では誤差は約 2%です。P1 や P99 など両端に近いパーセンタイルは、通常 P50 よりも精度が高くなります。フィールド値のグループ化は並列で計算されるため、小さな誤差が生じる場合があります。
複数のアグリゲーションを組み合わせることができます。アグリゲーションの数が多い、またはネストが深い場合、リクエストの複雑さが増し、レスポンスレイテンシーが増加します。ネストの制限については、「検索インデックスの制限」をご参照ください。
次の例では、検索インデックス内のすべてのデータをクエリし、price の最小値、最大値、合計、平均値、非 NULL のカウント、category の個別カウント、price の P50 パーセンタイルを算出し、データを category でグループ化します。
searchQuery := search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(0).
Aggregation(
search.NewMinAggregation("min_price", "price"),
search.NewMaxAggregation("max_price", "price"),
search.NewSumAggregation("sum_price", "price"),
search.NewAvgAggregation("avg_price", "price"),
search.NewCountAggregation("price_count", "price"),
search.NewDistinctCountAggregation("category_count", "category"),
search.NewPercentilesAggregation("price_percentiles", "price").
SetPercents([]float64{50}),
).
GroupBy(search.NewGroupByField("category_group", "category").Size(10))
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
})
if err != nil {
log.Fatal(err)
}
minResult, err := response.AggregationResults.Min("min_price")
if err != nil {
log.Fatal(err)
}
maxResult, err := response.AggregationResults.Max("max_price")
if err != nil {
log.Fatal(err)
}
sumResult, err := response.AggregationResults.Sum("sum_price")
if err != nil {
log.Fatal(err)
}
avg, err := response.AggregationResults.Avg("avg_price")
if err != nil {
log.Fatal(err)
}
countResult, err := response.AggregationResults.Count("price_count")
if err != nil {
log.Fatal(err)
}
distinctResult, err := response.AggregationResults.DistinctCount("category_count")
if err != nil {
log.Fatal(err)
}
percentilesResult, err := response.AggregationResults.Percentiles("price_percentiles")
if err != nil {
log.Fatal(err)
}
groups, err := response.GroupByResults.GroupByField("category_group")
if err != nil {
log.Fatal(err)
}
fmt.Println(minResult.Value, maxResult.Value, sumResult.Value)
fmt.Println(avg.Value)
fmt.Println(countResult.Value, distinctResult.Value)
fmt.Println(percentilesResult.PercentilesAggregationItems)
fmt.Println(groups.Items)
パラメーター
クエリリクエスト
|
名前 |
タイプ |
説明 |
|
TableName (必須) |
文字列 |
データテーブルの名前。 |
|
IndexName (必須) |
文字列 |
多次元インデックスの名前。 |
|
SearchQuery (必須) |
search.SearchQuery |
クエリ条件、メトリック集計、およびグループ化設定。 |
|
ColumnsToGet (任意) |
*tablestore.ColumnsToGet |
返す列の設定。このパラメーターは、TopRowsAggregation がグループ内の行を返す場合にのみ有効です。省略した場合、プライマリキー列のみが返されます。 |
|
RoutingValues (任意) |
[]*tablestore.PrimaryKey |
カスタムルーティングフィールドのプライマリキー値。カスタムルーティングが設定されていない場合は、このパラメーターを省略してください。 |
|
TimeoutMs (任意) |
*int32 |
リクエストタイムアウト期間 (ミリ秒単位)。 |
クエリ設定
|
名前 |
タイプ |
説明 |
|
SetQuery (必須) |
search.Query |
クエリ条件を指定します。 |
|
SetOffset (任意) |
int32 |
開始位置を指定します。デフォルト値: 0。オフセットベースのページネーションでは、Offset + Limit は 100,000 を超えることはできません。 |
|
SetLimit (任意) |
int32 |
返される行の最大数を指定します。デフォルト値: 10。最大値: 100。値を 0 にすると、行は返されません。 |
|
SetCollapse (任意) |
*search.Collapse |
クエリ結果を折りたたみます。詳細については、「クエリ結果の折りたたみ」をご参照ください。 |
|
SetSort (任意) |
*search.Sort |
結果のソート順序を指定します。詳細については、「結果のソートとページネーション」をご参照ください。 |
|
SetGetTotalCount (任意) |
bool |
一致したすべての行をカウントするかどうかを指定します。デフォルト値: false。 |
|
SetToken (任意) |
[]byte |
前回のレスポンスで返された NextToken 値を指定します。このメソッドは、トークンに前ページのソート条件が含まれているため、Sort をクリアします。トークンベースのページネーションを使用する場合は、Offset を指定しないでください。 |
|
SetSearchFilter (任意) |
*search.SearchFilter |
ポストクエリフィルターを適用します。詳細については、「ポストクエリフィルターの使用」をご参照ください。 |
|
Aggregation (任意) |
...search.Aggregation |
集計を設定します。詳細については、「集計」をご参照ください。 |
|
GroupBy (任意) |
...search.GroupBy |
グループ化を設定します。詳細については、「集計」をご参照ください。 |
メトリック集計
|
名前 |
型 |
説明 |
|
AvgAggregation (任意) |
search.AvgAggregation |
平均を計算します。 |
|
MaxAggregation (任意) |
search.MaxAggregation |
最大値を計算します。 |
|
MinAggregation (任意) |
search.MinAggregation |
最小値を計算します。 |
|
SumAggregation (任意) |
search.SumAggregation |
合計を計算します。 |
|
CountAggregation (任意) |
search.CountAggregation |
NULL 以外の値をカウントします。 |
|
DistinctCountAggregation (任意) |
search.DistinctCountAggregation |
個別値をカウントします。 |
|
PercentilesAggregation (任意) |
search.PercentilesAggregation |
パーセンタイルを計算します。 |
|
TopRowsAggregation (任意) |
search.TopRowsAggregation |
グループ内の上位の行を返します。 |
MinAggregation、MaxAggregation、AvgAggregation、SumAggregation
|
名前 |
型 |
説明 |
|
AggName (必須) |
string |
結果を識別するための集計名です。 |
|
Field (必須) |
string |
集計フィールド。 Min、Max、Avg は Long、Double、Date フィールドをサポートします。 Sum は Long と Double フィールドをサポートします。 |
|
MissingValue (任意) |
interface{} |
フィールドが欠損している場合に使用される代替値。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。 |
CountAggregation と DistinctCountAggregation
|
名前 |
型 |
説明 |
|
AggName (必須) |
string |
集計名。 |
|
Field (必須) |
string |
カウントするフィールド。 Long、Double、Boolean、Keyword、Date、IP、地理ポイントの各フィールドがサポートされています。フィールドが欠損している行はカウントに含まれません。 |
|
MissingValue (任意) |
interface{} |
DistinctCountAggregation でのみサポートされています。フィールドが欠損している場合、この値が個別値のカウントに使用されます。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。 |
CountAggregation は、指定されたフィールドが NULL でない行をカウントし、スパースな列に適しています。クエリに一致するすべての行をカウントするには、 SetGetTotalCount(true) を呼び出し、 SearchResponse.TotalCount を読み取ります。多次元インデックス内のすべての行をカウントするには、 MatchAllQuery をクエリ条件として使用します。
PercentilesAggregation
PercentilesAggregation は、 Tablestore SDK for Go 1.7.0 以降でサポートされています。
|
名前 |
型 |
説明 |
|
AggName (必須) |
string |
集計名。 |
|
Field (必須) |
string |
集計フィールド。 Long、Double、Date フィールドがサポートされています。 |
|
Percents (必須) |
[]float64 |
計算するパーセンタイル (25、50、90、99 など) 。 |
|
MissingValue (任意) |
interface{} |
フィールドが欠損している場合に使用される代替値。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。 |
TopRowsAggregation
グループのサブ集計として TopRowsAggregation を使用します。この機能は、 Tablestore SDK for Go 1.7.0 以降でサポートされています。
|
名前 |
型 |
説明 |
AggName (必須) |
string |
集計名。 |
|
Limit (任意) |
*int32 |
各グループ内で返される行の最大数。デフォルト値: 1。 |
|
Sort (任意) |
*search.Sort |
返される行のソート順。 |
SearchRequest.ColumnsToGet は、どの属性列を返すかを制御します。多次元インデックスから属性列を直接返すには、インデックスを作成するときに対応するフィールドを格納します。返す列が指定されていない場合、プライマリキー列のみが返されます。
グルーピング
|
名前 |
タイプ |
説明 |
|
GroupByField (任意) |
search.GroupByField |
フィールド値でグループ化します。 |
|
GroupByRange (任意) |
search.GroupByRange |
数値範囲でグループ化します。 |
|
GroupByGeoDistance (任意) |
search.GroupByGeoDistance |
地理的距離でグループ化します。 |
|
GroupByFilter (任意) |
search.GroupByFilter |
フィルターでグループ化します。 |
|
GroupByHistogram (任意) |
search.GroupByHistogram |
固定数値間隔でグループ化します。 |
|
GroupByDateHistogram (任意) |
search.GroupByDateHistogram |
日付または時間間隔でグループ化します。 |
|
GroupByGeoGrid (任意) |
search.GroupByGeoGrid |
GeoHash グリッドでグループ化します。 |
|
GroupByComposite (任意) |
search.GroupByComposite |
複数フィールドの複合キーでグループ化し、ページネーションをサポートします。 |
GroupByField
|
名前 |
タイプ |
説明 |
|
AggName (必須) |
文字列 |
グループ名。 |
|
Field (必須) |
文字列 |
グループフィールド。Long、Double、ブール値、キーワード、Date、および IP フィールドがサポートされています。 |
|
Sz (任意) |
*int32 |
返されるグループの数。デフォルト値:10。最大値:2,000。 |
|
Sorters (任意) |
[]search.GroupBySorter |
グループのソート順序。複数のソーターはリスト順に適用されます。デフォルトでは、グループは行数の降順でソートされます。 |
|
SubAggList (任意) |
[]search.Aggregation |
サブアグリゲーション。 |
|
SubGroupByList (任意) |
[]search.GroupBy |
サブグループ。 |
グループのソート
次のグループソートタイプがサポートされています。
GroupKeyGroupBySort:グループキーを辞書順の昇順または降順でソートします。RowCountGroupBySort:グループの行数を昇順または降順でソートします。行数の降順がデフォルトです。SubAggGroupBySort:指定されたサブアグリゲーションの結果を昇順または降順でソートします。
GroupByRange
|
名前 |
タイプ |
説明 |
|
AggName (必須) |
文字列 |
グループ名。 |
|
Field (必須) |
文字列 |
グループフィールド。Long および Double フィールドがサポートされています。 |
|
RangeList (必須) |
[]search.Range |
左閉右開のグループ範囲。境界には search.NegInf および search.Inf を使用できます。 |
|
SubAggList (任意) |
[]search.Aggregation |
サブアグリゲーション。 |
|
SubGroupByList (任意) |
[]search.GroupBy |
サブグループ。 |
GroupByGeoDistance
|
名前 |
タイプ |
説明 |
|
AggName (必須) |
文字列 |
グループ名。 |
|
Field (必須) |
文字列 |
グループフィールド。ジオポイントフィールドのみがサポートされています。 |
|
Origin (必須) |
search.GeoPoint |
緯度経度順の中心座標。緯度の範囲は -90 から +90、経度の範囲は -180 から +180 です。 |
|
RangeList (必須) |
[]search.Range |
左閉右開の距離範囲 (メートル単位)。境界には search.NegInf および search.Inf を使用できます。 |
|
SubAggList (任意) |
[]search.Aggregation |
サブアグリゲーション。 |
|
SubGroupByList (任意) |
[]search.GroupBy |
サブグループ。 |
GroupByFilter
|
名前 |
タイプ |
説明 |
|
AggName (必須) |
文字列 |
グループ名。 |
|
Queries (必須) |
[]search.Query |
フィルター。結果の順序はクエリ条件の順序と一致します。 |
|
SubAggList (任意) |
[]search.Aggregation |
サブアグリゲーション。 |
|
SubGroupByList (任意) |
[]search.GroupBy |
サブグループ。 |
GroupByHistogram
|
名前 |
タイプ |
説明 |
|
GroupByName (必須) |
文字列 |
グループ名。 |
|
Field (必須) |
文字列 |
グループフィールド。Long および Double フィールドがサポートされています。 |
|
Interval (必須) |
interface{} |
数値グループ間隔。 |
|
FieldRange (任意) |
model.FieldRange |
グルーピングに含まれるフィールド値範囲。設定する場合、(Max - Min) / Interval は 2,000 を超えることはできません。 |
|
Missing (任意) |
interface{} |
フィールドが欠損している場合に使用されるグループ値です。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。 |
|
MinDocCount (任意) |
*int64 |
グループが返されるために必要な最小行数です。 |
|
Sorters (任意) |
[]search.GroupBySorter |
グループのソート順序。 |
|
SubAggList (任意) |
[]search.Aggregation |
サブアグリゲーション。 |
|
SubGroupByList (任意) |
[]search.GroupBy |
サブグループ。 |
GroupByDateHistogram
GroupByDateHistogram は、Tablestore SDK for Go 1.7.10 以降でサポートされています。
|
名前 |
タイプ |
説明 |
|
GroupByName (必須) |
文字列 |
グループ名。 |
|
Field (必須) |
文字列 |
グループフィールド。Date フィールドのみがサポートされています。 |
|
Interval (必須) |
model.DateTimeValue |
日付または時間間隔。値と時間単位で構成されています。 |
|
FieldRange (任意) |
model.FieldRange |
グルーピングに含まれるフィールド値範囲。設定する場合、(Max - Min) / Interval は 2,000 を超えることはできません。 |
|
Missing (任意) |
interface{} |
フィールドが欠損している場合に使用される日付グループ値です。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。 |
|
MinDocCount (任意) |
*int64 |
グループが返されるために必要な最小行数です。 |
|
TimeZone (任意) |
*string |
+hh:mm または -hh:mm の形式を使用します (例:+08:00)。Date フィールドの形式にタイムゾーンが含まれていない場合は、集約結果の時間オフセットを避けるためにこのパラメーターを設定します。 |
|
Sorters (任意) |
[]search.GroupBySorter |
グループのソート順序。 |
|
SubAggList (任意) |
[]search.Aggregation |
サブアグリゲーション。 |
|
SubGroupByList (任意) |
[]search.GroupBy |
サブグループ。 |
GroupByGeoGrid
GroupByGeoGrid は、Tablestore SDK for Go 1.7.12 以降でサポートされています。
|
名前 |
タイプ |
説明 |
|
GroupByName (必須) |
文字列 |
グループ名。 |
|
Field (必須) |
文字列 |
ジオポイントフィールド。 |
|
Precision (必須) |
model.GeoHashPrecision |
GeoHash グリッドの精度。列挙序数が大きいほど、グリッドが小さくなります。 |
|
Size (必須) |
int64 |
返されるグリッドグループの数。 |
|
SubAggList (任意) |
[]search.Aggregation |
サブアグリゲーション。 |
|
SubGroupByList (任意) |
[]search.GroupBy |
サブグループ。 |
GroupByComposite
GroupByComposite は、Tablestore SDK for Go 1.7.15 以降でサポートされています。
|
名前 |
タイプ |
説明 |
|
GroupByName (必須) |
文字列 |
グループ名。 |
|
SourceGroupByList (必須) |
[]search.GroupBy |
複合グループのソース。最大 32 フィールドがサポートされています。有効なソースタイプは、GroupByField、GroupByHistogram、および GroupByDateHistogram です。GroupByField ソースは、その名前、フィールド、およびソーターのみを使用します。GroupByHistogram ソースは、その名前、フィールド、間隔、およびソーターのみを使用します。GroupByDateHistogram ソースは TimeZone も使用できます。ソースはグループキーのソートのみをサポートし、デフォルトで降順です。フィールド値が存在しない場合、対応するキーは null になります。 |
|
Size (任意) |
*int32 |
返される複合キーの数。デフォルト値:10。最大値:2,000。SuggestedSize と同時に指定しないでください。 |
|
SuggestedSize (任意) |
*int32 |
Spark や Presto などの高スループットシナリオ用のソフトリミット。-1 またはサーバー制限を超える値を指定できます。実際に返される数は min(SuggestedSize、サーバーグループ制限、合計グループ数) です。Size と同時に指定しないでください。 |
|
NextToken (任意) |
*string |
前回のグループ化の結果で返されたページネーショントークンです。 |
|
SubAggList (任意) |
[]search.Aggregation |
サブアグリゲーション。 |
|
SubGroupByList (任意) |
[]search.GroupBy |
サブグループ。GroupByComposite 自体は、別のグループのサブグループとして使用できません。 |
レスポンス
SearchResponse.AggregationResults から集計名でメトリック結果を、SearchResponse.GroupByResults からグループ名でグルーピング結果を読み取ります。
メトリック集計結果
|
名前 |
型 |
説明 |
|
Avg、Max、Min、Sum |
Value float64 |
集計名を指定して AggregationResults.Avg、Max、Min、または Sum を呼び出し、返されたオブジェクトから Value を読み取ります。Avg、Max、Min の場合、HasValue を呼び出して、結果に有効な値が含まれているかどうかを判断します。 |
|
Count、DistinctCount |
Value int64 |
集計名を指定して AggregationResults.Count または DistinctCount を呼び出し、返されたオブジェクトから Value を読み取ります。 |
|
Percentiles |
PercentilesAggregationItems []search.PercentilesAggregationItem |
集計名を指定して AggregationResults.Percentiles を呼び出します。各項目では、Key はパーセンタイルで、Value は対応する値です。 |
|
トップ行 |
Value []model.Row |
集計名を指定して AggregationResults.TopRows を呼び出し、返されたオブジェクトから Value を読み取ります。 |
グルーピング結果
|
名前 |
型 |
説明 |
|
GroupByField |
[]search.GroupByFieldResultItem |
GroupByResults.GroupByField を呼び出します。各項目には、Key、RowCount、SubAggregations、および SubGroupBys が含まれます。 |
|
GroupByRange |
[]search.GroupByRangeResultItem |
GroupByResults.GroupByRange を呼び出します。各項目には、From、To、RowCount、SubAggregations、および SubGroupBys が含まれます。 |
|
GroupByGeoDistance |
[]search.GroupByGeoDistanceResultItem |
GroupByResults.GroupByGeoDistance を呼び出します。各項目には、距離の境界を表す From と To、RowCount、SubAggregations、および SubGroupBys が含まれます。 |
|
GroupByFilter |
[]search.GroupByFilterResultItem |
GroupByResults.GroupByFilter を呼び出します。結果の順序は Queries と一致します。各項目には、RowCount、SubAggregations、および SubGroupBys が含まれます。 |
|
GroupByHistogram |
[]search.GroupByHistogramItem |
GroupByResults.GroupByHistogram を呼び出します。各項目では、Key はバケット値、Value は行数です。各項目には、SubAggregations と SubGroupBys も含まれます。 |
|
GroupByDateHistogram |
[]search.GroupByDateHistogramItem |
GroupByResults.GroupByDateHistogram を呼び出します。各項目には、ミリ秒単位のタイムスタンプである Timestamp、RowCount、SubAggregations、および SubGroupBys が含まれます。 |
|
GroupByGeoGrid |
[]search.GroupByGeoGridResultItem |
GroupByResults.GroupByGeoGrid を呼び出します。各項目には、ジオハッシュキーである Key、GeoGrid の境界、RowCount、SubAggregations、および SubGroupBys が含まれます。 |
|
GroupByComposite |
[]search.GroupByCompositeResultItem |
GroupByResults.GroupByComposite を呼び出します。SourceGroupByNames はキーの順序を指定します。各項目のキーはその順序に対応します。各項目には、RowCount、SubAggregations、および SubGroupBys も含まれます。NextToken は次のページのトークンです。 |
例
サブアグリゲーションとサブグループの使用
次の例では、行をカテゴリ別にグループ化し、各カテゴリの最高価格を計算し、さらに行をステータス別にグループ化します。
groupBy := search.NewGroupByField("category_group", "category").
Size(10).
SubAggregation(search.NewMaxAggregation("max_price", "price")).
SubGroupBy(search.NewGroupByField("status_group", "status").Size(10))
searchQuery := search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(0).
GroupBy(groupBy)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
})
if err != nil {
log.Fatal(err)
}
result, err := response.GroupByResults.GroupByField("category_group")
if err != nil {
log.Fatal(err)
}
for _, item := range result.Items {
maxPrice, err := item.SubAggregations.Max("max_price")
if err != nil {
log.Fatal(err)
}
statuses, err := item.SubGroupBys.GroupByField("status_group")
if err != nil {
log.Fatal(err)
}
fmt.Println(item.Key, maxPrice.Value, statuses.Items)
}
複数フィールドでのグループ化と結果のページネーション
GroupByComposite は、複数フィールドのグループ化結果をフラットな複合キーとして返し、NextToken を使用して後続のグループを読み取ります。
composite := search.NewGroupByComposite("category_status_group").
SourceGroupBys(
search.NewGroupByField("category", "category"),
search.NewGroupByField("status", "status"),
).
SetSize(100)
var nextToken *string
for {
if nextToken != nil {
composite.SetNextToken(nextToken)
}
searchQuery := search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(0).
GroupBy(composite)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
})
if err != nil {
log.Fatal(err)
}
result, err := response.GroupByResults.GroupByComposite(
"category_status_group",
)
if err != nil {
log.Fatal(err)
}
for _, item := range result.Items {
fmt.Println(item.Keys, item.RowCount)
}
nextToken = result.NextToken
if nextToken == nil || *nextToken == "" {
break
}
}
範囲、距離、およびフィルターによるグループ化
次の例では、同じクエリで価格範囲、地理的距離、およびフィルターによって結果をグループ化します。
priceRanges := search.NewGroupByRange("price_ranges", "price").
Range(0, 200).
Range(200, 500)
distanceRanges := search.NewGroupByGeoDistance(
"distance_ranges",
"location",
search.GeoPoint{Lat: 30.2741, Lon: 120.1551},
).
Range(0, 100000).
Range(100000, 1500000)
categoryFilters := search.NewGroupByFilter("category_filters").
Query(&search.TermQuery{FieldName: "category", Term: "book-go"}).
Query(&search.TermQuery{FieldName: "category", Term: "game"})
searchQuery := search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(0).
GroupBy(priceRanges, distanceRanges, categoryFilters)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
})
if err != nil {
log.Fatal(err)
}
priceResult, err := response.GroupByResults.GroupByRange("price_ranges")
if err != nil {
log.Fatal(err)
}
distanceResult, err := response.GroupByResults.GroupByGeoDistance(
"distance_ranges",
)
if err != nil {
log.Fatal(err)
}
filterResult, err := response.GroupByResults.GroupByFilter("category_filters")
if err != nil {
log.Fatal(err)
}
fmt.Println(priceResult.Items)
fmt.Println(distanceResult.Items)
fmt.Println(filterResult.Items)
数値および日付ヒストグラムの生成
次の例では、固定価格間隔を使用した数値ヒストグラムと月次の日付ヒストグラムを生成します。
groupKeyAscending := []search.GroupBySorter{
&search.GroupKeyGroupBySort{Order: search.SortOrder_ASC.Enum()},
}
priceHistogram := search.NewGroupByHistogram("price_histogram", "price").
SetInterval(int64(200)).
SetFieldRange(int64(0), int64(600)).
SetMinDocCount(1).
SetGroupBySorters(groupKeyAscending)
dateHistogram := search.NewGroupByDateHistogram(
"date_histogram",
"event_time",
).
SetInterval(model.DateTimeValue{
Value: proto.Int32(1),
Unit: model.DateTimeUnit_MONTH.Enum(),
}).
SetFieldRange("2026-01-01T00:00:00", "2026-05-01T00:00:00").
SetTimeZone("+08:00").
SetMinDocCount(1).
SetGroupBySorters(groupKeyAscending)
searchQuery := search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(0).
GroupBy(priceHistogram, dateHistogram)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
})
if err != nil {
log.Fatal(err)
}
priceResult, err := response.GroupByResults.GroupByHistogram("price_histogram")
if err != nil {
log.Fatal(err)
}
dateResult, err := response.GroupByResults.GroupByDateHistogram("date_histogram")
if err != nil {
log.Fatal(err)
}
fmt.Println(priceResult.Items)
fmt.Println(dateResult.Items)
地理グリッドによるグループ化
次の例では、約 39 km × 19 km の GeoHash グリッドによって地理フィールドをグループ化します。
searchQuery := search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(0).
GroupBy(
search.NewGroupByGeoGrid("geo_grid", "location").
SetPrecision(model.GHP_39KM_19KM_4).
SetSize(100),
)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
})
if err != nil {
log.Fatal(err)
}
result, err := response.GroupByResults.GroupByGeoGrid("geo_grid")
if err != nil {
log.Fatal(err)
}
fmt.Println(result.Items)
グループ内の行の取得
次の例では、行をカテゴリ別にグループ化し、各カテゴリで価格が最も高い行を返します。
topRows := search.NewTopRowsAggregation("top_price").
SetLimit(1).
SetSort(&search.Sort{Sorters: []search.Sorter{
&search.FieldSort{
FieldName: "price",
Order: search.SortOrder_DESC.Enum(),
},
}})
groupBy := search.NewGroupByField("category_group", "category").
Size(10).
SubAggregation(topRows)
searchQuery := search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(0).
GroupBy(groupBy)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
Columns: []string{"category", "price"},
},
})
if err != nil {
log.Fatal(err)
}
groups, err := response.GroupByResults.GroupByField("category_group")
if err != nil {
log.Fatal(err)
}
for _, item := range groups.Items {
rows, err := item.SubAggregations.TopRows("top_price")
if err != nil {
log.Fatal(err)
}
fmt.Println(item.Key, rows.Value)
}
複数フィールドのグループ化メソッドの比較
複数のフィールドでグループ化するには、複数の GroupByField をネストするか、GroupByComposite を使用します。結果の構造、ソート要件、ページネーションが必要かどうかに基づいて選択してください。
|
メソッド |
特徴 |
|
ネストされた GroupByField |
階層的な親子グループを返します。各レベルで最大 2,000 グループを返します。グループのページネーションはサポートされていません。グループキー、行数、またはサブ集計値によるソートと、サブ集計がサポートされています。 |
|
GroupByComposite |
最大 32 フィールドのフラットな複合キーを返します。各ページで最大 2,000 グループを返し、NextToken によるページネーションをサポートします。各ソースはグループキーによるソートのみをサポートし、デフォルトで降順です。Date グループキーはタイムスタンプ文字列として返されます。 |