クエリ結果の順序に要件がない場合は、パラレル スキャン機能を使用してクエリ結果を効率的に取得できます。
Tablestore SDK for PHP V5.1.0 以降では、パラレル スキャン機能がサポートされています。パラレル スキャン機能を使用する前に、Tablestore SDK for PHP V5.1.0 以降を取得していることを確認してください。Tablestore SDK for PHP のバージョン履歴については、Tablestore SDK for PHP のバージョン履歴を参照してください。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成されていること。データがテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
パラメーター
パラメーター | 説明 | |
table_name | データテーブルの名前。 | |
index_name | 検索インデックスの名前。 | |
scan_query | query | クエリのタイプ。この操作では、Search 操作でサポートされているものと同様の、用語クエリ、あいまいクエリ、範囲クエリ、地理クエリ、およびネストされたクエリがサポートされています。 |
limit | 各 ParallelScan 呼び出しで返されることができる行の最大数。 | |
max_parallel | リクエストあたりのパラレル スキャン タスクの最大数。リクエストあたりのパラレル スキャン タスクの最大数は、データ量によって異なります。データ量が多いほど、リクエストあたりのパラレル スキャン タスクが多くなります。ComputeSplits 操作を使用して、リクエストあたりのパラレル スキャン タスクの最大数をクエリできます。 | |
current_parallel_id | リクエスト内のパラレル スキャン タスクの ID。有効な値: [0, max_parallel)。 | |
token | クエリ結果をページ分割するために使用されるトークン。ParallelScan リクエストの結果には、次のページのトークンが含まれています。トークンを使用して次のページを取得できます。 | |
alive_time | 現在のパラレル スキャン タスクの有効期間。この有効期間は、トークンの有効期間でもあります。単位: 秒。デフォルト値: 60。デフォルト値を使用することをお勧めします。有効期間内に次のリクエストが開始されない場合、それ以上のデータはクエリできません。リクエストを送信するたびに、トークンの有効時間が更新されます。 説明 ソースインデックスとカナリアインデックスのスキーマが切り替えられた場合、単一サーバーに障害が発生した場合、またはサーバーエンドの負荷分散が実行された場合、セッションは早期に期限切れになります。この場合、セッションを再作成する必要があります。 | |
columns_to_get | クエリ条件を満たす各行について返す列の名前。 検索インデックスのすべての列を返すには、return_type パラメーターを RETURN_ALL_FROM_INDEX に設定します。 | |
session_id | パラレル スキャン タスクのセッション ID。ComputeSplits 操作を呼び出してセッションを作成し、パラレル スキャン リクエストでサポートされているパラレル スキャン タスクの最大数をクエリできます。 |
例
次のサンプルコードは、検索インデックスのパラレル スキャン機能の使用方法の例を示しています。
// 1. セッション ID を取得します。
$computeSplitsPointReq = array(
'table_name' => 'php_sdk_test',
'search_index_splits_options' => array(
'index_name' => 'test_create_search_index'
)
);
$computeSplits = $otsClient->computeSplits($computeSplitsPointReq);
print json_encode ($computeSplits, JSON_PRETTY_PRINT);
// 2. クエリ条件を指定します。
$scanQuery = array(
'query' => array(
'query_type' => QueryTypeConst::MATCH_ALL_QUERY
),
'limit' => 2,
'alive_time' => 30,
'token' => null,
'current_parallel_id' => 0,
'max_parallel' => 1
);
//3. ParallelScan リクエストを構築します。
$parallelScanReq = array(
'table_name' => 'php_sdk_test',
'index_name' => 'test_create_search_index',
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX, // parallel_scan では RETURN_ALL は許可されていません。RETURN_ALL_FROM_INDEX を使用してください。
'return_names' => array('geo', 'text', 'long', 'keyword')
),
'session_id' => $computeSplits['session_id'],
'scan_query' => $scanQuery
);
$parallelScanRes = $otsClient->parallelScan($parallelScanReq);
print json_encode ($parallelScanRes['rows'], JSON_PRETTY_PRINT);
//4. トークンベースのページネーションを使用してデータをエクスポートします。この例では、行の総数のみが収集されます。
$totalCount = count($parallelScanRes['rows']);
while (!is_null($parallelScanRes['next_token'])) {
$parallelScanReq['scan_query']['token'] = $parallelScanRes['next_token'];
$parallelScanRes = $otsClient->parallelScan($parallelScanReq);
print json_encode ($parallelScanRes['rows'], JSON_PRETTY_PRINT);
$totalCount += count($parallelScanRes['rows']);
}
print "TotalCount: " . $totalCount;