Utilice Tablestore SDK for Python para realizar agregaciones métricas y agrupamientos en los resultados de un índice de búsqueda.
Requisitos previos
Instale Tablestore SDK for Python e inicialice un cliente.
La función de agregación requiere la versión 5.2.1 del SDK o posterior. Se recomienda utilizar la versión más reciente del SDK.
Descripción
La agregación calcula métricas o crea grupos a partir de los resultados de consulta de un índice de búsqueda. Agregue objetos de agregación métrica a SearchQuery.aggs y objetos de agrupamiento a SearchQuery.group_bys. Cada name en una solicitud debe ser único e identifica el resultado correspondiente en la respuesta. Para obtener únicamente los resultados de la agregación, establezca limit en 0.
|
Función |
Descripción |
|
Min, Max, Sum, Avg |
Calculan el valor mínimo, máximo, la suma y el promedio. |
|
Count, DistinctCount |
Cuentan filas con valores de campo no vacíos y valores de campo distintos. |
|
Percentiles |
Calculan uno o más percentiles. |
|
TopRows |
Devuelven las filas principales ordenadas en cada grupo como una subagregación. |
|
GroupByField, GroupByComposite |
Agrupan por el valor de un campo o por una combinación de campos. |
|
GroupByRange, GroupByGeoDistance, GroupByFilter |
Agrupan por rango numérico, distancia geográfica o condiciones de filtro. |
|
GroupByHistogram, GroupByDateHistogram, GroupByGeoGrid |
Crean histogramas numéricos, histogramas de fechas o grupos de cuadrícula GeoHash. |
Los campos del índice de búsqueda utilizados para la agregación deben tener habilitadas las opciones de ordenamiento y agregación. Los tipos de campo compatibles varían según el tipo de agregación y agrupamiento. Es posible configurar hasta cinco agrupamientos en el mismo nivel. El recuento distinto, los percentiles y el agrupamiento por campo utilizan cálculos aproximados. Un gran número de agregaciones o agregaciones anidadas profundamente incrementa la complejidad y la latencia de la solicitud.
El siguiente ejemplo calcula el valor mínimo, máximo y promedio de price y agrupa las filas por category.
search_query = SearchQuery(
MatchAllQuery(),
limit=0,
aggs=[
Min("price", name="min_price"),
Max("price", name="max_price"),
Avg("price", name="avg_price"),
],
group_bys=[
GroupByField("category", name="by_category"),
],
)
response = client.search(
"example_table",
"example_index",
search_query,
)
for result in response.agg_results:
print(result.name, result.value)
for result in response.group_by_results:
print(result.name, result.items)
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 principal. |
|
routing_keys (opcional) |
|
Valores de clave principal de los campos de enrutamiento personalizados. Este parámetro no es necesario si no se ha configurado un 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 relacionados con la agregación.
|
Nombre |
Tipo |
Descripción |
|
query (obligatorio) |
|
Condición de consulta que determina el alcance de la agregación. Utilice |
|
aggs (opcional) |
|
Lista de agregaciones métricas. Puede combinar agregaciones que tengan nombres diferentes. |
|
group_bys (opcional) |
|
Lista de agrupamientos. Puede combinar agrupamientos que tengan nombres diferentes. |
|
limit (opcional) |
|
Número de filas de consulta a devolver. Establezca este parámetro en |
Agregaciones métricas
Agregue los siguientes objetos a search_query.aggs. field es el campo de agregación, name identifica el resultado y missing_value se utiliza cuando falta el campo. Si no se especifica missing_value, se ignoran las filas que carecen del campo.
Min, Max y Avg
|
Nombre |
Tipo |
Descripción |
|
field (obligatorio) |
|
Campo de agregación. Tipos compatibles: |
|
missing_value (opcional) |
|
Valor que se utiliza cuando falta el campo. |
|
name (opcional) |
|
Nombre de la agregación. Valores predeterminados: |
Sum
|
Nombre |
Tipo |
Descripción |
|
field (obligatorio) |
|
Campo de agregación. Tipos compatibles: |
|
missing_value (opcional) |
|
Valor que se utiliza en la suma cuando falta el campo. |
|
name (opcional) |
|
Nombre de la agregación. Valor predeterminado: |
Count
|
Nombre |
Tipo |
Descripción |
|
field (obligatorio) |
|
Campo cuyas filas no vacías se cuentan. Tipos compatibles: |
|
name (opcional) |
|
Nombre de la agregación. Valor predeterminado: |
DistinctCount
|
Nombre |
Tipo |
Descripción |
|
field (obligatorio) |
|
Campo cuyos valores distintos se cuentan. Tipos compatibles: |
|
missing_value (opcional) |
|
Valor que se incluye en el recuento distinto cuando falta el campo. |
|
name (opcional) |
|
Nombre de la agregación. Valor predeterminado: |
Percentiles
|
Nombre |
Tipo |
Descripción |
|
field (obligatorio) |
|
Campo de agregación. Tipos compatibles: |
|
percentiles_list (obligatorio) |
|
Percentiles a calcular, como |
|
missing_value (opcional) |
|
Valor que se utiliza cuando falta el campo. |
|
name (opcional) |
|
Nombre de la agregación. Valor predeterminado: |
TopRows
|
Nombre |
Tipo |
Descripción |
|
limit (obligatorio) |
|
Número máximo de filas a devolver de cada grupo. |
|
sort (obligatorio) |
|
Orden de clasificación de las filas en cada grupo. |
|
name (opcional) |
|
Nombre de la agregación. Valor predeterminado: |
DistinctCount es aproximado. Los resultados son cercanos al valor exacto por debajo de 10,000 valores distintos, y el error es de aproximadamente 2% con 100 millones de valores. Percentiles también es aproximado; los percentiles extremos suelen ser más precisos que la mediana. Utilice TopRows únicamente como subagregación de un agrupamiento.
Agrupamiento
Agregue los siguientes objetos a search_query.group_bys. Utilice sub_aggs y sub_group_bys para realizar subagregaciones métricas y subagrupamientos en cada grupo.
GroupByField
|
Nombre |
Tipo |
Descripción |
|
field_name (obligatorio) |
|
Campo de agrupamiento. Tipos compatibles: |
|
size (opcional) |
|
Número de grupos a devolver. Valor predeterminado: |
|
group_by_sort (opcional) |
|
Reglas de ordenamiento de grupos. De forma predeterminada, los grupos se ordenan por recuento de filas en orden descendente. Son compatibles |
|
sub_aggs (opcional) |
|
Subagregaciones métricas. |
|
sub_group_bys (opcional) |
|
Subagrupamientos. |
|
name (opcional) |
|
Nombre del agrupamiento. Valor predeterminado: |
GroupByComposite
|
Nombre |
Tipo |
Descripción |
|
sources (obligatorio) |
|
Orígenes de agrupamiento multicampo. Puede especificar hasta 32 orígenes de tipo |
|
size (opcional) |
|
Número de grupos a devolver. Valor predeterminado: |
|
next_token (opcional) |
|
Token para la siguiente página de grupos. Omítalo en la primera solicitud. |
|
suggested_size (opcional) |
|
Límite flexible para escenarios de cómputo de alto throughput. No lo especifique junto con |
|
sub_aggs (opcional) |
|
Subagregaciones métricas. |
|
sub_group_bys (opcional) |
|
Subagrupamientos. |
|
name (opcional) |
|
Nombre del agrupamiento. Valor predeterminado: |
GroupByRange
|
Nombre |
Tipo |
Descripción |
|
field_name (obligatorio) |
|
Campo de agrupamiento. Tipos compatibles: |
|
ranges (obligatorio) |
|
Rangos cerrados por la izquierda y abiertos por la derecha, como |
|
sub_aggs (opcional) |
|
Subagregaciones métricas. |
|
sub_group_bys (opcional) |
|
Subagrupamientos. |
|
name (opcional) |
|
Nombre del agrupamiento. Valor predeterminado: |
GroupByGeoDistance
|
Nombre |
Tipo |
Descripción |
|
field_name (obligatorio) |
|
Campo de agrupamiento |
|
origin (obligatorio) |
|
Punto central. Los parámetros del constructor son latitud seguida de longitud. |
|
ranges (obligatorio) |
|
Rangos de distancia en metros. Cada rango es cerrado por la izquierda y abierto por la derecha. |
|
sub_aggs (opcional) |
|
Subagregaciones métricas. |
|
sub_group_bys (opcional) |
|
Subagrupamientos. |
|
name (opcional) |
|
Nombre del agrupamiento. Valor predeterminado: |
GroupByFilter
|
Nombre |
Tipo |
Descripción |
|
filters (obligatorio) |
|
Condiciones de filtro. El orden de los resultados coincide con el orden de las condiciones. |
|
sub_aggs (opcional) |
|
Subagregaciones métricas. |
|
sub_group_bys (opcional) |
|
Subagrupamientos. |
|
name (opcional) |
|
Nombre del agrupamiento. Valor predeterminado: |
GroupByHistogram
|
Nombre |
Tipo |
Descripción |
|
field_name (obligatorio) |
|
Campo de agrupamiento. Tipos compatibles: |
|
interval (obligatorio) |
|
Intervalo del histograma numérico. |
|
field_range (obligatorio) |
|
Rango de agregación. |
|
missing_value (opcional) |
|
Valor que se utiliza en el histograma cuando falta el campo. |
|
min_doc_count (opcional) |
|
Recuento mínimo de filas para un bucket. Los buckets con menos filas no se devuelven. |
|
group_by_sort (opcional) |
|
Reglas de ordenamiento de grupos. |
|
sub_aggs (opcional) |
|
Subagregaciones métricas. |
|
sub_group_bys (opcional) |
|
Subagrupamientos. |
|
name (opcional) |
|
Nombre del agrupamiento. Valor predeterminado: |
GroupByDateHistogram
|
Nombre |
Tipo |
Descripción |
|
field_name (obligatorio) |
|
Campo de agrupamiento |
|
interval (obligatorio) |
|
Intervalo de fecha u hora, compuesto por un valor y |
|
field_range (obligatorio) |
|
Rango de agregación. El servidor requiere este parámetro aunque el constructor de Python permita omitirlo. |
|
missing (opcional) |
|
Valor de fecha que se utiliza en el histograma cuando falta el campo. |
|
min_doc_count (opcional) |
|
Recuento mínimo de filas para un bucket. Los buckets con menos filas no se devuelven. |
|
time_zone (opcional) |
|
Zona horaria en formato |
|
group_by_sort (opcional) |
|
Reglas de ordenamiento de grupos. |
|
offset (opcional) |
|
Desplazamiento del límite del bucket respecto al origen predeterminado. |
|
sub_aggs (opcional) |
|
Subagregaciones métricas. |
|
sub_group_bys (opcional) |
|
Subagrupamientos. |
|
name (opcional) |
|
Nombre del agrupamiento. Valor predeterminado: |
GroupByGeoGrid
|
Nombre |
Tipo |
Descripción |
|
field_name (obligatorio) |
|
Campo de agrupamiento |
|
precision (obligatorio) |
|
Precisión de la cuadrícula GeoHash. Un número de enumeración mayor representa una cuadrícula más pequeña. |
|
size (opcional) |
|
Número de grupos de cuadrícula a devolver. |
|
sub_aggs (opcional) |
|
Subagregaciones métricas. |
|
sub_group_bys (opcional) |
|
Subagrupamientos. |
|
name (opcional) |
|
Nombre del agrupamiento. Valor predeterminado: |
GroupByComposite requiere Tablestore SDK for Python 6.4.4 o posterior. Si existen muchos grupos, especifique size y pagine mediante next_token de cada resultado hasta que el token esté vacío.
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 solo cuando |
|
return_type (opcional) |
|
Modo de columna 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. El número no excede |
|
next_token |
|
Token para la siguiente página. 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 la agregación métrica. Este campo está vacío si no se configura |
|
group_by_results |
|
Resultados del 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. |
Cada elemento en agg_results usa name y value para identificar una agregación y su valor. Cada elemento en group_by_results usa name y items para devolver claves de grupo, recuentos de filas, subagregaciones y subagrupamientos. Un resultado de GroupByComposite también contiene source_group_by_names y next_token para lecturas continuas. Las keys de cada grupo son una lista de cadenas alineada con sources; un valor de campo faltante se representa mediante None.
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 para evitar errores de desempaquetado si se extienden los campos de respuesta.
(
rows,
next_token,
total_count,
is_all_succeed,
agg_results,
group_by_results,
search_hits,
) = response.v1_response()
Ejemplos
Paginar un agrupamiento multicampo
El siguiente ejemplo agrupa por category y price, y devuelve dos grupos por página.
sources = [
GroupByField("category", name="category_source"),
GroupByField("price", name="price_source"),
]
next_token = None
all_items = []
while True:
group_by = GroupByComposite(
sources,
size=2,
next_token=next_token,
name="by_category_and_price",
)
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), limit=0, group_bys=[group_by]),
)
result = response.group_by_results[0]
all_items.extend(result.items)
next_token = result.next_token
if not next_token:
break
for item in all_items:
print(item.keys, item.row_count)
Crear un histograma de fechas y una cuadrícula geográfica
El siguiente ejemplo crea un histograma de fechas diario y agrupa ubicaciones en cuadrículas GeoHash de aproximadamente 39 km por 19 km.
group_bys = [
GroupByDateHistogram(
"event_date",
DateTimeValue(1, DateTimeUnit.DAY),
field_range=FieldRange("2026-08-01", "2026-08-04"),
name="by_day",
),
GroupByGeoGrid(
"location",
GeoHashPrecision.GHP_39KM_19KM_4,
name="by_geo_grid",
),
]
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), limit=0, group_bys=group_bys),
)
for result in response.group_by_results:
print(result.name, result.items)