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

Tablestore:集計

最終更新日:Dec 28, 2024

集計操作を実行して、最小値、最大値、合計値、平均値、行数、および行の個別カウントを取得できます。また、集計操作を実行して、フィールド値、範囲、地理的な場所、またはフィルター別に結果をグループ化し、ネストされたクエリを実行することもできます。複雑なクエリに対して複数の集計操作を実行できます。

手順

次の図は、完全な集計手順を示しています。

fig_agg_pro

サーバーは、クエリ条件を満たすデータをクエリし、リクエストに基づいてデータの集計を実行します。そのため、集計が必要なリクエストは、集計を必要としないリクエストよりも複雑です。

背景情報

次の表は、集計方法について説明しています。

方法

説明

最小値

フィールドの最小値を返すために使用できる集計方法。この方法は、SQLのMIN関数と同様の方法で使用できます。

最大値

フィールドの最大値を返すために使用できる集計方法。この方法は、SQLのMAX関数と同様の方法で使用できます。

合計

数値フィールドのすべての値の合計を返すために使用できる集計方法。この方法は、SQLのSUM関数と同様の方法で使用できます。

平均値

数値フィールドのすべての値の平均を返すために使用できる集計方法。この方法は、SQLのAVG関数と同様の方法で使用できます。

カウント

指定されたフィールドの値の総数または検索インデックス内の行の総数を返すために使用できる集計方法。この方法は、SQLのCOUNT関数と同様の方法で使用できます。

個別カウント

フィールドの個別値の数を返すために使用できる集計方法。この方法は、SQLのCOUNT(DISTINCT)関数と同様の方法で使用できます。

パーセンタイル統計

パーセンタイル値は、データセット内の値の相対的な位置を示します。たとえば、システムの日常的なO&M中に各リクエストの応答時間に関する統計を収集する場合、p25、p50、p90、p99などのパーセンタイルを使用して応答時間の分布を分析する必要があります。

TopRows

各グループの特定のフィールドに基づいてソートされた上位行の統計を取得するために使用できる集計方法。

フィールド値によるグループ化

フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法。同じ値は一緒にグループ化されます。各グループの同一の値と各グループ内の同一の値の数が返されます。

説明

グループ内の値の数が非常に大きい場合、計算された数は実際の数と異なる場合があります。

範囲によるグループ化

フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法。指定された範囲内のフィールド値は一緒にグループ化されます。各範囲内の値の数が返されます。

地理的な場所によるグループ化

地理的な場所から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法。指定された範囲内の距離のクエリ結果は一緒にグループ化されます。各範囲内の項目数が返されます。

フィルターによるグループ化

クエリ結果をフィルタリングし、各フィルターに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法。結果は、フィルターが指定された順序で返されます。

ヒストグラムによるクエリ

この集計方法は、特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できます。同じ範囲内のフィールド値は一緒にグループ化されます。各グループの値の範囲と各グループ内の値の数が返されます。

ネスト

GroupByはネストをサポートしています。GroupByを使用してサブ集計操作を実行できます。

前提条件

最小値

フィールドの最小値を返すために使用できる集計方法。この方法は、SQLのMIN関数と同様の方法で使用できます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。

    missing

    フィールド値が空の場合、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。

    • missingの値を指定しない場合、行は無視されます。

    • missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_min', // 集計結果を識別するための名前
                        'type' => AggregationTypeConst::AGG_MIN, // 最小値を求める集計
                        'body' => array(
                            'field_name' => 'long', // 集計対象のフィールド名
                            'missing' => 0 // フィールド値がない場合のデフォルト値
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

最大値

フィールドの最大値を返すために使用できる集計方法。この方法は、SQLのMAX関数と同様の方法で使用できます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。

    missing

    フィールド値が空の場合、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。

    • missingの値を指定しない場合、行は無視されます。

    • missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_max', // 集計結果を識別するための名前
                        'type' => AggregationTypeConst::AGG_MAX, // 最大値を求める集計
                        'body' => array(
                            'field_name' => 'long', // 集計対象のフィールド名
                            'missing' => 0 // フィールド値がない場合のデフォルト値
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

合計

数値フィールドのすべての値の合計を返すために使用できる集計方法。この方法は、SQLのSUM関数と同様の方法で使用できます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG型とDOUBLE型のみがサポートされています。

    missing

    フィールド値が空の場合、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。

    • missingの値を指定しない場合、行は無視されます。

    • missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_sum', // 集計結果を識別するための名前
                        'type' => AggregationTypeConst::AGG_SUM, // 合計値を求める集計
                        'body' => array(
                            'field_name' => 'long', // 集計対象のフィールド名
                            'missing' => 0 // フィールド値がない場合のデフォルト値
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

平均値

数値フィールドのすべての値の平均を返すために使用できる集計方法。この方法は、SQLのAVG関数と同様の方法で使用できます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。

    missing

    フィールド値が空の場合、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。

    • missingの値を指定しない場合、行は無視されます。

    • missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_avg', // 集計結果を識別するための名前
                        'type' => AggregationTypeConst::AGG_AVG, // 平均値を求める集計
                        'body' => array(
                            'field_name' => 'long', // 集計対象のフィールド名
                            'missing' => 0 // フィールド値がない場合のデフォルト値
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

カウント

指定されたフィールドの値の総数または検索インデックス内の行の総数を返すために使用できる集計方法。この方法は、SQLのCOUNT関数と同様の方法で使用できます。

説明

検索インデックス内の行の総数またはクエリ条件を満たす行の総数をクエリするには、次の方法を使用できます。

  • 集計のcount機能を使用し、リクエストでcount(*)を指定します。

  • クエリ機能を使用して、クエリ条件を満たす行の数を取得します。クエリでsetGetTotalCountをtrueに設定します。MatchAllQueryを使用して、検索インデックス内の行の総数を取得します。

カウント式の値として列の名前を使用して、検索インデックスに列が含まれる行の数をクエリできます。この方法は、スパース列を含むシナリオに適しています。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、およびDATE型のみがサポートされています。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_count', // 集計結果を識別するための名前
                        'type' => AggregationTypeConst::AGG_COUNT, // 件数を求める集計
                        'body' => array(
                            'field_name' => 'long', // 集計対象のフィールド名
                            'missing' => 0 // フィールド値がない場合のデフォルト値
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

個別カウント

フィールドの個別値の数を返すために使用できる集計方法。この方法は、SQLのCOUNT(DISTINCT)関数と同様の方法で使用できます。

説明

個別値の数は概算です。

  • 個別カウント機能を使用する前の行の総数が10,000未満の場合、計算結果は正確な値に近くなります。

  • 個別カウント機能を使用する前の行の総数が1億以上の場合、エラー率は約2%です。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、およびDATE型のみがサポートされています。

    missing

    フィールド値が空の場合、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。

    • missingの値を指定しない場合、行は無視されます。

    • missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_distinct_count', // 集計結果を識別するための名前
                        'type' => AggregationTypeConst::AGG_DISTINCT_COUNT, // 個別カウントを求める集計
                        'body' => array(
                            'field_name' => 'boolean', // 集計対象のフィールド名
                            'missing' => false // フィールド値がない場合のデフォルト値
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

パーセンタイル統計

パーセンタイル値は、データセット内の値の相対的な位置を示します。たとえば、システムの日常的なO&M中に各リクエストの応答時間に関する統計を収集する場合、p25、p50、p90、p99などのパーセンタイルを使用して応答時間の分布を分析する必要があります。

説明
  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。

    percentiles

    p50、p90、p99などのパーセンタイル。1つ以上のパーセンタイルを指定できます。

    missing

    フィールド値が空の場合、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。

    • missingの値を指定しない場合、行は無視されます。

    • missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_percentiles', // 集計結果を識別するための名前
                        'type' => AggregationTypeConst::AGG_PERCENTILES, // パーセンタイルを求める集計
                        'body' => array(
                            'field_name' => 'long', // 集計対象のフィールド名
                            'percentiles' => array(60, 80, 100), // 求めたいパーセンタイルの配列
                            'missing' => 0 // フィールド値がない場合のデフォルト値
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

TopRows

各グループの特定のフィールドに基づいてソートされた上位行の統計を取得するために使用できる集計方法。

GroupByを使用してクエリ結果をグループ化した後、各グループの行をクエリできます。この方法は、MySQLのANY_VALUE(field)と同様の方法で使用できます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    limit

    各グループに返される上位行の数。

    sort

    各グループの行のソート規則。ソート規則に基づいてソートされた指定された数の上位行が各グループに返されます。

    columns_to_get

    返されるフィールド。検索インデックス内のフィールドのみがサポートされています。ARRAY、DATE、GEOPOINT、およびNESTEDフィールドはサポートされていません。

    このパラメーターの値は、リクエストのcolumns_to_getの値と同じです。リクエストでcolumns_to_getのみを指定する必要があります。

    説明

    各グループの集計操作の結果から取得された行をクエリする場合、検索インデックスにNESTED、GEOPOINT、またはARRAYフィールドが含まれていると、返される結果にはプライマリキー情報のみが含まれます。必要なフィールドを取得するには、データテーブルをクエリする必要があります。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
              'aggs' => array(
            'aggs' => array(
                    array(
                        'name' => 'avg_top_rows', // 集計結果を識別するための名前
                        'type' => AggregationTypeConst::AGG_TOP_ROWS, // 上位N件を取得する集計
                        'body' => array(
                            'limit' => 2, // 取得する上位N件
                            'sort' => array(
                                'sorters' => array(
                                    array(
                                        'field_sort' => array(
                                            'field_name' => 'long', // ソート対象のフィールド名
                                            'order' => SortOrderConst::SORT_ORDER_DESC // 降順ソート
                                        )
                                    )
                                )
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

フィールド値によるグループ化

フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法。同じ値は一緒にグループ化されます。各グループの同一の値と各グループ内の同一の値の数が返されます。

説明

グループ内の値の数が非常に大きい場合、計算された数は実際の数と異なる場合があります。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、BOOLEAN、KEYWORD、およびDATE型のみがサポートされています。

    sort

    グループのソート規則。デフォルトでは、グループはグループ内の項目数に基づいて降順にソートされます。複数のソート規則を設定した場合、グループは規則が設定された順序でソートされます。サポートされているパラメーター:

    • 値でアルファベット順にソート。

    • 値でアルファベットの逆順にソート。

    • 行数で昇順にソート。

    • 行数で降順にソート。

    • サブ集計結果から取得された値で昇順にソート。

    • サブ集計結果から取得された値で降順にソート。

    size

    返されるグループの数。デフォルト値:10。最大値:2000。グループの数が2,000を超える場合、最初の2,000グループのみが返されます。

    sub_aggs and sub_group_bys

    サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。

    • シナリオ

      各カテゴリの製品数と、各カテゴリの製品の最高価格と最低価格をクエリします。

    • 方法

      方法製品カテゴリ別にクエリ結果をグループ化して、各カテゴリの製品数を取得します。次に、2つのサブ集計操作を実行して、各カテゴリの製品の最高価格と最低価格を取得します。

    • 結果例

      • 果物:5。最高価格は15円。最低価格は3円。

      • トイレタリー:10。最高価格は98円。最低価格は1円。

      • 電子機器:3。最高価格は8,699円。最低価格は2,300円。

      • その他の製品:15。最高価格は1,000円。最低価格は80円。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_FIELD', // グループ化の結果を識別するための名前
                        'type' => GroupByTypeConst::GROUP_BY_FIELD, // フィールド値によるグループ化
                        'body' => array(
                            'field_name' => 'boolean', // グループ化対象のフィールド名
                            'size' => 3, // 返すグループの最大数
                            'min_doc_count' => 0, // 最小ドキュメント数。これ未満のドキュメント数のグループは返されない
                            'sort' => array(
                                'sorters' => array(
                                    array(
                                        'group_key_sort' => array( // グループキーでソート
                                            'order' => SortOrderConst::SORT_ORDER_DESC // 降順ソート
                                        ),
                                    ),
                                )
                            ),
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

範囲によるグループ化

フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法。指定された範囲内のフィールド値は一緒にグループ化されます。各範囲内の値の数が返されます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG型とDOUBLE型のみがサポートされています。

    ranges[from, to)

    グループ化に使用される値の範囲。

    値の範囲はDouble.MIN_VALUEから始まり、Double.MAX_VALUEで終わることができます。

    sub_aggs and sub_group_bys

    サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。

    たとえば、売上高と都道府県別にクエリ結果をグループ化した後、指定された範囲内で売上高の割合が最も大きい都道府県を取得できます。このクエリを実行するには、GroupByRangeでGroupByFieldの値を指定する必要があります。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_RANGE', // グループ化の結果を識別するための名前
                        'type' => GroupByTypeConst::GROUP_BY_RANGE, // 範囲によるグループ化
                        'body' => array(
                            'field_name' => 'long', // グループ化対象のフィールド名
                            'ranges' => array( // グループ化に使用する範囲の配列
                                array(
                                    'from' => 1, // 範囲の開始値(以上)
                                    'to' => 3 // 範囲の終了値(未満)
                                ),
                                array(
                                    'from' => 3, // 範囲の開始値(以上)
                                    'to' => 6 // 範囲の終了値(未満)
                                ),
                                array(
                                    'from' => 6, // 範囲の開始値(以上)
                                    'to' => 10 // 範囲の終了値(未満)
                                )
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

地理的な場所によるグループ化

地理的な場所から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法。指定された範囲内の距離のクエリ結果は一緒にグループ化されます。各範囲内の項目数が返されます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作に使用されるフィールドの名前。GEOPOINT型のみがサポートされています。

    origin(lat, lon)

    中心点の経度と緯度。

    latは中心点の緯度を指定します。lonは中心点の経度を指定します。

    ranges[from, to)

    グループ化に使用される距離範囲。単位:メートル。fromとtoの値はDOUBLE型です。

    値の範囲はDouble.MIN_VALUEから始まり、Double.MAX_VALUEで終わることができます。

    sub_aggs and sub_group_bys

    サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_GEO_DISTANCE', // グループ化の結果を識別するための名前
                        'type' => GroupByTypeConst::GROUP_BY_GEO_DISTANCE, // 地理的距離によるグループ化
                        'body' => array(
                            'field_name' => 'geo', // グループ化対象のフィールド名(GeoPoint型)
                            'origin' => array( // 中心点の座標
                                'lat' => 5, // 中心点の緯度
                                'lon' => 6 // 中心点の経度
                            ),
                            'ranges' => array( // グループ化に使用する距離範囲の配列
                                array(
                                    'from' => 0., // 範囲の開始値(以上)
                                    'to' => 1000. // 範囲の終了値(未満)
                                ),
                                array(
                                    'from' => 10000., // 範囲の開始値(以上)
                                    'to' => 100000. // 範囲の終了値(未満)
                                ),
                                array(
                                    'from' => 100000., // 範囲の開始値(以上)
                                ),
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

フィルターによるグループ化

クエリ結果をフィルタリングし、各フィルターに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法。結果は、フィルターが指定された順序で返されます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    filters

    クエリに使用できるフィルター。結果は、フィルターが指定された順序で返されます。

    sub_aggs and sub_group_bys

    サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_FILTER', // グループ化の結果を識別するための名前
                        'type' => GroupByTypeConst::GROUP_BY_FILTER, // フィルターによるグループ化
                        'body' => array(
                            'filters' => array( // グループ化に使用するフィルターの配列
                                array(
                                    'query_type' => QueryTypeConst::TERM_QUERY, // タームクエリ
                                    'query' => array(
                                        'field_name' => 'boolean', // クエリ対象のフィールド名
                                        'term' => false // 検索するターム
                                    )
                                ),
                                array(
                                    'query_type' => QueryTypeConst::TERM_QUERY, // タームクエリ
                                    'query' => array(
                                        'field_name' => 'boolean', // クエリ対象のフィールド名
                                        'term' => true // 検索するターム
                                    )
                                )
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

ヒストグラムによるクエリ

この集計方法は、特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できます。同じ範囲内のフィールド値は一緒にグループ化されます。各グループの値の範囲と各グループ内の値の数が返されます。

  • パラメーター

    パラメーター

    説明

    name

    集計操作の一意の名前。この名前で特定の集計操作の結果を照会できます。

    field_name

    集計操作を実行するために使用されるフィールドの名前。LONG型とDOUBLE型のみがサポートされています。

    interval

    集計結果を取得するために使用されるデータ間隔。

    field_range[min,max]

    intervalパラメーターと一緒に使用してグループの数を制限する範囲。式を使用して計算された値は2,000を超えることはできません。

    min_doc_count

    行の最小数。グループ内の行数が行の最小数よりも少ない場合、グループの集計結果は返されません。

    missing

    フィールド値が空の場合、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。

    • missingの値を指定しない場合、行は無視されます。

    • missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_HISTOGRAM', // グループ化の結果を識別するための名前
                        'type' => GroupByTypeConst::GROUP_BY_HISTOGRAM, // ヒストグラムによるグループ化
                        'body' => array(
                            'field_name' => 'long', // グループ化対象のフィールド名
                            'interval' => 3, // ヒストグラムのインターバル
                            'missing' => 0, // フィールド値がない場合のデフォルト値
                            'min_doc_count' => 0, // 最小ドキュメント数
                            'field_range' => array( // フィールドの範囲
                                'min' => 2, // 最小値
                                'max' => 10, // 最大値
                            ),
                            'sort' => array(
                                'sorters' => array(
                                    array(
                                        'row_count_sort' => array( // ドキュメント数でソート
                                            'order' => SortOrderConst::SORT_ORDER_ASC // 昇順ソート
                                        )
                                    )
                                )
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

ネスト

GroupByはネストをサポートしています。GroupByを使用してサブ集計操作を実行できます。

ネストを使用して、グループ内でサブ集計操作を実行できます。たとえば、最大2レベルまでネスト集計操作を実行できます。

  • GroupBy + SubGroupBy:項目は都道府県別および市町村別にグループ化され、各都道府県の各市町村のデータが取得されます。

  • GroupBy + SubAggregation:項目は都道府県別にグループ化され、メトリックの最大値が計算されて、各都道府県のメトリックの最大値が取得されます。

説明

複雑なGroupBy操作の高パフォーマンスを確保するために、ネストのレベル数を少なく指定できます。詳細については、検索インデックスの制限を参照してください。

$request = array(
    'table_name' => 'myTableName',
    'index_name' => 'myIndexName',
    'search_query' => array(
        'offset' => 0,
        'limit' => 0,
        'get_total_count' => true,
        'query' => array(
            'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
        ),
        'group_bys' => array(
            'group_bys' => array(
                array(
                    'name' => 'group_by_GROUP_BY_FIELD', // グループ化の結果を識別するための名前
                    'type' => GroupByTypeConst::GROUP_BY_FIELD, // フィールド値によるグループ化
                    'body' => array(
                        'field_name' => 'boolean', // グループ化対象のフィールド名
                        'size' => 3, // 返すグループの最大数
                        'min_doc_count' => 0, // 最小ドキュメント数
                        'sort' => array(
                            'sorters' => array(
                                array(
                                    'group_key_sort' => array( // グループキーでソート
                                        'order' => SortOrderConst::SORT_ORDER_DESC // 降順ソート
                                    ),
                                ),
                            )
                        ),
                        'sub_aggs' => array( // サブ集計
                            'aggs' => array(
                                array(
                                    'name' => 'groupSum', // サブ集計結果を識別するための名前
                                    'type' => AggregationTypeConst::AGG_SUM, // 合計値を求めるサブ集計
                                    'body' => array(
                                        'field_name' => 'long', // サブ集計対象のフィールド名
                                        'missing' => 0 // フィールド値がない場合のデフォルト値
                                    )
                                ),
                            ),
                        ),
                    )
                ),
            ),
        )
    ),
    'columns_to_get' => array(
        'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // インデックスの全てのカラムを返す
    ),
);

$response = $this->otsClient->search($request);
$group_by_results = $response["group_bys"]["group_by_results"];

print json_encode($group_by_results, JSON_PRETTY_PRINT);