Resumen

Dominar las búsquedas por rango y las agregaciones en Elasticsearch te permite filtrar documentos con precisión y calcular métricas útiles sobre tus datos. Estas dos funcionalidades son esenciales para construir aplicaciones que necesiten respuestas inteligentes a partir de grandes volúmenes de información.

¿Cómo limitar los campos que devuelve una consulta en Elasticsearch?

Antes de entrar en las consultas de rango, hay un truco muy útil: el parámetro _source [01:00]. Por defecto, Elasticsearch devuelve todos los campos de cada documento. Sin embargo, cuando solo necesitas dos o tres campos, puedes usar _source en el cuerpo de la consulta con una lista de los campos deseados.

  • Reduces el tamaño de la respuesta.
  • Mejoras la legibilidad de los resultados.
  • Útil cuando trabajas con documentos que tienen muchos campos.

Por ejemplo, si solo necesitas nombre y calificación, defines "_source": ["nombre", "calificación"] y Elasticsearch omitirá el resto de campos en la respuesta.

¿Qué es una consulta de rango y cómo se aplica a números?

Una consulta de rango (range query) permite buscar documentos cuyos valores caigan dentro de un grupo específico de valores, ya sean números o fechas [01:38]. Se construye dentro del bloque query usando la palabra clave range, seguida del campo sobre el que se ejecuta.

Los operadores disponibles son:

  • gt (greater than): mayor que, sin incluir el límite.
  • gte: mayor o igual que, incluyendo el límite.
  • lt (less than): menor que, sin incluir el límite.
  • lte: menor o igual que, incluyendo el límite.

¿Cómo filtrar restaurantes por calificación?

En el ejemplo práctico se buscan restaurantes con calificación mayor que 3.5 (gt: 3.5) y menor o igual que 4.5 (lte: 4.5) [02:05]. Al ejecutar la consulta, Elasticsearch devuelve dos resultados: Burger King con 3.75 y McDonald's con 4.22, ambos dentro del rango especificado.

La clave está en entender cuándo agregar la e al operador. Si escribes gte o lte, el límite se incluye en los resultados. Si usas gt o lt a secas, el límite queda fuera.

¿Cómo funcionan las consultas de rango con fechas?

El mismo mecanismo aplica para campos de tipo fecha [03:20]. En lugar del campo calificación, se usa ultima_modificacion.fecha y se especifican fechas en formato YYYY-MM-DD.

En el ejemplo, el rango es mayor o igual que 2020-01-15 (gte) y menor que 2020-03-01 (lt). Al no incluir el 1 de marzo, el rango efectivo cubre hasta el último día de febrero [03:58]. Los resultados muestran a McDonald's (19 de febrero) y Subway (22 de enero), ambos dentro del período.

¿Qué son las agregaciones y cómo se calculan métricas en Elasticsearch?

Las agregaciones (aggregations) no son consultas como tal, sino métricas que se calculan sobre los resultados de una búsqueda [04:38]. Se definen con el bloque aggs en el cuerpo del JSON.

Cada agregación necesita:

  • Un nombre que tú defines, como calificacion_promedio.
  • Una operación: avg (promedio), max (máximo) o min (mínimo).
  • El campo sobre el que se ejecuta.

Al enviar la consulta [05:30], Elasticsearch devuelve los documentos habituales, pero al final agrega un bloque llamado aggregations con los valores calculados. En el ejemplo, la calificación mínima fue 3.75, el promedio 3.985 y la máxima 4.22.

¿Cómo manejar documentos sin valor con el parámetro missing?

Cuando un documento no tiene el campo sobre el que se agrega, Elasticsearch lo ignora por defecto. El parámetro missing [06:22] resuelve esto asignando un valor por defecto a esos documentos.

En el caso del directorio, Subway no tenía calificación. Al definir "missing": 3.0 dentro de la agregación avg, Elasticsearch le asigna 3.0 a Subway para el cálculo. El promedio baja de 3.985 a 3.65 porque se incorpora un valor menor al promedio anterior.

  • missing solo afecta el cálculo de la agregación, no modifica el documento original.
  • Es útil para obtener métricas más representativas cuando hay datos incompletos.

¿Has probado combinar consultas de rango con agregaciones en un mismo request? Comparte tu experiencia y los resultados que obtuviste.