検索インデックスを使用してデータをクエリする場合、事前定義されたソート方法を使用するか、ソート方法を指定できます。このようにして、クエリ条件を満たす行は、事前定義または指定した順序に基づいて返されます。レスポンスに多数の行が含まれている場合は、Limit パラメータと Offset パラメータを設定するか、トークンを使用して必要なデータを見つけることができます。
ユースケース
カテゴリ | 方法 | 機能 | シナリオ |
ソート | 検索インデックスの作成時にソート方法を事前定義する | デフォルトでは、検索インデックスのデータは、IndexSort パラメータで指定された事前ソート設定に基づいてソートされます。 IndexSort パラメータで指定された事前ソート設定により、クエリ条件を満たす行が返されるデフォルトの順序が決まります。 | |
データをクエリするときにソート方法を指定する | ScoreSort を使用して、BM25 ベースのキーワード関連性スコアに基づいてクエリ結果をソートできます。 ScoreSort は、全文検索などのシナリオに適しています。 | ||
PrimaryKeySort を使用して、プライマリキー値に基づいてクエリ結果をソートできます。 PrimaryKeySort は、データの一意の識別子に基づいてデータをソートする場合に適しています。 | |||
FieldSort を使用して、1 つ以上の列の値に基づいてクエリ結果をソートできます。 FieldSort は、売上高やページビューなどのプロパティに基づいてデータをソートする場合に適しています。ほとんどの場合、FieldSort は、eコマース、ソーシャルネットワーキング、メディアアセットなどの業界で使用されます。 | |||
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 です。
制限パラメーターの最大値を増やす方法については、検索インデックス機能のSearchオペレーションを呼び出してデータをクエリする際に、制限パラメーターの値を1000に増やすにはどうすればよいですか?を参照してください。
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
参考資料
検索インデックスを使用してデータをクエリする場合、次のクエリ方法を使用できます。 用語クエリ、 用語クエリ、 すべて一致クエリ、 一致クエリ、 一致フレーズクエリ、 プレフィックスクエリ、 範囲クエリ、 ワイルドカードクエリ、 地理クエリ、 ブールクエリ、 KNNベクトル検索クエリ、 ネストされたクエリ、 存在クエリ。検索インデックスによって提供されるクエリ方法を使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
ソートおよびページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングを参照してください。
折りたたみ(個別)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。このようにして、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ(個別)を参照してください。
データテーブルのデータを分析する場合は、Search オペレーションの集計機能を使用するか、SQL ステートメントを実行できます。たとえば、最小値と最大値、合計、行の総数などを取得できます。詳細については、集計とSQL クエリを参照してください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得する場合は、ParallelScan および ComputeSplits オペレーションを呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。