クエリ結果の順序に要件がない場合は、パラレル スキャン機能を使用してクエリ結果を効率的に取得できます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
パラメーター
パラメーター | 説明 | |
tableName | データテーブルの名前。 | |
indexName | 検索インデックスの名前。 | |
scanQuery | query | 検索インデックスのクエリステートメント。この操作は、Search 操作と同様に、タームクエリ、あいまいクエリ、範囲クエリ、地理クエリ、およびネストされたクエリをサポートします。 |
limit | 各 ParallelScan 呼び出しで返されることができる行の最大数。 | |
maxParallel | リクエストごとのパラレル スキャンタスクの最大数。リクエストごとのパラレル スキャンタスクの最大数は、データ量によって異なります。データ量が多いほど、リクエストごとのパラレル スキャンタスクが多くなります。ComputeSplits 操作を使用して、リクエストごとのパラレル スキャンタスクの最大数をクエリできます。 | |
currentParallelId | リクエスト内のパラレル スキャンタスクの ID。有効な値: [0, maxParallel の値) | |
token | クエリ結果をページ分割するために使用されるトークン。ParallelScan リクエストの結果には、次のページのトークンが含まれています。トークンを使用して次のページを取得できます。 | |
aliveTime | 現在のパラレル スキャンタスクの有効期間。この有効期間は、トークンの有効期間でもあります。単位: 秒。デフォルト値: 60。単位: 秒。デフォルト値を使用することをお勧めします。有効期間内に次のリクエストが開始されない場合、それ以上のデータはクエリできません。リクエストを送信するたびにトークンの有効時間が更新されます。 説明 スキーマでスイッチインデックスが動的に変更された場合、単一サーバーに障害が発生した場合、またはサーバーエンドの負荷分散が実行された場合、セッションは期限前に期限切れになります。この場合、セッションを再作成する必要があります。 | |
columnsToGet | グループ化結果で返される列の名前。列名を Columns に追加できます。 検索インデックス内のすべての列を返す場合は、より簡潔な ReturnAllFromIndex 操作を使用できます。 重要 ReturnAll はここでは使用できません。 | |
sessionId | パラレル スキャンタスクのセッション ID。ComputeSplits 操作を呼び出してセッションを作成し、パラレル スキャンリクエストでサポートされているパラレル スキャンタスクの最大数をクエリできます。 |
例
次のサンプルコードは、パラレル スキャンを実行する方法の例を示しています。
// 1. セッションIDを取得します。
let computeSplits = await new Promise((resolve, reject) => {
client.computeSplits({
tableName: tableName,
searchIndexSplitsOptions: {
indexName: indexName,
}
}, function (err, data) {
if (err) {
console.log('computeSplits エラー:', err.toString());
reject(err);
} else {
console.log('computeSplits 成功:', data);
resolve(data)
}
})
})
// 2. クエリ条件を指定します。
const scanQuery = {
query: {
queryType: TableStore.QueryType.MATCH_ALL_QUERY,
},
limit: 1000,
aliveTime: 30,
token: undefined,
currentParallelId: 0,
maxParallel: 1,
}
// 3. ParallelScan リクエストを作成します。この例では、同期リクエストが作成されます。ビジネス要件に基づいて非同期リクエストを作成できます。
const parallelScanPromise = function () {
return new Promise(function (resolve, reject) {
client.parallelScan({
tableName: tableName,
indexName: indexName,
columnToGet: {
returnType: TableStore.ColumnReturnType.RETURN_ALL_FROM_INDEX,
},
sessionId: computeSplits.sessionId,
scanQuery: scanQuery,
}, function (err, data) {
if (err) {
console.log('parallelScan エラー:', err.toString());
reject(err);
} else {
console.log("parallelScan, 行数:", data.rows.length)
resolve(data)
}
});
})
}
let totalCount = 0 // クエリ条件を満たす行の総数が返されるように指定します。
let parallelScanResponse = await parallelScanPromise()
totalCount = totalCount + parallelScanResponse.rows.length
// 4. すべてのデータがプルされるまで、イテレータを使用してデータをプルします。
while (parallelScanResponse.nextToken !== null && parallelScanResponse.nextToken.length > 0) {
scanQuery.token = parallelScanResponse.nextToken
parallelScanResponse = await parallelScanPromise()
totalCount += parallelScanResponse.rows.length
}
console.log("合計行数:", totalCount)
FAQ
参考資料
検索インデックスでは、次のクエリタイプがサポートされています。タームクエリ、複数タームクエリ、すべてに一致するクエリ、一致クエリ、一致フレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、ブールクエリ、地理クエリ、ネストされたクエリ、ベクトル クエリ、存在クエリ。ビジネス要件に基づいてクエリタイプを選択してデータをクエリできます。
クエリ条件を満たす行を並べ替えたりページ分割したりする場合は、並べ替えとページ分割機能を使用できます。詳細については、並べ替えとページ分割を参照してください。
特定の列に基づいて結果セットを折りたたむ場合は、折りたたみ (個別) 機能を使用できます。このようにして、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ (個別)を参照してください。
データテーブルのデータ (極値、合計、行の総数など) を分析する場合は、集計操作を実行するか、SQL ステートメントを実行できます。詳細については、集計とSQL クエリを参照してください。
行を並べ替えることなく、クエリ条件を満たすすべての行をすばやく取得する場合は、ParallelScan 操作と ComputeSplits 操作を呼び出して、パラレル スキャン機能を使用できます。詳細については、パラレル スキャンを参照してください。