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

Tablestore:ソートとページング

最終更新日:Dec 28, 2024

検索インデックスを使用してデータをクエリする場合、定義済みのソート方法を使用するか、ソート方法を指定できます。このようにして、クエリ条件を満たす行は、事前に定義または指定した順序に基づいて返されます。レスポンスに多数の行が含まれている場合は、limit パラメータと offset パラメータを設定するか、トークンを使用することで、必要なデータを見つけることができます。

シナリオ

カテゴリ

方法

機能

シナリオ

ソート

検索インデックスの作成時にソート方法を事前に定義する

インデックスの事前ソート (IndexSort)

デフォルトでは、検索インデックスのデータは、IndexSort パラメータで指定された事前ソート設定に基づいてソートされます。 IndexSort パラメータで指定された事前ソート設定により、クエリ条件を満たす行が返されるデフォルトの順序が決まります。

データをクエリする際にソート方法を指定する

BM25 ベースのキーワード関連性スコアに基づくソート (ScoreSort)

ScoreSort を使用して、BM25 ベースのキーワード関連性スコアに基づいてクエリ結果をソートできます。 ScoreSort は、全文検索などのシナリオに適しています。

プライマリキー値に基づくソート (PrimaryKeySort)

PrimaryKeySort を使用して、プライマリキー値に基づいてクエリ結果をソートできます。 PrimaryKeySort は、データの一意の識別子に基づいてデータをソートする場合に適しています。

1 つ以上の列の値に基づくソート (FieldSort)

FieldSort を使用して、1 つ以上の列の値に基づいてクエリ結果をソートできます。 FieldSort は、売上高やページビューなどのプロパティに基づいてデータをソートする場合に適しています。ほとんどの場合、FieldSort は、eコマース、ソーシャルネットワーキング、メディアアセットなどの業界で使用されます。

地理的な場所によるソート (GeoDistanceSort)

GeoDistanceSort を使用して、地理的な場所別にクエリ結果をソートできます。 GeoDistanceSort は、特定の場所からの距離に基づいてデータをソートする場合に適しています。ほとんどの場合、GeoDistanceSort は、マッピングや物流などの業界で使用されます。たとえば、ある場所の周りのレストランを、その場所からの距離に基づいてソートできます。

ページング

データをクエリする際にページング方法を指定する

limit パラメータと offset パラメータに基づくページング

レスポンスの行数が 100,000 未満の場合は、この方法を使用してページにジャンプできます。

トークンに基づくページング

この機能を使用すると、データはページごとに返され、後方へのページングのみ可能です。前方へページングする場合は、トークンはクエリ中は有効であるため、前のトークンをキャッシュして使用できます。

インデックスの事前ソート

デフォルトでは、検索インデックスのデータは、IndexSort パラメータで指定された事前ソート設定に基づいてソートされます。検索インデックスを使用してデータをクエリする場合、IndexSort パラメータで指定された事前ソート設定により、一致するデータが返されるデフォルトの順序が決まります。

検索インデックスを作成するときに、IndexSort パラメータを設定することで、事前ソート設定を指定できます。事前ソート設定を指定しない場合、検索インデックスのデータはプライマリキー値でソートされます。

重要
  • 検索インデックスの事前ソート方法として、PrimaryKeySort または FieldSort を指定できます。 PrimaryKeySort はプライマリキー値でデータをソートし、FieldSort はフィールド値でデータをソートします。

  • Nested フィールドを含む検索インデックスは、インデックスの事前ソートをサポートしていません。

  • 既存の検索インデックスの IndexSort パラメータの設定を変更する場合は、検索インデックスのスキーマを動的に変更できます。詳細については、検索インデックスのスキーマを動的に変更するを参照してください。

データをクエリする際にソート方法を指定する

ソートは、enable_sort_and_agg パラメータが true に設定されているフィールドに対してのみ実行できます。

クエリごとにソート方法を指定できます。検索インデックスベースのクエリは、次のソート方法をサポートしています。また、異なる優先順位に基づいて複数のソート方法を指定することもできます。

ScoreSort

ScoreSort を使用して、BM25 ベースのキーワード関連性スコアに基づいてクエリ結果をソートできます。 ScoreSort は、全文検索などのシナリオに適しています。

重要

キーワード関連性スコアで一致するデータをソートする前に、ScoreSort のパラメータを設定する必要があります。設定しない場合、一致するデータは、IndexSort パラメータで指定された事前ソート設定に基づいてソートされます。

'sort' => array(
    array(
        'score_sort' => array(
            'order' => SortOrderConst::SORT_ORDER_DESC // 降順にソート
        )
    ),
)

PrimaryKeySort

PrimaryKeySort を使用して、プライマリキー値に基づいてクエリ結果をソートできます。

'sort' => array(
    array(
        'pk_sort' => array(
            'order' => SortOrderConst::SORT_ORDER_ASC // 昇順にソート
        )
    ),
)

FieldSort

FieldSort を使用して、1 つ以上の特定の列の値に基づいてクエリ結果をソートできます。

'sort' => array(
    array(
        'field_sort' => array(
            'field_name' => 'keyword', // ソート対象のフィールド名
            'order' => SortOrderConst::SORT_ORDER_ASC, // 昇順にソート
            'mode' => SortModeConst::SORT_MODE_AVG, // ソートモード
        )
    ),
)

GeoDistanceSort

GeoDistanceSort を使用して、地理的な場所別にクエリ結果をソートできます。

'sort' => array(
    array(
        'geo_distance_sort' => array(
            'field_name' => 'geo', //地理位置情報を含むフィールド名
            'order' => SortOrderConst::SORT_ORDER_ASC, // 昇順にソート (近い順)
            'distance_type' => GeoDistanceTypeConst::GEO_DISTANCE_PLANE, // 距離計算方法
            'points' => array('0.6,0.6') // 中心点の座標
        )
    ),
)

複数のソート方法の組み合わせ

一致するデータが返される順序を決定するために、2 つの列の値に基づいて特定の順序でクエリ結果をソートできます。

'sort' => array(
    array(
        'field_sort' => array(
            'field_name' => 'keyword', // 第一ソートキー
            'order' => SortOrderConst::SORT_ORDER_ASC, // 昇順にソート
            'mode' => SortModeConst::SORT_MODE_AVG,
        )
    ),
    array(
        'pk_sort' => array( // 第二ソートキー (第一ソートキーが同じ場合に適用)
            'order' => SortOrderConst::SORT_ORDER_ASC // 昇順にソート
        )
    ),
)

ページング方法を指定する

レスポンスの行をページングするには、limit パラメータと offset パラメータを設定するか、トークンを使用できます。

limit パラメータと offset パラメータを設定する

レスポンスの行の総数が 100,000 未満の場合は、limit パラメータと offset パラメータを設定して行をページングできます。 limit パラメータと offset パラメータの値の合計は 100,000 を超えることはできません。 limit パラメータの最大値は 100 です。

limit パラメータと offset パラメータの値を指定しない場合は、デフォルト値が使用されます。 limit パラメータのデフォルト値は 10 です。 offset パラメータのデフォルト値は 0 です。

$request = array(
    'table_name' => 'php_sdk_test', // テーブル名
    'index_name' => 'php_sdk_test_search_index', // インデックス名
    'search_query' => array(
        'offset' => 10, // オフセット (11 番目からのデータを取得)
        'limit' => 10, // 取得するデータの数
        'get_total_count' => true, // 総件数を取得するかどうか
        'query' => array(
            'query_type' => QueryTypeConst::MATCH_ALL_QUERY // 全てのドキュメントにマッチするクエリ
        ),
        'sort' => array(
            array(
                'field_sort' => array(
                    'field_name' => 'keyword', // ソート対象のフィールド
                    'order' => SortOrderConst::SORT_ORDER_ASC // 昇順にソート
                )
            ),
        ),
        'token' => null, // トークン (使用しない場合は null)
    ),
    'columns_to_get' => array(
        'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED, // 指定したカラムのみを取得
        'return_names' => array('col1', 'col2') // 取得するカラム名
    )
);
$response = $otsClient->search($request);

トークンを使用する

この方法ではページングの深さに制限がないため、深いページングにはトークンを使用することをお勧めします。

Tablestore がクエリ条件を満たすデータ全体を読み取れない場合、Tablestore は next_token を返します。 next_token を使用して、後続のデータの読み取りを続行できます。

デフォルトでは、トークンを使用する場合、後方へのみページングできます。ただし、トークンはクエリ中は有効であるため、前のトークンをキャッシュして使用することで、前方へページングできます。

トークンを使用する場合、ソート方法は前のリクエストで使用された方法と同じです。 Tablestore は、デフォルトでは IndexSort パラメータに基づいて、または指定した方法に基づいてデータをソートします。トークンを使用する場合は、ソート方法を指定できません。トークンを使用する場合は、offset パラメータを設定できません。データはページごとに順番に返されます。これにより、クエリが遅くなります。

重要

Nested 型のフィールドを含む検索インデックスは、IndexSort をサポートしていません。ページングが必要で、Nested 型のフィールドを含む検索インデックスを使用してデータをクエリする場合は、クエリ条件でソート方法を指定して、指定した順序でデータを返す必要があります。そうしないと、クエリ条件を満たすデータの一部のみが返された場合、Tablestore は next_token を返しません。

$request = array(
    'table_name' => 'php_sdk_test', // テーブル名
    'index_name' => 'php_sdk_test_search_index', // インデックス名
    'search_query' => array(
        'offset' => 0, // オフセット
        'limit' => 10, // 取得件数
        'get_total_count' => true, // 合計件数を取得するかどうか
        'query' => array(
            'query_type' => QueryTypeConst::FUNCTION_SCORE_QUERY, // 関数スコアクエリ
            'query' => array(
                'query' => array(
                    'query_type' => QueryTypeConst::TERM_QUERY, // タームクエリ
                    'query' => array(
                        'field_name' => 'keyword', // フィールド名
                        'term' => 'keyword' // 検索語
                    )
                ),
                'field_value_factor' => array(
                    'field_name' => 'long' // スコアに影響を与えるフィールド
                )
            )
        ),
        'sort' => array(
            array(
                'score_sort' => array(
                    'order' => SortOrderConst::SORT_ORDER_DESC // スコアの降順でソート
                )
            ),
        )
    ),
    'columns_to_get' => array(
        'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED, // 指定したカラムのみを取得
        'return_names' => array('keyword', 'long') // 取得するカラム名
    )
);

$response = $otsClient->search($request);
print "total_hits: " . $response['total_hits'] . "\n"; // ヒット件数を出力
print json_encode($response['rows'], JSON_PRETTY_PRINT); // 結果を出力

while($response['next_token'] != null) {
    $request['search_query']['token'] = $response['next_token']; // next_token を設定
    $request['search_query']['sort'] = null; // next_token が含まれる場合、トークンにソート情報が含まれているため、ソート方法を指定できません。
    $response = $otsClient->search($request);
    print json_encode($response['rows'], JSON_PRETTY_PRINT); // 結果を出力
}

FAQ

参考資料