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

Tablestore:ソートとページング

最終更新日:Dec 28, 2024

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

ユースケース

カテゴリ

方法

機能

シナリオ

ソート

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

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

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

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

ScoreSort

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

PrimaryKeySort

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

FieldSort

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

GeoDistanceSort

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

ページング

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

制限およびオフセットパラメータに基づくページング

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

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

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

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

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

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

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

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

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

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

ソートは、enable_sort_and_agg が True に設定されているフィールドに対してのみ有効にできます。

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

ScoreSort

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

重要

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

sort = Sort(
    sorters=[ScoreSort(sort_order=SortOrder.DESC)]
)
client.search(
    '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, sort=sort, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL)
)

PrimaryKeySort

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

sort = Sort(
    sorters=[PrimaryKeySort(sort_order=SortOrder.DESC)]
)
client.search(
    '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, sort=sort, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL)
) = PrimaryKeySort(sort_order=SortOrder.DESC)

FieldSort

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

単一列の値に基づいてクエリ結果をソートする

FieldSort を使用して、指定された列の値に基づいてクエリ結果をソートできます。

sort = Sort(
    sorters=[FieldSort('a', SortOrder.ASC)]
)

client.search(
    '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, sort=sort, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL)
)

複数列の値に基づいてクエリ結果をソートする

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

sort = Sort(
    sorters=[
        FieldSort('a', SortOrder.ASC),
        FieldSort('b', SortOrder.ASC)
    ]
)

client.search(
    '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, sort=sort, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL)
)

GeoDistanceSort

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

sort = Sort(
    sorters=[GeoDistanceSort('g', ['32.5,116.5', '32.0,116.0'], sort_order=SortOrder.DESC, sort_mode=SortMode.MAX)]
)

client.search(
    '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, sort=sort, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL)
)    

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

limit および offset を使用するか、トークンを使用して、返されたクエリ結果をページに分割できます。

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

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

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

query = RangeQuery('k', 'key100', 'key500', include_lower=False, include_upper=False)
search_response = client.search(
    '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', 
    SearchQuery(query, offset=100, limit=100, get_total_count=True), 
    ColumnsToGet(return_type=ColumnReturnType.ALL)
)  
print('request_id : %s' % search_response.request_id)
print('is_all_succeed : %s' % search_response.is_all_succeed)
print('total_count : %s' % search_response.total_count)
print('rows : %s' % search_response.rows)

トークンを使用する

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

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

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

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

重要

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

query = MatchAllQuery()
all_rows = []
next_token = None
# 最初のラウンド
search_response = client.search('<TABLE_NAME>', '<SEARCH_INDEX_NAME>',
        SearchQuery(query, next_token=next_token, limit=100, get_total_count=True),
        columns_to_get=ColumnsToGet(['k', 't', 'g', 'ka', 'la'], ColumnReturnType.SPECIFIED))
all_rows.extend(search_response.rows)
# ループ
while search_response.next_token:
    search_response = client.search('<TABLE_NAME>', '<SEARCH_INDEX_NAME>',
        SearchQuery(query, next_token=search_response.next_token, sort=None, limit=100, get_total_count=True),
        columns_to_get=ColumnsToGet(['k', 't', 'g', 'ka', 'la'], ColumnReturnType.SPECIFIED))
    all_rows.extend(search_response.rows)

print('Total rows:%d' % len(all_rows))

FAQ

参考資料