Il est souvent peu pratique pour une application de traiter un très grand nombre de résultats. C'est pourquoi les API et les services web utilisent des contrôles de pagination pour permettre aux applications de demander les résultats par petits morceaux ou pages.

Vous avez peut-être remarqué que, par défaut, Elasticsearch ne renvoie pas plus de 10 résultats. Le paramètre facultatif size peut être indiqué dans une demande de recherche pour modifier ce maximum. L'exemple suivant demande de renvoyer jusqu'à 5 résultats de recherche :

Pour accéder à des pages de résultats supplémentaires, on utilise le paramètre from_, qui indique à partir de quel endroit de la liste complète des résultats il faut commencer (comme from est un mot-clé réservé en Python, c'est from_ qui est utilisé).

L'exemple suivant permet d'obtenir une deuxième page de 5 résultats :

Incorporons size et from_ dans le point de terminaison handle_search() dans app.py :

Ici, la taille de la page est maintenant codée en dur à 5 (n'hésitez pas à utiliser un autre nombre). L'argument from_ est supposé être donné comme un champ supplémentaire dans le formulaire soumis, mais ce champ est considéré comme facultatif, avec une valeur par défaut de 0 s'il n'est pas présent.

Le formulaire de recherche disponible dans index.html ne comporte pas de champ from_, de sorte que les recherches ordinaires commencent toujours par le premier résultat. Le modèle affiche des informations sur l'éventail des résultats affichés et sur le total. Voici comment procéder à l'aide de modèles d'expression :

Le modèle comprend également une logique permettant d'afficher des boutons de pagination pour avancer ou reculer dans la liste des résultats. Voici l'implémentation du bouton "Résultats précédents":

Comme vous pouvez le constater, le bouton "Page précédente" n'est affiché sur la page que si from_ est supérieur à zéro. L'implémentation de ce bouton utilise l'API de l'historique du navigateur pour revenir à la page précédente.

Le bouton "Page suivante" a une implémentation beaucoup plus intéressante :

Ce bouton n'est en fait pas un bouton autonome, mais un formulaire complet qui comporte deux champs cachés en plus du bouton. Le formulaire est similaire au formulaire de recherche principal, mais il inclut le champ facultatif from_, ajusté pour pointer vers la page de résultats suivante. Lorsque l'on clique sur ce bouton, l'application Flask reçoit une demande de recherche de ce formulaire alternatif, qui utilise la même requête textuelle mais une valeur from_ non nulle.

Grâce à cette petite mise en œuvre intelligente de la pagination, vous serez en mesure de naviguer à travers plusieurs pages de résultats.

Prêt à créer des expériences de recherche d'exception ?

Une recherche suffisamment avancée ne se fait pas avec les efforts d'une seule personne. Elasticsearch est alimenté par des data scientists, des ML ops, des ingénieurs et bien d'autres qui sont tout aussi passionnés par la recherche que vous. Mettons-nous en relation et travaillons ensemble pour construire l'expérience de recherche magique qui vous permettra d'obtenir les résultats que vous souhaitez.

Jugez-en par vous-même