En esta sección vas a aprender sobre un patrón derivado de filtros que se usa ampliamente en implementaciones de búsqueda llamado búsqueda facetada. La idea es dejar que el usuario realice una consulta y luego presentarle una lista de filtros sugeridos junto con los resultados.
La siguiente captura de pantalla muestra una barra lateral izquierda con facetas para los dos filtros que actualmente están implementados en la aplicación.

Aquí tienes un detalle de los resultados de búsqueda facetados. Fíjate en cómo cada entrada se muestra como un enlace clicable que agrega el filtro a la búsqueda actual. Cada cara también informa cuántos resultados incluye.

Agregaciones de términos
En Elasticsearch, la búsqueda facetada se implementa usando la función de agregaciones . Una de las agregaciones soportadas divide los resultados de búsqueda en cubos, según ciertos criterios. La lista de buckets, cada uno incluyendo el número de documentos que contiene, se usará para renderizar la barra lateral de facetas.
El tipo más sencillo de agregación de cubos es aquel en el que se definen cubos para cada palabra clave. Este tipo, llamado agregación de términos , es perfecto para crear los cubos para el campo category . Aquí está la solicitud de búsqueda de la aplicación, ampliada para aplicar agregaciones de categorías:
El único cambio es la incorporación de la opción aggs . A cada agregación se le asigna un nombre, en este caso category-agg. La agregación terms indica que el filtrado debe hacer por palabra clave. Al igual que con los filtros, el campo category debe dar como category.keyword, de modo que se emplee el subtipo de palabra clave asociado al campo.
La respuesta a una solicitud con agregaciones tiene un campo aggregations con los resultados agregados. Así podría ser la respuesta a la solicitud de ejemplo anterior:
La plantilla de index.html incluida con la aplicación tutorial ya está diseñada para renderizar agregaciones en la barra lateral izquierda, que hasta ese momento estaba vacía. Para mantener la lógica de la plantilla simple, los datos de la respuesta anterior deben transformar en un diccionario con la siguiente estructura:
La siguiente lista muestra cómo convertir el formato de agregación Elasticsearch al diccionario simplificado anterior, y también cómo enviar el diccionario convertido a la plantilla para su renderizado:
Por si tienes curiosidad, el index.html incluye la siguiente lógica para renderizar el diccionario aggs :
Esta implementación emplea ideas similares a las que se usan para renderizar los siguientes y anteriores botones de paginación. Cada faceta se representa como un formulario con un campo oculto que define la consulta con el filtro agregado correspondiente. Por ejemplo, una faceta de categoría sharepoint agregaría category:sharepoint a la consulta actual.
Como detalle meramente cosmético, el botón de enviar en cada lado se representa en el estilo de un enlace.
Agregaciones por años
Los términos agregaciones usados con las categorías no funcionan para el filtro de año construido en la sección anterior, porque, como recordarás, el índice no almacena los años individualmente como palabras clave. En su lugar, el año en que se actualizó cada artículo se define mediante el campo updated_at , que almacena una fecha completa.
De la larga lista de agregaciones de cubos disponibles, el histograma de fecha es el que mejor se adapta a este caso de uso. Aquí está la solicitud actualizada de agregaciones:
Aquí puedes ver que se agregó una segunda agregación al campo aggs . El tipo de esta agregación es date_histogram y el intervalo se establece a year de modo que los cubos creados representen cada uno un año. La opción format configura el formato para usar el nombre de cada cubo, que en este caso debería incluir solo el año.
El campo aggregations en la respuesta va a incluir ahora dos secciones:
Hay otra pequeña complicación con esta segunda agregación. El campo key que se incluye con cada cubo no es útil, porque para agregaciones de intervalos de fechas está en unidades de milisegundos. Pero afortunadamente, la fecha que aparece en el formato indicado en la opción format de la agregación se muestra en un campo key_as_string .
Así es como se calcula el diccionario aggs que incluye todas las facetas:
Además de usar key_as_string en lugar de key, para las facetas del año se agrega una condicional para eliminar cualquier cubo que contenga cero documentos, ya que obviamente no tiene sentido usarlos como filtros.
Y con esto, la implementación de la búsqueda facetada está completa. Aquí está la implementación completa de la función handle_search() :
La implementación de la búsqueda facetada incluida en este tutorial fue diseñada pensando en la sencillez. Las agregaciones en Elasticsearch ofrecen muchas posibilidades que no se cubrieron, así que cerciórate de revisar la documentación para conocer todo lo que esta función tiene para ofrecer.
¡Enhorabuena, llegaste al final de la sección de Búsqueda de Texto Completo de este tutorial! Haz clic aquí para revisar el estado de la aplicación de búsqueda de tutoriales hasta este punto.
Previamente
FiltrosPróximo
Búsqueda de vectores