La recherche est un sujet courant sur les projets et leur mise en place est devenue plus rapide au fil du temps.
Prenons le cas d’un de nos clients CoteFormations.
CoteFormations.fr a besoin de rechercher des formations, de pouvoir consulter leur détail et également les visualiser sur une carte.
Le choix d’Elasticsearch
Tout d’abord, nous avons choisi Elasticsearch (ES) pour sa simplicité d’installation, de mise à jour et de plus en open source. À l’exception des coûts de serveur, il n’entraîne aucune dépense supplémentaire.
Chez Spiriit, nous avons une longue expérience d’Elasticsearch, à l’heure où l’article est écrit, la version utilisée en est à la 8.9. Pour vous donner une idée de notre parcours, nos premières incursions remontent à 2011, alors que nous étions déjà aux prises avec la version 0.10.* !
Pour la partie développement, Elasticsearch s’installe généralement via Docker, on rajoute aussi Kibana pour tester et superviser.
Les performances ne sont plus à démontrer, Elasticsearch est capable de rechercher dans des millions de documents en moins d’une seconde, c’est le cas pour un de nos sites de contenu.
Ici, nous avons environ 35 000 formations indexées, les temps de réponses sont très rapides.
L’indexation des formations en quatre étapes : C.I.O.I.
1. Collecte des CSV : Tout commence par la récupération des fichiers CSV fournis par CoteFormations, une trentaine reliés entre eux par des identifiants.
Par exemple le CSV des formations contient plusieurs références vers d’autres CSV, eux-mêmes pointant vers d’autre CSV etc.
Pour les chiffres on compte environ 30 000 formations et environ 45 000 sessions.
2. Import en base de données : Les CSV sont importés dans une base de données en moins d’une minute. En contrepartie la manière de faire n’est pas optimale : tous les champs sont au format VARCHAR, ce qui pose des problèmes de performances.
3. Optimisation avec un script SQL : Pour résoudre ce problème, un script SQL est exécuté juste après. Il ajoute des clés primaires et des index pour accélérer les requêtes.
4. Indexation avec Symfony : Une fois les données accessibles, l’indexation dans Elasticsearch est lancée via Symfony.
La recherche
La recherche en elle-même ne sera pas détaillée ici, les requêtes restent classiques pour la plupart, une fois que les documents sont correctement formatés, il n’y a pas de problème majeur.
Kibana offre une interface pour tester les requêtes, c’est indispensable pour faire ses tests.
Les CSV et la performance
Quand on doit travailler avec beaucoup de CSV, les déplacer dans une base de données est une solution. On profite ainsi de la puissance du SQL et on optimise le coût des requêtes en termes de mémoire et de CPU.
Bien sûr, il ne faut pas non plus récupérer les 35 000 lignes depuis la base de données pour les traiter en même temps.
Pour optimiser la mémoire et le temps d’exécution, nous avons utilisé le composant Messenger de Symfony, et divisé le processus en lots de 100 lignes, déclenchant un message asynchrone pour chaque tranche de 100 lignes du CSV pour les indexer dans Elasticsearch.
Quand on fait des traitements asynchrones le plus ennuyant, c’est le suivi de l’avancement, heureusement, il existe des outils variés pour suivre l’avancement, comme notifier un channel Slack par exemple.
Nous avons opté pour la bibliothèque jolicode/slack-php-api plus avancée que celle de Symfony, pour les curieux je vous invite à l’essayer.
Pour information, la durée de l’indexation complète dure moins de 15 minutes, ce qui reste acceptable, et nous utilisons deux indexes ES, un pour les formations et un pour les sessions des formations.
Conclusion
La mise en place d’un outil de recherche tel qu’Elasticsearch demeure à la portée de tout développeur, à condition bien sûr de consacrer le temps nécessaire à l’acquisition des compétences requises.
Notre partenariat avec Coteformations.fr a enrichi notre compréhension des mécanismes de la recherche. Nous avons exploré des aspects tels que la sélection des résultats, les raisons pour lesquelles certains mots ne figuraient pas en tête des résultats, la possibilité de regrouper des données en fonction de la distance et des coordonnées géographiques, ainsi que de nombreux autres paramètres cruciaux.
Cette collaboration a ouvert des perspectives pour définir précisément nos besoins en matière de recherche et pour décrypter les subtilités du fonctionnement d’Elasticsearch.