DeepPageingIterator le permite recorrer conjuntos de resultados grandes sin necesidad de rastrear los ID de scroll. Cada llamada a hasNext() y next() gestiona automáticamente la sesión de scroll subyacente, lo que le permite concentrarse en el procesamiento de los resultados en lugar del estado de la sesión.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una aplicación de OpenSearch con al menos una tabla donde se puedan realizar búsquedas
Un usuario de RAM con los permisos obligatorios (consulte Reglas de autorización de acceso)
El SDK de OpenSearch para Java V4.0.0 agregado a su proyecto
Configurar las credenciales
Almacene su par de AccessKey como variables de entorno. No codifique las credenciales directamente en el código fuente.
Linux y macOS
export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
Reemplace <access_key_id> y <access_key_secret> con el ID de AccessKey y el secreto de AccessKey de su usuario de RAM.
Windows
Cree un archivo de variables de entorno y agregue
ALIBABA_CLOUD_ACCESS_KEY_IDyALIBABA_CLOUD_ACCESS_KEY_SECRETcon su ID de AccessKey y su secreto de AccessKey.Reinicie Windows para que los cambios surtan efecto.
El par de AccessKey de una cuenta de Alibaba Cloud tiene acceso a todas las operaciones de la API. Utilice un usuario de Resource Access Management (RAM) para las llamadas a la API y las tareas rutinarias de operación y mantenimiento. Para obtener más información sobre cómo crear un usuario de RAM, consulte Crear un usuario de RAM y Crear un par de AccessKey. Si utiliza un usuario de RAM, asegúrese de que el rol AliyunServiceRoleForOpenSearch cuente con los permisos obligatorios. Consulte AliyunServiceRoleForOpenSearch.
Limitaciones
Las consultas scroll presentan las siguientes restricciones:
No se admiten las cláusulas
aggregate,distinctyrank.La ordenación solo es compatible con un único campo.
El parámetro
starten la cláusula de configuración no tiene efecto; siempre se utiliza el valor predeterminado0.
Funcionamiento
El SDK construye la sesión de scroll mediante una cadena de objetos:
OpenSearch: se inicializa con sus credenciales y el endpoint de la APIOpenSearchClient: envuelve el objetoOpenSearchSearcherClient: envuelve el objetoOpenSearchClientConfig: define el nombre de la aplicación, los resultados por página, los campos de retorno y el formato de datosSearchParams: contiene la consulta, el filtro y las condiciones de ordenación, además de un objetoDeepPagingDeepPageingIterator: controla el bucle de scroll; cada llamada anext()obtiene la siguiente página y avanza el ID de scroll automáticamente
Determine si se ha producido un error basándose en el código y el mensaje de error, no en el campo de estado. Consulte Error codes .
Implementar consultas iterativas scroll
El siguiente ejemplo utiliza el SDK de OpenSearch para Java V4.0.0. DeepPageingIterator gestiona el ID de scroll automáticamente, por lo que no es necesario pasar un ID de scroll entre solicitudes.
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());
}
}
}
Parámetros clave
|
Parámetro |
Método |
Descripción |
Valor predeterminado |
|
Resultados por página |
|
Número de documentos devueltos por página |
— |
|
Formato de datos |
|
Formato de retorno: |
— |
|
Campos de retorno |
|
Lista de campos incluidos en cada resultado |
— |
|
Consulta |
|
Cláusula de consulta; especifique todos los campos de índice en una sola llamada |
— |
|
Filtro |
|
Condición de filtro aplicada a los resultados |
— |
|
Ordenación |
|
Campo y dirección de ordenación; las consultas scroll solo admiten un campo |
— |
|
Intervalo de paginación |
|
Retraso entre la obtención de páginas, en milisegundos |
100 ms |