Nivel 2 · 25 min
Aggregations
Las aggregations de Elasticsearch transforman tus datos en analytics: conteos, sumas, histogramas y facetas multidimensionales. Entender las tres familias de aggregations y cómo combinarlas es esencial para construir dashboards y facetas de búsqueda.
Metric Aggregations
Las metric aggregations calculan valores numéricos de un conjunto de documentos. Métricas de un solo valor: avg, sum, max, min, cardinality (conteo aproximado de distintos via HyperLogLog), value_count. Métricas multi-valor: stats (min, max, avg, sum, count en un solo pasaje), extended_stats (agrega variance, std_deviation), percentiles (aproximado via TDigest), percentile_ranks. Cardinality y percentiles usan algoritmos probabilísticos: intercambian precisión por eficiencia de memoria. El parámetro precision_threshold en cardinality controla este trade-off.
Bucket Aggregations
Las bucket aggregations agrupan documentos en buckets y opcionalmente aplican sub-aggregations dentro de cada bucket. terms agrupa por valor de campo — top N valores por conteo de documentos. date_histogram crea buckets temporales (calendar_interval: day/week/month o fixed_interval: 1h/7d). range crea rangos numéricos personalizados. nested maneja campos de array-de-objetos. La composite aggregation pagina a través de todas las combinaciones únicas de múltiples campos.
Pipeline Aggregations
Las pipeline aggregations operan sobre la salida de otras aggregations en lugar de directamente sobre documentos. Parent pipeline aggregations calculan valores por bucket de una aggregation padre: derivative (tasa de cambio entre buckets), moving_avg (promedio móvil), cumulative_sum. Sibling pipeline aggregations calculan un único valor de todos los buckets: max_bucket, min_bucket, avg_bucket, bucket_selector (filtra buckets basándose en sus valores métricos). Las pipeline aggregations permiten analytics avanzados como detección de anomalías y análisis de tendencias.
Code example
POST /orders/_search\n{\n "size": 0,\n "query": {"range": {"date": {"gte": "now-30d"}'}'},\n "aggs": {\n "by_category": {\n "terms": {"field": "category", "size": 5},\n "aggs": {\n "total_revenue": {"sum": {"field": "price"}'}',\n "avg_price": {"avg": {"field": "price"}'}'\n }\n }\n }\n}