クエリ結果の順序に要件がない場合は、並列スキャン機能を使用してクエリ結果を効率的に取得できます。
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, // RETURN_ALL は parallel_scan では使用できません。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;