DeepPageingIterator vous permet de parcourir de grands ensembles de résultats sans suivre manuellement les identifiants de défilement (scroll IDs). Chaque appel à hasNext() et next() gère automatiquement la session de défilement sous-jacente, ce qui vous permet de vous concentrer sur le traitement des résultats plutôt que sur l'état de la session.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une application OpenSearch avec au moins une table interrogeable
Un utilisateur RAM disposant des autorisations requises (consultez les Règles d'autorisation d'accès)
Le SDK OpenSearch pour Java V4.0.0 ajouté à votre projet
Configurer les identifiants
Stockez votre paire AccessKey dans des variables d'environnement. Ne codez pas vos identifiants en dur dans le code source.
Linux et macOS
export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
Remplacez <access_key_id> et <access_key_secret> par l'ID AccessKey et le secret AccessKey de votre utilisateur RAM.
Windows
Créez un fichier de variables d'environnement et ajoutez les variables
ALIBABA_CLOUD_ACCESS_KEY_IDetALIBABA_CLOUD_ACCESS_KEY_SECRETavec votre ID AccessKey et votre secret AccessKey.Redémarrez Windows pour que les modifications prennent effet.
La paire AccessKey d'un compte Alibaba Cloud permet d'accéder à toutes les opérations API. Utilisez un utilisateur Resource Access Management (RAM) pour les appels API et les opérations de maintenance courantes. Pour plus de détails sur la création d'un utilisateur RAM, consultez les rubriques Créer un utilisateur RAM et Créer une paire AccessKey. Si vous utilisez un utilisateur RAM, assurez-vous que le rôle AliyunServiceRoleForOpenSearch dispose des autorisations requises. Consultez la rubrique AliyunServiceRoleForOpenSearch.
Limitations
Les requêtes par défilement présentent les contraintes suivantes :
Les clauses
aggregate,distinctetrankne sont pas prises en charge.Le tri n'est pris en charge que sur un seul champ.
Le paramètre
startde la clause config n'a aucun effet ; la valeur par défaut0est toujours utilisée.
Fonctionnement
Le SDK construit la session de défilement via une chaîne d'objets :
OpenSearch— initialisé avec vos identifiants et votre endpoint APIOpenSearchClient— encapsule l'objetOpenSearchSearcherClient— encapsule l'objetOpenSearchClientConfig— définit le nom de l'application, le nombre de résultats par page, les champs de retour et le format des donnéesSearchParams— contient la requête, les filtres et les conditions de tri, ainsi qu'un objetDeepPagingDeepPageingIterator— pilote la boucle de défilement ; chaque appel ànext()récupère la page suivante et fait avancer automatiquement l'identifiant de défilement
Déterminez si une erreur s'est produite en fonction du code d'erreur et du message, et non du champ status. Consultez Codes d'erreur.
Implémenter des requêtes itératives par défilement
L'exemple suivant utilise le SDK OpenSearch pour Java V4.0.0. DeepPageingIterator gère automatiquement les identifiants de défilement, vous n'avez donc pas besoin de transmettre un identifiant de défilement entre les requêtes.
package com.aliyun.opensearch;
import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Lists;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.search.*;
import com.aliyun.opensearch.search.DeepPageingIterator;
import java.nio.charset.Charset;
public class testScrollIterator {
// Scroll queries do not support the aggregate, distinct, or rank clause,
// and support sorting on a single field only.
private static String appName = "Name of the OpenSearch application that you want to manage";
private static String tableName = "Name of the table to which data is to be uploaded";
private static String host = "Endpoint of the OpenSearch API in your region";
public static void main(String[] args) {
// Read credentials from environment variables.
// Set the environment variables before running this example.
String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Print the file encoding and default charset for debugging.
System.out.println(String.format("file.encoding: %s", System.getProperty("file.encoding")));
System.out.println(String.format("defaultCharset: %s", Charset.defaultCharset().name()));
// Build the client chain: OpenSearch -> OpenSearchClient -> SearcherClient.
OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
OpenSearchClient serviceClient = new OpenSearchClient(openSearch);
SearcherClient searcherClient = new SearcherClient(serviceClient);
// Configure the query: application name, hits per page, return fields, and data format.
Config config = new Config(Lists.newArrayList(appName));
// The start parameter has no effect on scroll queries; default value 0 is used.
config.setStart(start);
// Return 5 documents per page.
config.setHits(5);
// Supported formats: JSON and FULLJSON.
config.setSearchFormat(SearchFormat.FULLJSON);
config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));
// Note: Set the rerank_size parameter via the setReRankSize method of the Rank class.
// Define the query, filter, and sort conditions.
SearchParams searchParams = new SearchParams(config);
// To search across multiple index fields, specify all fields in one setQuery call.
// Multiple setQuery calls overwrite each other; only the last one takes effect.
searchParams.setQuery("name:'opensearch'");
searchParams.setFilter("cate_id<=3");
Sort sorter = new Sort();
// Sort by the id field in descending order.
sorter.addToSortFields(new SortField("id", Order.DECREASE));
searchParams.setSort(sorter);
// Attach a DeepPaging object to enable scroll queries.
DeepPaging deep = new DeepPaging();
searchParams.setDeepPaging(deep);
// Create the iterator. It manages scroll IDs automatically.
DeepPageingIterator pagesIterator = new DeepPageingIterator(searcherClient, searchParams);
// Set the interval between page fetches, in milliseconds.
// The default is 100 ms. Adjust based on your throughput needs.
pagesIterator.setPagingIntervals(80);
// Iterate through all pages.
// Check error codes and messages to detect failures, not the status field.
try {
System.out.println("test");
while (pagesIterator.hasNext()) {
System.out.println("Debugging information:" + pagesIterator.next());
}
} catch (Exception ex) {
System.out.println("Error message:" + ex.getMessage());
}
}
}
Paramètres clés
| Paramètre | Méthode | Description | Valeur par défaut |
|---|---|---|---|
| Nombre de résultats par page | config.setHits(n) |
Nombre de documents renvoyés par page | — |
| Format des données | config.setSearchFormat(...) |
Format de retour : JSON ou FULLJSON |
— |
| Champs de retour | config.setFetchFields(...) |
Liste des champs inclus dans chaque résultat | — |
| Requête | searchParams.setQuery(...) |
Clause de requête ; spécifiez tous les champs d'index dans un seul appel | — |
| Filtre | searchParams.setFilter(...) |
Condition de filtre appliquée aux résultats | — |
| Tri | searchParams.setSort(...) |
Champ de tri et direction ; les requêtes par défilement ne prennent en charge qu'un seul champ | — |
| Intervalle de pagination | pagesIterator.setPagingIntervals(ms) |
Délai entre les récupérations de pages, en millisecondes | 100 ms |