Si l'ordre des résultats de la requête n'a pas d'importance, utilisez la fonctionnalité d'analyse parallèle pour obtenir les résultats efficacement.
Prérequis
Initialisez une instance OTSClient. Pour plus d'informations, consultez la rubrique Initialiser une instance OTSClient.
Créez une table de données et écrivez-y des données. Pour plus d'informations, consultez les rubriques Créer des tables de données et Écrire des données.
Créez un index de recherche pour la table de données. Pour plus d'informations, consultez la rubrique Créer un index de recherche.
Paramètres
|
Paramètre |
Description |
|
|
tableName |
Nom de la table de données. |
|
|
indexName |
Nom de l'index de recherche. |
|
|
scanQuery |
query |
Instruction de requête pour l'index de recherche. L'opération prend en charge les requêtes term, fuzzy, range, geo et nested, similaires à celles de l'opération Search. |
|
limit |
Nombre maximal de lignes renvoyées par chaque appel ParallelScan. |
|
|
maxParallel |
Nombre maximal de tâches d'analyse parallèle par requête. Ce nombre varie selon le volume de données : plus le volume est important, plus le nombre de tâches requis est élevé. Utilisez l'opération ComputeSplits pour connaître le nombre maximal de tâches d'analyse parallèle par requête. |
|
|
currentParallelId |
ID de la tâche d'analyse parallèle dans la requête. Valeurs possibles : [0, valeur de maxParallel). |
|
|
token |
Jeton utilisé pour paginer les résultats de la requête. Les résultats de la requête ParallelScan contiennent le jeton de la page suivante. Utilisez ce jeton pour récupérer la page suivante. |
|
|
aliveTime |
Durée de validité de la tâche d'analyse parallèle actuelle, qui correspond également à celle du jeton. Unité : secondes. Valeur par défaut : 60. Il est recommandé d'utiliser la valeur par défaut. Si vous n'initiez pas la requête suivante dans le délai de validité, vous ne pourrez plus interroger de données. La durée de validité du jeton est actualisée à chaque envoi de requête. Remarque
Les sessions expirent prématurément en cas de modification dynamique des index de commutation dans les schémas, de défaillance d'un serveur ou d'exécution d'un équilibrage de charge côté serveur. Dans ce cas, recréez les sessions. |
|
|
columnsToGet |
Nom de la colonne à renvoyer dans le résultat de regroupement. Ajoutez le nom de la colonne à Columns. Pour renvoyer toutes les colonnes de l'index de recherche, utilisez l'opération plus concise ReturnAllFromIndex. Important
ReturnAll ne peut pas être utilisé ici. |
|
|
sessionId |
ID de session de la tâche d'analyse parallèle. Appelez l'opération ComputeSplits pour créer une session et connaître le nombre maximal de tâches d'analyse parallèle prises en charge par la requête d'analyse parallèle. |
|
Exemples
L'exemple de code suivant montre comment effectuer une analyse parallèle :
// 1. Obtain the session ID.
let computeSplits = await new Promise((resolve, reject) => {
client.computeSplits({
tableName: tableName,
searchIndexSplitsOptions: {
indexName: indexName,
}
}, function (err, data) {
if (err) {
console.log('computeSplits error:', err.toString());
reject(err);
} else {
console.log('computeSplits success:', data);
resolve(data)
}
})
})
// 2. Specify query conditions.
const scanQuery = {
query: {
queryType: TableStore.QueryType.MATCH_ALL_QUERY,
},
limit: 1000,
aliveTime: 30,
token: undefined,
currentParallelId: 0,
maxParallel: 1,
}
// 3. Create a ParallelScan request. In this example, a synchronous request is created. You can create an asynchronous request based on your business requirement.
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 error:', err.toString());
reject(err);
} else {
console.log("parallelScan, rows:", data.rows.length)
resolve(data)
}
});
})
}
let totalCount = 0 // Specify that the total number of rows that meet the query conditions is returned.
let parallelScanResponse = await parallelScanPromise()
totalCount = totalCount + parallelScanResponse.rows.length
// 4. Pull data by using an iterator until all data is pulled.
while (parallelScanResponse.nextToken !== null && parallelScanResponse.nextToken.length > 0) {
scanQuery.token = parallelScanResponse.nextToken
parallelScanResponse = await parallelScanPromise()
totalCount += parallelScanResponse.rows.length
}
console.log("total rows:", totalCount)
FAQ
Que faire si l'appel de l'opération Search ne renvoie aucune donnée ?
Références
-
Les index de recherche prennent en charge les types de requête suivants : requête term, requête terms, requête match all, requête match, requête match phrase, requête prefix, requête range, requête wildcard, requête Boolean, requête geo, requête nested, requête vector et requête exists. Sélectionnez un type de requête adapté à vos besoins métier pour interroger les données.
Pour trier ou paginer les lignes correspondant aux conditions de la requête, utilisez la fonctionnalité de tri et de pagination. Pour plus d'informations, consultez la rubrique Tri et pagination.
Pour réduire l'ensemble des résultats en fonction d'une colonne spécifique, utilisez la fonctionnalité de réduction (distinct). Ainsi, les données du type spécifié n'apparaissent qu'une seule fois dans les résultats de la requête. Pour plus d'informations, consultez la rubrique Réduction (distinct).
Pour analyser les données d'une table de données, par exemple pour obtenir les valeurs extrêmes, la somme et le nombre total de lignes, effectuez des opérations d'agrégation ou exécutez des instructions SQL. Pour plus d'informations, consultez les rubriques Agrégation et Requête SQL.
Pour obtenir rapidement toutes les lignes correspondant aux conditions de la requête sans avoir besoin de les trier, appelez les opérations ParallelScan et ComputeSplits afin d'utiliser la fonctionnalité d'analyse parallèle. Pour plus d'informations, consultez la rubrique Analyse parallèle.