Dans cette section, vous allez découvrir un modèle dérivé des filtres qui est largement utilisé dans les implémentations de recherche et qui s'appelle la recherche à facettes. L'idée est de permettre à l'utilisateur de lancer une requête, puis de lui présenter une liste de filtres suggérés en même temps que les résultats.
La capture d'écran suivante montre une barre latérale gauche avec des facettes pour les deux filtres qui sont actuellement mis en œuvre dans l'application.

Voici un détail des résultats de la recherche à facettes. Notez que chaque entrée est présentée sous la forme d'un lien cliquable qui ajoute le filtre à la recherche en cours. Chaque face indique également le nombre de résultats qu'elle contient.

Agrégations à terme
Dans Elasticsearch, la recherche à facettes est mise en œuvre à l'aide de la fonction d'agrégation. L'une des agrégations prises en charge divise les résultats de la recherche en groupes, sur la base de certains critères. La liste des godets, chacun comprenant le nombre de documents qu'il contient, sera utilisée pour afficher la barre latérale des facettes.
Le type le plus simple d'agrégation de godets est celui dans lequel des godets sont définis pour chaque mot-clé. Ce type d'agrégation de termes est parfait pour créer les catégories du champ category. Voici la requête de recherche de l'application, élargie pour demander des agrégations de catégories :
Le seul changement est l'ajout de l'option aggs. Chaque agrégation reçoit un nom, dans ce cas category-agg. L'agrégation terms indique que le filtrage doit être effectué par mot-clé. Comme pour les filtres, le champ category doit être indiqué comme category.keyword, afin que le sous-type de mot-clé associé au champ soit utilisé.
La réponse à une requête comportant des agrégations comporte un champ aggregations contenant les résultats agrégés. Voici à quoi pourrait ressembler la réponse à l'exemple de demande ci-dessus :
Le modèle index.html fourni avec l'application tutorielle est déjà conçu pour afficher les agrégations dans la barre latérale gauche, qui était vide jusqu'à présent. Pour que la logique du modèle reste simple, les données de la réponse ci-dessus doivent être transformées en un dictionnaire ayant la structure suivante :
La liste suivante montre comment convertir le format d'agrégation Elasticsearch au dictionnaire simplifié ci-dessus, et comment envoyer le dictionnaire converti au modèle pour le rendu :
Au cas où vous seriez curieux, l'index.html comprend la logique suivante pour rendre le dictionnaire aggs:
Cette implémentation utilise des idées similaires à celles utilisées pour rendre les boutons de pagination suivants et précédents. Chaque facette est présentée sous la forme d'un formulaire avec un champ caché qui définit la requête avec le filtre ajouté correspondant. Par exemple, une facette de catégorie sharepoint ajouterait category:sharepoint à la requête actuelle.
Détail purement cosmétique, le bouton de soumission de chaque facette est rendu dans le style d'un lien.
Agrégations annuelles
Les agrégations de termes utilisées avec les catégories ne fonctionnent pas pour le filtre d'année construit dans la section précédente, car, comme vous vous en souvenez, l'index ne stocke pas les années individuellement en tant que mots-clés. En revanche, l'année de mise à jour de chaque article est définie par le champ updated_at, qui enregistre une date complète.
Parmi la longue liste d'agrégations disponibles, l'histogramme des dates est celui qui correspond le mieux à ce cas d'utilisation. Voici la demande d'agrégation mise à jour :
Vous pouvez voir ici qu'une deuxième agrégation a été ajoutée au champ aggs. Le type de cette agrégation est date_histogram et l'intervalle est fixé à year de manière à ce que les groupes créés représentent chacun une année. L'option format configure le format à utiliser pour le nom de chaque godet, qui, dans ce cas, ne doit inclure que l'année.
Le champ aggregations de la réponse comprendra désormais deux sections :
Cette deuxième agrégation présente une autre complication mineure. Le champ key, qui est inclus dans chaque godet, n'est pas utile, car pour les agrégations d'intervalles de dates, il est en unités de millisecondes. Mais heureusement, la date rendue dans le format donné par l'option format dans l'agrégation est fournie dans un champ key_as_string.
Voici comment est calculé le dictionnaire aggs comprenant toutes les facettes :
Outre l'utilisation de key_as_string au lieu de key, une condition est ajoutée pour les facettes relatives à l'année afin d'éliminer tous les seaux contenant zéro document, car il est évident qu'il n'y a aucun intérêt à les utiliser en tant que filtres.
La mise en œuvre de la recherche à facettes est ainsi terminée. Voici l'implémentation complète de la fonction handle_search():
La mise en œuvre de la recherche à facettes présentée dans ce tutoriel a été conçue dans un souci de simplicité. Les agrégations dans Elasticsearch offrent de nombreuses possibilités qui n'ont pas été abordées, alors n'oubliez pas de consulter la documentation pour apprendre tout ce que cette fonctionnalité a à offrir.
Félicitations, vous avez atteint la fin de la section Recherche plein texte de ce tutoriel ! Cliquez ici pour consulter l'état d'avancement de l'application de recherche de didacticiels jusqu'à ce jour.
Précédemment
FiltresSuivant
Recherche vectorielle