Al consultar datos con un índice de búsqueda, puede aplicar un orden predefinido o especificarlo durante la consulta. Para navegar por conjuntos de resultados grandes, utilice limit/offset en la paginación por desplazamiento o tokens en la paginación por cursor.
Escenarios
Categoría | Método | Función | Escenario |
Ordenamiento | Predefina un método de ordenamiento al crear un índice de búsqueda | De forma predeterminada, los resultados se devuelven en el orden definido por el parámetro IndexSort configurado durante la creación del índice. | |
Especifique un método de ordenamiento al consultar datos | Sorting based on the BM25-based keyword relevance score (ScoreSort) | Ordene los resultados por la puntuación de relevancia BM25. Es el más indicado para búsquedas de texto completo. | |
Ordene los resultados por el valor de la clave principal. Útil cuando necesita los registros ordenados por sus identificadores únicos. | |||
Sorting based on the values of one or more columns (FieldSort) | Ordene los resultados por uno o varios valores de columna, como el volumen de ventas o las vistas de página. Se usa comúnmente en comercio electrónico, redes sociales y gestión de recursos multimedia. | ||
Ordene los resultados por la distancia desde un punto central. Diseñado para escenarios de mapas y logística; por ejemplo, para ordenar restaurantes cercanos por distancia. | |||
Paginación | Especifique un método de paginación al consultar datos | Salte a cualquier página cuando el conjunto de resultados contenga menos de 100,000 filas. | |
Recorra los resultados de forma secuencial mediante un cursor; solo puede avanzar. Los tokens siguen vigentes durante toda la consulta, por lo que puede almacenar en caché un token anterior para volver a una página previa. |
Preordenamiento de índices
De forma predeterminada, Tablestore ordena los datos de un índice de búsqueda según un orden predefinido denominado preordenamiento de índices (IndexSort). Al consultar datos, IndexSort determina el orden predeterminado de los resultados devueltos.
Cuando cree un índice de búsqueda, puede personalizar IndexSort. Si no especifica esta configuración, el índice utiliza el ordenamiento por clave principal de forma predeterminada.
El preordenamiento de índices solo admite
PrimaryKeySort(ordenamiento por clave principal) yFieldSort(ordenamiento por campo).No es posible usar el preordenamiento de índices si el índice de búsqueda contiene campos de tipo anidado.
Una vez creado el índice de búsqueda, la función dynamic schema modification le permite modificar la configuración de
IndexSort.
Especificar un método de ordenamiento
Para ordenar los datos, debe establecer enableSortAndAgg en true dentro de los campos que desea utilizar como criterio.
Puede especificar un método de ordenamiento para cada consulta. Un índice de búsqueda admite los siguientes cuatro tipos de ordenadores. También es posible combinar varios ordenadores para clasificar los resultados según una secuencia de criterios.
ScoreSort
Ordena los resultados de la consulta por su puntuación de relevancia, calculada con el algoritmo BM25. Este método es adecuado para escenarios basados en relevancia, como las búsquedas de texto completo.
Si desea ordenar por puntuación de relevancia, debe especificar
ScoreSortde manera explícita. De lo contrario, Tablestore ordena los resultados según la configuración deIndexSortdel índice.Cuando utiliza
ScoreSort, los campos de tipo FuzzyKeyword quedan excluidos del ordenamiento y el parámetroweightno surte efecto sobre ellos.
Utilice ScoreSort para clasificar los resultados por la puntuación de relevancia BM25, en orden ascendente o descendente.
sort: {
sorters: [
{
scoreSort: {
order: TableStore.SortOrder.SORT_ORDER_ASC
}
}
]
}
PrimaryKeySort
Ordena los resultados por la clave principal.
Utilice PrimaryKeySort para organizar los resultados según el valor de la clave principal.
sort: {
sorters: [
{
primaryKeySort: {
order: TableStore.SortOrder.SORT_ORDER_DESC // Sort in descending order.
//order: TableStore.SortOrder.SORT_ORDER_ASC // Sort in ascending order.
}
}
]
}
FieldSort
Utilice FieldSort para ordenar los resultados por uno o varios valores de columna.
Ordenar por una sola columna
sort: {
sorters: [
{
fieldSort: {
fieldName: "Col_Keyword",
order: TableStore.SortOrder.SORT_ORDER_DESC
}
}
]
}
Ordenar por varias columnas
Especifique varios ordenadores para clasificar primero por una columna principal y luego resolver empates con una columna secundaria.
sort: {
sorters: [
{
fieldSort: {
fieldName: "Col_Keyword",
order: TableStore.SortOrder.SORT_ORDER_DESC
}
},
{
fieldSort: {
fieldName: "Col_Long",
order: TableStore.SortOrder.SORT_ORDER_DESC
}
}
]
}
GeoDistanceSort
Ordena los resultados por la distancia desde un punto geográfico.
Utilice GeoDistanceSort para clasificar los resultados según su distancia respecto a un punto geográfico central.
sort: {
sorters: [
{
geoDistanceSort: {
fieldName: "Col_Geo_Point",
points: ["0,0"],// Specify the coordinate pair of the central point.
order: TableStore.SortOrder.SORT_ORDER_ASC // Return results in ascending order of distance.
}
}
]
}
Para ver un ejemplo completo, consulte Search en GitHub.
Especificar un método de paginación
Para paginar los resultados de una consulta, puede utilizar los parámetros limit y offset o bien un token.
Configurar los parámetros limit y offset
Paginación por desplazamiento
La paginación por desplazamiento se utiliza cuando el número total de filas por recuperar es menor a 100,000. La suma de limit y offset debe ser menor o igual a 100,000, y el valor máximo para limit es 100.
Para aumentar el umbral de limit, consulte How do I increase the limit for the Search API to 1,000?.
Si no configura los parámetros limit y offset, limit toma el valor predeterminado de 10 y offset el de 0.
Utilice offset y limit para saltar directamente a cualquier página. Este método admite conjuntos de resultados de hasta 100,000 filas.
/**
* Set offset to 90 and limit to 10 to retrieve rows 90–99.
*/
client.search({
tableName: TABLE_NAME,
indexName: INDEX_NAME,
searchQuery: {
offset: 90,
limit: 10,
query: {
queryType: TableStore.QueryType.MATCH_ALL_QUERY
},
getTotalCount: true // Return the total number of matching rows. Default: false.
},
columnToGet: {
// RETURN_ALL: return all columns.
// RETURN_SPECIFIED: return specified columns.
// RETURN_NONE: return primary key columns only.
returnType: TableStore.ColumnReturnType.RETURN_ALL
}
}, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', JSON.stringify(data, null, 2));
});
Usar un token
Se recomienda la paginación por token para consultas profundas porque no tiene límite de profundidad.
Si una respuesta no contiene todos los datos coincidentes, el servidor devuelve un nextToken.
De forma predeterminada, la paginación por token solo permite avanzar entre los resultados. Sin embargo, dado que un token sigue vigente durante todo el proceso de consulta, puede almacenar en caché un token anterior para retroceder.
La paginación por token devuelve los resultados página por página mediante un cursor (NextToken). Cada respuesta incluye un token para la página siguiente. Los tokens son válidos mientras dure la consulta, así que almacene en caché un token anterior para regresar a una página previa.
Para conservar NextToken o pasarlo a una página de frontend, codifíquelo como una cadena Base64. Los tokens son datos binarios (flujo de bytes), no cadenas de texto; si utiliza string(NextToken) perderá datos. Conviértalos con Buffer:
Codificación:
data.nextToken.toString("base64")Decodificación:
Buffer.from(base64String, "base64")
Cuando pagina con un token, el orden de clasificación es el mismo que en la solicitud anterior, ya sea el IndexSort predeterminado o un orden personalizado. Por lo tanto, no puede configurar el parámetro Sort al usar un token. Tampoco puede establecer un offset, ya que los datos solo se leen de forma secuencial.
Un índice de búsqueda que contiene un campo de tipo anidado no es compatible con el preordenamiento de índices. Si necesita paginar los resultados de este tipo de índice, debe especificar un orden de clasificación en la consulta. De lo contrario, el servidor no devolverá un nextToken aunque haya más datos disponibles.
A continuación se muestran ejemplos de paginación por token en modos síncrono y asíncrono. Ambos utilizan el mismo objeto params inicial.
var params = {
tableName: TABLE_NAME,
indexName: INDEX_NAME,
searchQuery: {
offset: 0,
limit: 10,
token: null, // Set to nextToken from the previous response to fetch the next page.
query: {
queryType: TableStore.QueryType.MATCH_ALL_QUERY
},
getTotalCount: true
},
columnToGet: {
returnType: TableStore.ColumnReturnType.RETURN_SPECIFIED,
returnNames: ["pic_tag", "pic_description", "time_stemp", "pos"]
}
};
/**
* Synchronous mode: await each page before fetching the next.
*/
(async () => {
try {
var data = await client.search(params);
console.log('success:', JSON.stringify(data, null, 2));
while (data.nextToken && data.nextToken.length) {
// Encode the binary token as Base64 for storage or transfer,
// then decode it back to binary before passing it as the next token.
var nextToken = data.nextToken.toString("base64");
var token = Buffer.from(nextToken, "base64");
params.searchQuery.token = token;
data = await client.search(params);
console.log('token success:', JSON.stringify(data, null, 2));
}
} catch (error) {
console.log(error);
}
})()
/**
* Asynchronous mode: use callbacks to fetch the next page.
*/
client.search(params, function (err, data) {
console.log('success:', JSON.stringify(data, null, 2));
if (data.nextToken && data.nextToken.length) {
// Encode and decode the token the same way as in synchronous mode.
var nextToken = data.nextToken.toString("base64");
var token = Buffer.from(nextToken, "base64");
params.searchQuery.token = token;
client.search(params, function (err, data) {
console.log('token success:', JSON.stringify(data, null, 2));
});
}
});