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

Tablestore:結果のソートとページネーション

最終更新日:Aug 07, 2026

Tablestore SDK for Python を使用して、検索インデックスの結果の順序を制御し、オフセットまたは next_token を使用して結果をページ分割します。

前提条件

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

説明

検索インデックスは、インデックスの事前ソートとクエリ時のソートをサポートしています。検索インデックスを作成する際、 index_sort を使用してデフォルトの順序を指定します。index_sort が指定されていない場合、行はプライマリキーでソートされます。インデックスの事前ソートは PrimaryKeySortFieldSort のみをサポートし、Nested フィールドを含むインデックスではサポートされません。作成後、スキーマを動的に更新してインデックスの事前ソートを変更できます。クエリ時には、 SearchQuery.sort を使用して ScoreSortPrimaryKeySortFieldSort、または GeoDistanceSort を指定するか、複数のソーターをリスト順に組み合わせることができます。プライマリキーを除き、ソートフィールドはインデックス作成時にソートと集計を有効にする必要があります。

ページネーション方法

説明

limit と offset

結果が 100,000 行を超えず、特定の位置にジャンプする必要がある場合に使用します。limit + offset100000 を超えることはできません。

next_token

ディープページネーションまたはすべての結果を順次読み取る場合に使用します。ページネーションの深さに 100,000 行の制限はありませんが、ページは順次しか読み取れません。

次の例では、 score で降順、次にプライマリキーで昇順にソートし、最初の 10 行を返します。

sort = Sort([
    FieldSort("score", SortOrder.DESC),
    PrimaryKeySort(SortOrder.ASC),
])
response = client.search(
    "example_table",
    "example_index",
    SearchQuery(MatchAllQuery(), sort=sort, limit=10),
    ColumnsToGet(return_type=ColumnReturnType.ALL),
)
print(response.rows)

パラメーター

検索リクエスト

search メソッドには次のパラメーターが含まれます。

名前

タイプ

説明

table_name (必須)

str

データテーブルの名前。

index_name (必須)

str

検索インデックスの名前。

search_query (必須)

SearchQuery

クエリ条件と共通のクエリ設定。

columns_to_get (オプション)

ColumnsToGet

返す列の設定。このパラメーターが指定されていない場合、プライマリキー列のみが返されます。

routing_keys (オプション)

list

カスタムルーティングフィールドのプライマリキー値。カスタムルーティングが設定されていない場合、このパラメーターは不要です。

timeout_s (オプション)

int

リクエストタイムアウト (秒単位)。このパラメーターが指定されていない場合、クライアントレベルのタイムアウトが使用されます。

クエリ設定

search_querySearchQuery タイプであり、次のソートおよびページネーションパラメーターが含まれます。

名前

タイプ

説明

query (必須)

Query

クエリ条件。

sort (オプション)

Sort

クエリ時のソート設定。省略された場合、インデックスの事前ソートが使用されます。next_token を使用する場合は指定しないでください。

offset (オプション)

int

オフセット。デフォルト値: 0next_token を使用する場合は指定しないでください。

limit (オプション)

int

返される行の最大数。デフォルト値: 10。返す列をテーブルから読み取る必要がある場合、最大値は 100 で、すべての返す列を検索インデックスから読み取る場合は 1000 です。

next_token (オプション)

bytes

ページネーショントークン。最初のリクエストでは省略し、後続のリクエストでは前のレスポンスからの next_token を使用します。

get_total_count (オプション)

bool

一致する行の総数を返すかどうかを指定します。デフォルト値: False

ソート設定

search_query.sortSort タイプであり、次のパラメーターが含まれます。

名前

タイプ

説明

sorters (必須)

list[Sorter]

ソーターのリスト。リストの順序が複数レベルのソート優先順位を決定します。サポートされているソータータイプは ScoreSortPrimaryKeySortFieldSort、および GeoDistanceSort です。

関連度スコアソート

search_query.sort.sorters[]ScoreSort タイプの場合、行は関連度スコアでソートされます。ScoreSort には次のパラメーターが含まれます。

名前

タイプ

説明

sort_order (オプション)

SortOrder

ソート順。デフォルト値: DESC。関連度スコアでソートするには、 ScoreSort を明示的に設定します。

プライマリキーソート

search_query.sort.sorters[]PrimaryKeySort タイプの場合、行はプライマリキーでソートされます。PrimaryKeySort には次のパラメーターが含まれます。

名前

タイプ

説明

sort_order (オプション)

SortOrder

ソート順。デフォルト値: ASC

フィールドソート

search_query.sort.sorters[]FieldSort タイプの場合、行はフィールド値でソートされます。FieldSort には次のパラメーターが含まれます。

名前

タイプ

説明

field_name (必須)

str

ソートフィールド名。このフィールドでは、ソートと集計を有効にする必要があります。

sort_order (オプション)

SortOrder

ソート順。デフォルト値: ASC

sort_mode (オプション)

SortMode

複数値フィールドの値選択モード: MINMAX、または AVG

nested_filter (オプション)

NestedFilter

Nested 子フィールドのソート設定。Nested パスとソートに使用する子行を選択するクエリが含まれます。

Nestedフィルター

search_query.sort.sorters[].nested_filterNestedFilter タイプであり、 FieldSort または GeoDistanceSort で使用でき、次のパラメーターが含まれます。

名前

タイプ

説明

path (必須)

str

Nested フィールドのパス。

query_filter (必須)

Query

ソートに使用する Nested 子行を選択するクエリ条件。すべての子行を使用するには、このパラメーターを MatchAllQuery に設定します。

地理距離ソート

search_query.sort.sorters[]GeoDistanceSort タイプの場合、行は地理的ポイントとターゲットポイント間の距離でソートされます。GeoDistanceSort には次のパラメーターが含まれます。

名前

タイプ

説明

field_name (必須)

str

GeoPoint ソートフィールドの名前。

points (必須)

list[str]

latitude,longitude フォーマットのターゲットポイントのリスト。

sort_order (オプション)

SortOrder

ASC は近い順に、DESC は遠い順にソートします。

sort_mode (オプション)

SortMode

複数の距離が存在する場合の値選択モード: MINMAX、または AVG

geo_distance_type (オプション)

GeoDistanceType

距離計算方法。ARC (デフォルト) は球面モデルを使用し、PLANE は平面モデルを使用します。

nested_filter (オプション)

NestedFilter

Nested 子フィールドのソート設定。

返す列

columns_to_getColumnsToGet タイプであり、次のパラメーターが含まれます。

名前

タイプ

説明

column_names (オプション)

list[str]

返す属性列の名前です。return_typeSPECIFIED の場合にのみ指定します。

return_type (オプション)

ColumnReturnType

返す列のモードです。NONE (デフォルト) はプライマリキー列のみを、SPECIFIED は指定された属性列を、ALL はテーブル内のすべての属性列を、ALL_FROM_INDEX はインデックス内のすべての保存済みフィールドを返します。

レスポンス

search メソッドは SearchResponse を返します。次の表では、コアフィールドについて説明します。

フィールド

タイプ

説明

rows

list[Row]

クエリによって返された行。数は limit を超えません。

next_token

bytes

次のページのトークン。空の値は、それ以上のデータが利用できないことを示します。

total_count

int

一致する行の数。値は get_total_count に依存します。

is_all_succeed

bool

すべてのインデックスパーティションがクエリされたかどうかを示します。値が False の場合、部分的な結果が返されます。

agg_results

list[AggResult]

メトリック集計の結果。aggs が設定されていない場合、このフィールドは空です。

group_by_results

list[GroupByResult]

グループ化の結果。group_bys が設定されていない場合、このフィールドは空です。

search_hits

list[SearchHit]

検索ヒットです。行、関連度スコア、ハイライトなどの拡張情報が含まれます。

空の next_token は、クエリに決定的なソート順がないことを示す場合もあります。total_count は、現在のページの行数ではなく、一致する行の総数です。

タプル互換レスポンス

Tablestore SDK for Python 5.2.0 以降、検索 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()

地理距離によるソート

次の例では、 location30.25,120.16 の間の球面距離に基づき、近い順に結果を返します。

sort = Sort([
    GeoDistanceSort(
        "location",
        ["30.25,120.16"],
        sort_order=SortOrder.ASC,
        sort_mode=SortMode.MIN,
        geo_distance_type=GeoDistanceType.ARC,
    )
])
response = client.search(
    "example_table",
    "example_index",
    SearchQuery(MatchAllQuery(), sort=sort, limit=10),
)
print(response.rows)

next_tokenを使用したページネーション

最初のリクエストでソート順を指定します。後続のリクエストでは、トークンが空になるまで、前のレスポンスからの next_token と同じクエリ条件のみを渡します。

query = MatchAllQuery()
response = client.search(
    "example_table",
    "example_index",
    SearchQuery(query, sort=Sort([PrimaryKeySort()]), limit=100),
)
all_rows = list(response.rows)

while response.next_token:
    response = client.search(
        "example_table",
        "example_index",
        SearchQuery(query, next_token=response.next_token, limit=100),
    )
    all_rows.extend(response.rows)

print(len(all_rows))
重要

next_token を使用してページ分割する場合、 offset を指定せず、ページを直接スキップすることはできません。前のページに戻るには、各ページに使用されたトークンをキャッシュし、ターゲットページのトークンで再度クエリします。Nested フィールドを含む検索インデックスには、インデックスの事前ソートがありません。最初のリクエストで明示的に sort を指定しないと、サーバーは next_token を返しません。