Utilice Tablestore SDK for Python para controlar el orden de los resultados del índice de búsqueda y paginarlos mediante offset o next_token.
Requisitos previos
Instale Tablestore SDK for Python e inicialice un cliente.
Descripción
Los índices de búsqueda admiten preordenamiento de índice y ordenamiento en tiempo de consulta. Al crear un índice de búsqueda, utilice index_sort para especificar el orden predeterminado. Si no se especifica index_sort, las filas se ordenan por clave primaria. El preordenamiento de índice solo admite PrimaryKeySort y FieldSort, y no es compatible con índices que contienen un campo Nested. Después de la creación, puede actualizar dinámicamente el esquema para modificar el preordenamiento del índice. Durante la consulta, utilice SearchQuery.sort para especificar ScoreSort, PrimaryKeySort, FieldSort o GeoDistanceSort, o bien combine varios ordenadores según el orden de la lista. A excepción de las claves primarias, los campos de ordenamiento deben tener habilitadas las opciones de ordenamiento y agregación al momento de crear el índice.
|
Método de paginación |
Descripción |
|
limit y offset |
Utilícelo cuando los resultados no superen las 100,000 filas y necesite saltar a una posición específica. La suma de |
|
next_token |
Apropiado para paginación profunda o lectura secuencial de todos los resultados. La profundidad de paginación no está sujeta al límite de 100,000 filas, pero las páginas solo pueden leerse de forma secuencial. |
El siguiente ejemplo devuelve las primeras 10 filas ordenadas por score en orden descendente y luego por clave primaria en orden ascendente.
sort = Sort([
FieldSort("score", SortOrder.DESC),
PrimaryKeySort(SortOrder.ASC),
])
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), sort=sort, limit=10),
ColumnsToGet(return_type=ColumnReturnType.ALL),
)
print(response.rows)
Parámetros
Solicitud de búsqueda
El método search contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
table_name (obligatorio) |
|
Nombre de la tabla de datos. |
|
index_name (obligatorio) |
|
Nombre del índice de búsqueda. |
|
search_query (obligatorio) |
|
Condición de consulta y configuraciones comunes de la consulta. |
|
columns_to_get (opcional) |
|
Configuración de columnas a devolver. Si no se especifica este parámetro, solo se devuelven las columnas de clave primaria. |
|
routing_keys (opcional) |
|
Valores de clave primaria de los campos de enrutamiento personalizado. Este parámetro no es necesario si no se ha configurado el enrutamiento personalizado. |
|
timeout_s (opcional) |
|
Tiempo de espera de la solicitud en segundos. Si no se especifica este parámetro, se utiliza el tiempo de espera a nivel de cliente. |
Configuración de consulta
search_query es de tipo SearchQuery y contiene los siguientes parámetros de ordenamiento y paginación.
|
Nombre |
Tipo |
Descripción |
|
query (obligatorio) |
|
Condición de consulta. |
|
sort (opcional) |
|
Configuración de ordenamiento en tiempo de consulta. Si se omite, se utiliza el preordenamiento del índice. No lo especifique cuando utilice |
|
offset (opcional) |
|
Desplazamiento. Valor predeterminado: |
|
limit (opcional) |
|
Número máximo de filas a devolver. Valor predeterminado: |
|
next_token (opcional) |
|
Token de paginación. Omítalo en la primera solicitud y utilice el |
|
get_total_count (opcional) |
|
Especifica si se debe devolver el número total de filas coincidentes. Valor predeterminado: |
Configuración de ordenamiento
search_query.sort es de tipo Sort y contiene el siguiente parámetro.
|
Nombre |
Tipo |
Descripción |
|
sorters (obligatorio) |
|
Lista de ordenadores. El orden de la lista determina la prioridad del ordenamiento multinivel. Los tipos de ordenador compatibles son |
Ordenamiento por puntuación de relevancia
Si search_query.sort.sorters[] es de tipo ScoreSort, las filas se ordenan por puntuación de relevancia. ScoreSort contiene el siguiente parámetro.
|
Nombre |
Tipo |
Descripción |
|
sort_order (opcional) |
|
Orden de clasificación. Valor predeterminado: |
Ordenamiento por clave primaria
Si search_query.sort.sorters[] es de tipo PrimaryKeySort, las filas se ordenan por clave primaria. PrimaryKeySort contiene el siguiente parámetro.
|
Nombre |
Tipo |
Descripción |
|
sort_order (opcional) |
|
Orden de clasificación. Valor predeterminado: |
Ordenamiento por campo
Si search_query.sort.sorters[] es de tipo FieldSort, las filas se ordenan por valor de campo. FieldSort contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
field_name (obligatorio) |
|
Nombre del campo de ordenamiento. El campo debe tener habilitadas las opciones de ordenamiento y agregación. |
|
sort_order (opcional) |
|
Orden de clasificación. Valor predeterminado: |
|
sort_mode (opcional) |
|
Modo de selección de valores para un campo multivalor: |
|
nested_filter (opcional) |
|
Configuración de ordenamiento de campos secundarios Nested, que incluye la ruta Nested y una consulta que selecciona las filas secundarias utilizadas para el ordenamiento. |
Filtro anidado
search_query.sort.sorters[].nested_filter es de tipo NestedFilter, puede utilizarse en FieldSort o GeoDistanceSort, y contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
path (obligatorio) |
|
Ruta del campo Nested. |
|
query_filter (obligatorio) |
|
Condición de consulta que selecciona las filas secundarias Nested utilizadas para el ordenamiento. Establezca este parámetro en |
Ordenamiento por distancia geográfica
Si search_query.sort.sorters[] es de tipo GeoDistanceSort, las filas se ordenan según la distancia entre un punto geográfico y los puntos objetivo. GeoDistanceSort contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
field_name (obligatorio) |
|
Nombre del campo de ordenamiento GeoPoint. |
|
points (obligatorio) |
|
Puntos objetivo en formato |
|
sort_order (opcional) |
|
|
|
sort_mode (opcional) |
|
Modo de selección de valores cuando existen múltiples distancias: |
|
geo_distance_type (opcional) |
|
Método de cálculo de distancia. |
|
nested_filter (opcional) |
|
Configuración de ordenamiento de campos secundarios Nested. |
Columnas de retorno
columns_to_get es de tipo ColumnsToGet y contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
column_names (opcional) |
|
Nombres de las columnas de atributos a devolver. Especifique este parámetro únicamente cuando |
|
return_type (opcional) |
|
Modo de columnas de retorno. |
Respuesta
El método search devuelve SearchResponse. La siguiente tabla describe los campos principales.
|
Campo |
Tipo |
Descripción |
|
rows |
|
Filas devueltas por la consulta. La cantidad no excede el valor de |
|
next_token |
|
Token para la página siguiente. Un valor vacío indica que no hay más datos disponibles. |
|
total_count |
|
Número de filas coincidentes. El valor depende de |
|
is_all_succeed |
|
Indica si se consultaron todas las particiones del índice. Si el valor es |
|
agg_results |
|
Resultados de agregación de métricas. Este campo está vacío si no se configura |
|
group_by_results |
|
Resultados de agrupamiento. Este campo está vacío si no se configura |
|
search_hits |
|
Coincidencias de búsqueda, que incluyen información extendida como filas, puntuaciones de relevancia y resaltados. |
Un valor vacío en next_token también puede indicar que la consulta no tiene un orden de clasificación determinista. total_count representa el número total de filas coincidentes, no la cantidad de filas de la página actual.
Respuesta compatible con tuplas
A partir de Tablestore SDK for Python 5.2.0, las API de búsqueda devuelven objetos de respuesta en lugar de tuplas. La versión 5.1.0 y anteriores devuelven tuplas directamente. En la versión 5.2.1 y posteriores, puede llamar a SearchResponse.v1_response() para obtener una tupla compatible con versiones anteriores. Para código nuevo, acceda directamente a los atributos de SearchResponse con el fin de evitar errores de desempaquetado si se amplían los campos de respuesta.
(
rows,
next_token,
total_count,
is_all_succeed,
agg_results,
group_by_results,
search_hits,
) = response.v1_response()
Ejemplos
Ordenar por distancia geográfica
El siguiente ejemplo devuelve resultados ordenados del más cercano al más lejano según la distancia esférica entre location y 30.25,120.16.
sort = Sort([
GeoDistanceSort(
"location",
["30.25,120.16"],
sort_order=SortOrder.ASC,
sort_mode=SortMode.MIN,
geo_distance_type=GeoDistanceType.ARC,
)
])
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), sort=sort, limit=10),
)
print(response.rows)
Paginar mediante next_token
Especifique el orden de clasificación en la primera solicitud. En las solicitudes posteriores, pase únicamente el next_token de la respuesta anterior y la misma condición de consulta hasta que el token esté vacío.
query = MatchAllQuery()
response = client.search(
"example_table",
"example_index",
SearchQuery(query, sort=Sort([PrimaryKeySort()]), limit=100),
)
all_rows = list(response.rows)
while response.next_token:
response = client.search(
"example_table",
"example_index",
SearchQuery(query, next_token=response.next_token, limit=100),
)
all_rows.extend(response.rows)
print(len(all_rows))
Al paginar mediante next_token, no especifique offset, ya que no es posible saltar páginas directamente. Para retroceder, almacene en caché el token utilizado para cada página y vuelva a consultar con el token correspondiente a la página deseada. Un índice de búsqueda que contiene un campo Nested carece de preordenamiento de índice. Especifique explícitamente sort en la primera solicitud; de lo contrario, el servidor no devolverá next_token.