Tablestore SDK for Python を使用して、検索インデックスの結果の順序を制御し、オフセットまたは next_token を使用して結果をページ分割します。
前提条件
Tablestore SDK for Python をインストールし、クライアントを初期化します。
説明
検索インデックスは、インデックスの事前ソートとクエリ時のソートをサポートしています。検索インデックスを作成する際、 index_sort を使用してデフォルトの順序を指定します。index_sort が指定されていない場合、行はプライマリキーでソートされます。インデックスの事前ソートは PrimaryKeySort と FieldSort のみをサポートし、Nested フィールドを含むインデックスではサポートされません。作成後、スキーマを動的に更新してインデックスの事前ソートを変更できます。クエリ時には、 SearchQuery.sort を使用して ScoreSort、PrimaryKeySort、FieldSort、または GeoDistanceSort を指定するか、複数のソーターをリスト順に組み合わせることができます。プライマリキーを除き、ソートフィールドはインデックス作成時にソートと集計を有効にする必要があります。
|
ページネーション方法 |
説明 |
|
limit と offset |
結果が 100,000 行を超えず、特定の位置にジャンプする必要がある場合に使用します。 |
|
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 (必須) |
|
データテーブルの名前。 |
|
index_name (必須) |
|
検索インデックスの名前。 |
|
search_query (必須) |
|
クエリ条件と共通のクエリ設定。 |
|
columns_to_get (オプション) |
|
返す列の設定。このパラメーターが指定されていない場合、プライマリキー列のみが返されます。 |
|
routing_keys (オプション) |
|
カスタムルーティングフィールドのプライマリキー値。カスタムルーティングが設定されていない場合、このパラメーターは不要です。 |
|
timeout_s (オプション) |
|
リクエストタイムアウト (秒単位)。このパラメーターが指定されていない場合、クライアントレベルのタイムアウトが使用されます。 |
クエリ設定
search_query は SearchQuery タイプであり、次のソートおよびページネーションパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
query (必須) |
|
クエリ条件。 |
|
sort (オプション) |
|
クエリ時のソート設定。省略された場合、インデックスの事前ソートが使用されます。 |
|
offset (オプション) |
|
オフセット。デフォルト値: |
|
limit (オプション) |
|
返される行の最大数。デフォルト値: |
|
next_token (オプション) |
|
ページネーショントークン。最初のリクエストでは省略し、後続のリクエストでは前のレスポンスからの |
|
get_total_count (オプション) |
|
一致する行の総数を返すかどうかを指定します。デフォルト値: |
ソート設定
search_query.sort は Sort タイプであり、次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
sorters (必須) |
|
ソーターのリスト。リストの順序が複数レベルのソート優先順位を決定します。サポートされているソータータイプは |
関連度スコアソート
search_query.sort.sorters[] が ScoreSort タイプの場合、行は関連度スコアでソートされます。ScoreSort には次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
sort_order (オプション) |
|
ソート順。デフォルト値: |
プライマリキーソート
search_query.sort.sorters[] が PrimaryKeySort タイプの場合、行はプライマリキーでソートされます。PrimaryKeySort には次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
sort_order (オプション) |
|
ソート順。デフォルト値: |
フィールドソート
search_query.sort.sorters[] が FieldSort タイプの場合、行はフィールド値でソートされます。FieldSort には次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
field_name (必須) |
|
ソートフィールド名。このフィールドでは、ソートと集計を有効にする必要があります。 |
|
sort_order (オプション) |
|
ソート順。デフォルト値: |
|
sort_mode (オプション) |
|
複数値フィールドの値選択モード: |
|
nested_filter (オプション) |
|
Nested 子フィールドのソート設定。Nested パスとソートに使用する子行を選択するクエリが含まれます。 |
Nestedフィルター
search_query.sort.sorters[].nested_filter は NestedFilter タイプであり、 FieldSort または GeoDistanceSort で使用でき、次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
path (必須) |
|
Nested フィールドのパス。 |
|
query_filter (必須) |
|
ソートに使用する Nested 子行を選択するクエリ条件。すべての子行を使用するには、このパラメーターを |
地理距離ソート
search_query.sort.sorters[] が GeoDistanceSort タイプの場合、行は地理的ポイントとターゲットポイント間の距離でソートされます。GeoDistanceSort には次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
field_name (必須) |
|
GeoPoint ソートフィールドの名前。 |
|
points (必須) |
|
|
|
sort_order (オプション) |
|
|
|
sort_mode (オプション) |
|
複数の距離が存在する場合の値選択モード: |
|
geo_distance_type (オプション) |
|
距離計算方法。 |
|
nested_filter (オプション) |
|
Nested 子フィールドのソート設定。 |
返す列
columns_to_get は ColumnsToGet タイプであり、次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
column_names (オプション) |
|
返す属性列の名前です。 |
|
return_type (オプション) |
|
返す列のモードです。 |
レスポンス
search メソッドは SearchResponse を返します。次の表では、コアフィールドについて説明します。
|
フィールド |
タイプ |
説明 |
|
rows |
|
クエリによって返された行。数は |
|
next_token |
|
次のページのトークン。空の値は、それ以上のデータが利用できないことを示します。 |
|
total_count |
|
一致する行の数。値は |
|
is_all_succeed |
|
すべてのインデックスパーティションがクエリされたかどうかを示します。値が |
|
agg_results |
|
メトリック集計の結果。 |
|
group_by_results |
|
グループ化の結果。 |
|
search_hits |
|
検索ヒットです。行、関連度スコア、ハイライトなどの拡張情報が含まれます。 |
空の 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()
例
地理距離によるソート
次の例では、 location と 30.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 を返しません。