すべてのプロダクト
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 は、マッピングや物流などの業界で使用されます。たとえば、場所の周りのレストランを、その場所からの距離に基づいてソートできます。

ページング

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

Limit パラメーターと Offset パラメーターを設定する

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

トークンを使用する

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

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

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

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

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

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

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

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

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

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

ScoreSort

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

重要

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

var searchQuery = new SearchQuery();
searchQuery.Sort = new Sort(new List<ISorter>() { new ScoreSort() });
// クエリ結果を関連性スコアでソートします。

PrimaryKeySort

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

// プライマリキーの値に基づいて昇順でクエリ結果をソートします。
var searchQuery = new SearchQuery();
searchQuery.Sort = new Sort(new List<ISorter>() { new PrimaryKeySort() });

// プライマリキーの値に基づいて降順でクエリ結果をソートします。
var searchQuery = new SearchQuery();
searchQuery.Sort = new Sort(new List<ISorter>() { new PrimaryKeySort(SortOrder.DESC) });

FieldSort

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

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

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

var searchQuery = new SearchQuery();
var fieldSort = new FieldSort("col", SortOrder.ASC);
searchQuery.Sort = new Sort(new List<ISorter>() { fieldSort });

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

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

var searchQuery = new SearchQuery();
var col1Sort = new FieldSort("col", SortOrder.ASC);
var col2Sort = new FieldSort("co2", SortOrder.ASC);
searchQuery.Sort = new Sort(new List<ISorter>() { col1Sort, col2Sort });

GeoDistanceSort

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

var searchQuery = new SearchQuery();
var geoDistanceSort = new GeoDistanceSort("geoCol", new List<string>(){"0","0"});
searchQuery.Sort = new Sort(new List<ISorter>() { geoDistanceSort });

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

Limit パラメーターと Offset パラメーターを設定するか、トークンを使用してレスポンスの行をページングできます。

Limit パラメーターと Offset パラメーターに基づくページング

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

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

var searchQuery = new SearchQuery();
searchQuery.Query = new MatchAllQuery();
searchQuery.Limit = 100;
searchQuery.Offset = 100;

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

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

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

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

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

重要

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

/// <summary>
/// この例では、トークンを使用してレスポンスの行をページングし、Tablestore はすべてのデータを読み取ってリストで返します。
/// </summary>
/// <param name="otsClient"></param>
public static SearchResponse ReadMoreRowsWithToken(OTSClient otsClient)
{
    var searchQuery = new SearchQuery();
    searchQuery.Query = new MatchAllQuery();

    var request = new SearchRequest(TableName, IndexName, searchQuery);

    var response = otsClient.Search(request);
    var rows = response.Rows;
    while (response.NextToken != null) // レスポンスで NextToken が null の場合、すべてのデータが読み取られます。
    {
        request.SearchQuery.Token = response.NextToken;
        response = otsClient.Search(request);
        rows.AddRange(response.Rows);
    }

    return response;
}

FAQ

参考資料

  • 検索インデックスを使用してデータをクエリする場合、次のクエリ方法を使用できます。 タームクエリタームズクエリすべて一致クエリ一致クエリ一致フレーズクエリプレフィックスクエリ範囲クエリワイルドカードクエリブールクエリジオクエリネストされたクエリ存在クエリ。ビジネス要件に基づいて、さまざまなクエリ方法を使用して複数のディメンションからデータをクエリできます。

    ソート機能とページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングを参照してください。

    折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。このようにして、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。

  • データテーブルのデータを分析する場合は、Search オペレーションの集計機能を使用するか、SQL ステートメントを実行できます。たとえば、最小値、最大値、合計、行の総数などを取得できます。詳細については、集計SQL クエリを参照してください。

  • 行をソートせずにクエリ条件を満たすすべての行を取得する場合は、ParallelScan オペレーションと ComputeSplits オペレーションを呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。