Index de recherche PrestaShop : pourquoi la réindexation des produits corrige la recherche

389 vues

Comment la recherche PrestaShop fonctionne en interne

PrestaShop inclut un moteur de recherche de produits intégré qui fonctionne sur un index en texte intégral stocké directement dans la base de données MySQL. Contrairement aux services de recherche externes, cet index se trouve aux côtés de vos données produits dans la même base de données, ce qui signifie que les requêtes sont rapides mais nécessitent une maintenance explicite pour rester à jour. Comprendre le fonctionnement de ce système de recherche est la première étape pour diagnostiquer et corriger les problèmes de recherche.

Lorsqu'un client tape une requête dans la barre de recherche de votre boutique, PrestaShop ne parcourt pas chaque nom et description de produit en temps réel. Au lieu de cela, il recherche les termes de la requête dans un index préconstruit qui associe des mots individuels aux produits. Cet index est construit en décomposant les champs textuels des produits en mots individuels (tokenisation), en les normalisant (mise en minuscules, suppression des accents), et en stockant la relation entre chaque mot et les produits dans lesquels il apparaît, accompagnée d'un poids de pertinence.

Cette approche est fondamentalement la même que celle des moteurs de recherche comme Google, simplement à une échelle beaucoup plus petite. Le compromis est que l'index doit être reconstruit chaque fois que les données produits changent d'une manière que l'indexation automatique ne capture pas, ce qui est la cause principale de la plupart des problèmes de recherche dans PrestaShop.

Les tables de base de données de recherche

L'index de recherche de PrestaShop est réparti sur plusieurs tables de base de données, chacune remplissant un rôle spécifique dans le pipeline de recherche.

ps_search_word

Cette table stocke chaque mot unique extrait de vos données produits, ainsi que la langue à laquelle il appartient. Chaque mot reçoit un id_word servant de clé de référence. La table est sensible à la langue, ce qui signifie que le mot "shoe" dans votre catalogue anglais et "chaussure" dans votre catalogue français sont des entrées séparées, chacune liée à son identifiant de langue respectif.

Lorsque vous examinez cette table, vous verrez des milliers ou des dizaines de milliers de lignes selon la taille de votre catalogue et le nombre de langues. Chaque mot distinct de chaque champ produit indexé y est représenté.

ps_search_index

C'est la table de correspondance principale. Chaque ligne lie un produit (id_product) à un mot (id_word) avec une valeur de poids. Le poids détermine la pertinence de ce mot pour ce produit. Un mot apparaissant dans le nom du produit a plus de poids que le même mot apparaissant dans la description, et les valeurs de poids sont configurables dans le back-office.

Lorsqu'un client recherche "portefeuille en cuir bleu", PrestaShop recherche chaque mot dans ps_search_word, trouve les valeurs id_word correspondantes, puis interroge ps_search_index pour les produits correspondant à ces identifiants de mots. Les produits sont classés par la somme de leurs poids pour les mots correspondants, les poids totaux les plus élevés apparaissant en premier dans les résultats.

ps_search_engine

Cette table stocke les motifs de moteurs de recherche référents utilisés pour suivre quels moteurs de recherche envoient du trafic vers votre boutique. Elle n'est pas directement liée à la fonctionnalité de recherche interne mais est souvent confondue avec elle en raison du nommage similaire.

ps_alias

La table des alias stocke les alias de termes de recherche, c'est-à-dire des orthographes alternatives ou des synonymes qui doivent correspondre à un terme de recherche canonique. Par exemple, vous pourriez configurer "baskets" comme alias de "chaussures de sport" afin que les clients recherchant l'un ou l'autre terme obtiennent les mêmes résultats. Les alias sont configurés dans le back-office sous Paramètres de la boutique > Recherche > Recherche > Alias.

Quand et pourquoi la réindexation est nécessaire

PrestaShop dispose d'une fonctionnalité d'indexation automatique qui met à jour l'index de recherche chaque fois qu'un produit est enregistré via le back-office. Lorsque vous modifiez un produit et cliquez sur Enregistrer, PrestaShop réindexe ce produit spécifique, mettant à jour ses entrées dans ps_search_word et ps_search_index. Cela fonctionne bien pour la gestion quotidienne des produits.

Cependant, l'indexation automatique ne couvre pas tous les scénarios. Il existe plusieurs situations courantes où une réindexation complète est nécessaire.

Imports de produits en masse

Lorsque vous importez des produits via CSV, le processus d'import peut ne pas déclencher les hooks d'indexation de recherche pour chaque produit. C'est particulièrement courant avec les imports volumineux où les optimisations de performance sautent les étapes de traitement non essentielles. Après un import en masse, les nouveaux produits peuvent exister dans le catalogue mais être complètement invisibles pour la recherche du site.

Modifications directes de la base de données

Si vous ou un module modifiez les données produits directement dans la base de données (en contournant le modèle objet PrestaShop), l'index de recherche ne sera pas mis à jour. Cela inclut les mises à jour SQL des noms de produits, descriptions ou autres champs indexés. Toute migration de base de données, nettoyage de données ou outil de synchronisation externe qui écrit directement dans ps_product_lang laissera l'index de recherche obsolète.

Changements de langues

L'ajout d'une nouvelle langue à votre boutique nécessite une réindexation complète car l'index de recherche est spécifique à la langue. Les produits existants ont besoin que leur contenu dans la nouvelle langue soit tokenisé et ajouté à l'index. De même, si vous modifiez le contenu des produits dans une langue spécifique (surtout via des opérations en masse), une réindexation garantit que les changements sont reflétés dans la recherche.

Changements de configuration des poids de recherche

Lorsque vous modifiez les valeurs de poids attribuées aux différents champs produits, les entrées d'index existantes conservent leurs anciens poids. Une réindexation recalcule tous les poids en utilisant la nouvelle configuration.

Installations ou mises à jour de modules

Certains modules modifient les structures de données produits ou ajoutent des champs recherchables. Après l'installation ou la mise à jour de tels modules, une réindexation garantit que toutes les données nouvelles ou modifiées sont incluses dans l'index de recherche.

Index corrompu

Les plantages de base de données, les migrations échouées ou les opérations d'indexation interrompues peuvent laisser l'index de recherche dans un état incohérent. Les symptômes incluent des produits qui devraient apparaître dans les résultats de recherche mais n'y apparaissent pas, des produits apparaissant pour des termes de recherche complètement erronés, ou une recherche ne retournant aucun résultat. Une réindexation complète reconstruit l'index depuis zéro, résolvant ces incohérences.

Comment réindexer les produits

Méthode du back-office

Naviguez vers Paramètres de la boutique > Recherche dans votre back-office PrestaShop. En haut de la page, vous trouverez une section "Indexation" avec des options pour reconstruire l'index de recherche. Il y a généralement deux options : ajouter à l'index les produits qui n'ont pas encore été indexés (incrémentiel), ou reconstruire l'index entier depuis zéro (réindexation complète).

Pour la plupart des scénarios de dépannage, choisissez la reconstruction complète. L'option incrémentielle n'ajoute que les produits manquants et ne met pas à jour les entrées existantes qui peuvent contenir des données obsolètes.

La méthode du back-office fonctionne bien pour les catalogues petits à moyens (jusqu'à quelques milliers de produits). Pour les catalogues plus importants, elle peut expirer en raison des limites de temps d'exécution PHP, c'est là que la méthode CLI devient nécessaire.

Commande CLI de réindexation

Pour les gros catalogues ou les workflows automatisés, utilisez la ligne de commande pour déclencher une réindexation. Dans PrestaShop 1.7 et versions ultérieures, la commande est :

php bin/console prestashop:search-index:rebuild

Pour PrestaShop 1.6, vous appelleriez directement le fichier d'indexation de recherche. Le chemin exact dépend de votre installation, mais la logique d'indexation se trouve dans la classe Search.

La méthode CLI n'a pas les mêmes contraintes de timeout que l'interface web. Pour les très gros catalogues (dizaines de milliers de produits sur plusieurs langues), la réindexation peut prendre plusieurs minutes. Vous pouvez suivre la progression via la sortie.

Si vous exécutez PrestaShop dans Docker, exécutez la commande dans le contexte du conteneur où PHP et la base de code PrestaShop sont disponibles. Assurez-vous de l'exécuter en tant qu'utilisateur du serveur web pour éviter les problèmes de permissions de fichiers avec les fichiers de cache générés pendant le processus.

Automatisation de la réindexation

Si votre boutique repose sur des imports automatisés de produits ou une synchronisation de données externe, programmez des réindexations périodiques en tant que tâche cron. Une réindexation nocturne garantit que tous les produits ajoutés ou modifiés par des processus automatisés sont recherchables le lendemain. L'entrée cron appellerait la même commande CLI selon un planning.

Sachez que la réindexation verrouille brièvement les tables de recherche pendant la reconstruction. Sur une boutique active, programmez la réindexation pendant les heures de faible trafic pour éviter d'impacter la disponibilité de la recherche pour les clients actifs.

Configuration des poids : contrôler la pertinence de la recherche

PrestaShop vous permet de configurer l'importance que différents champs produits ont dans les résultats de recherche. C'est l'une des fonctionnalités les plus puissantes et les plus sous-utilisées du système de recherche intégré.

Champs de poids disponibles

La configuration des poids se trouve dans Paramètres de la boutique > Recherche. Vous pouvez attribuer un poids (généralement de 1 à 10, bien que des valeurs plus élevées fonctionnent) à chacun de ces champs produits :

Nom du produit : Celui-ci devrait typiquement avoir le poids le plus élevé. Lorsqu'un client recherche un produit par son nom, le produit portant exactement ce nom devrait apparaître en premier.

Référence : Les codes de référence produit sont souvent utilisés par les clients B2B qui connaissent le SKU exact dont ils ont besoin. Un poids modéré garantit que les recherches basées sur la référence fonctionnent bien sans surpasser les recherches basées sur le nom.

Description courte : La description courte contient souvent les principaux arguments de vente et les caractéristiques du produit. Un poids modéré est approprié.

Description : La description complète contient le plus de texte et donc le plus grand nombre de correspondances de mots-clés potentielles. Cependant, comme elle contient tant de texte, un poids élevé peut causer des correspondances non pertinentes où un terme de recherche apparaît incidemment dans une longue description. Un poids inférieur par rapport au nom du produit est recommandé.

Catégorie : L'inclusion des noms de catégories dans la recherche permet aux clients de trouver des produits par termes de catégorie même lorsque ces termes n'apparaissent pas dans le texte propre du produit.

Marque (fabricant) : Les clients recherchent souvent par nom de marque. Un poids modéré à élevé garantit que les recherches de marques retournent des résultats pertinents.

Tags : Les tags sont des termes de recherche explicitement attribués aux produits. Un poids élevé pour les tags vous donne un contrôle direct sur les produits qui apparaissent pour des requêtes de recherche spécifiques.

Attributs : Les valeurs d'attributs produits (taille, couleur, matériau) peuvent être incluses dans l'index de recherche. Cela permet des recherches comme "rouge XL" pour retourner des produits avec ces combinaisons d'attributs.

Caractéristiques : Les valeurs de caractéristiques produits (poids, dimensions, type de matériau) peuvent également être indexées.

Stratégie de pondération

Une configuration de départ raisonnable pourrait être : nom du produit à 6, référence à 4, description courte à 3, description à 1, catégorie à 2, fabricant à 3, tags à 4, attributs à 2, caractéristiques à 2. Mais les poids optimaux dépendent entièrement de votre catalogue et du comportement de recherche de vos clients.

Si vos clients recherchent fréquemment par SKU ou numéro de référence, augmentez le poids de la référence. Si les recherches par marque sont importantes, augmentez le poids du fabricant. Si vous constatez que de longues descriptions font remonter des résultats non pertinents, réduisez le poids de la description ou mettez-le à zéro pour exclure complètement les descriptions de l'index.

Après avoir modifié les poids, effectuez toujours une réindexation complète pour que les nouvelles valeurs prennent effet sur tous les produits.

Problèmes de recherche courants et solutions

Les produits n'apparaissent pas dans les résultats de recherche

C'est la plainte la plus courante concernant la recherche. Un produit existe dans le catalogue mais le rechercher par son nom ne retourne aucun résultat. Les causes incluent : le produit a été ajouté via un import qui n'a pas déclenché l'indexation, le produit est désactivé ou en rupture de stock et la recherche est configurée pour exclure ces produits, ou l'index de recherche est corrompu.

Solution : Vérifiez d'abord que le produit est actif et visible. Puis lancez une réindexation complète. Si le produit n'apparaît toujours pas, vérifiez si le nom du produit contient des caractères spéciaux qui pourraient être supprimés lors de la tokenisation, et vérifiez si le paramètre de longueur minimale de mot (dans la configuration de recherche) exclut les mots courts du nom du produit.

Mauvais produits en premier

Lorsqu'une recherche de "widget bleu" retourne un produit appelé "support de widget" avant le vrai produit "widget bleu", c'est généralement un problème de configuration des poids. Le produit mieux classé a accumulé plus de poids total sur tous les champs indexés. Peut-être que "widget" apparaît plusieurs fois dans la description du produit support, et avec un poids de description élevé, ces occurrences surpassent une seule correspondance dans le nom du produit.

Solution : Ajustez les poids des champs pour prioriser le nom du produit. Définissez le poids du nom du produit significativement plus haut que le poids de la description. Réindexez après les modifications.

La recherche retourne trop de résultats non pertinents

Cela se produit lorsque le poids de la description est trop élevé ou lorsque des mots courants apparaissent dans de nombreuses descriptions de produits. Une recherche de "premium" retourne chaque produit dont la description contient le mot "premium" même quand ce n'est pas une caractéristique distinctive de ces produits.

Solution : Réduisez le poids de la description ou utilisez la fonctionnalité de mots blacklistés pour exclure les mots courants non discriminants de l'index. La liste noire est configurée dans Paramètres de la boutique > Recherche et vous permet de spécifier les mots qui doivent être ignorés lors de l'indexation.

La recherche ne trouve pas les correspondances partielles

La recherche intégrée de PrestaShop ne prend pas en charge la véritable correspondance approximative. Si un client recherche "chaussur", il ne trouvera pas les produits contenant uniquement le mot "chaussures" sauf si les fonctionnalités de stemming ou d'alias gèrent la variation. C'est une limitation fondamentale de l'approche d'index basée sur les mots.

Solution : Utilisez la fonctionnalité d'alias pour associer les variations courantes ("chaussur" à "chaussures", "TV" à "télévision"). Pour une correspondance partielle plus complète, envisagez une solution de recherche externe comme Elasticsearch.

Les caractères accentués causent des échecs

PrestaShop normalise les caractères accentués lors de l'indexation (par exemple, en convertissant "cafe" et "café" à la même forme de base). Si cette normalisation ne fonctionne pas correctement, les recherches avec ou sans accents peuvent produire des résultats différents.

Solution : Vérifiez que la suppression des accents est activée dans la configuration de recherche. Réindexez après vérification. Si le problème persiste, vérifiez le jeu de caractères et la collation de la base de données, car des encodages incompatibles peuvent interférer avec la normalisation du texte.

Optimisation des performances de recherche

Pour les boutiques avec de gros catalogues (10 000+ produits), les performances de recherche peuvent devenir un problème. La recherche intégrée effectue des requêtes de base de données contre les tables d'index à chaque recherche, et avec un gros index, ces requêtes peuvent devenir lentes.

Indexation de la base de données

Assurez-vous que les tables ps_search_word et ps_search_index ont des index de base de données appropriés. PrestaShop les crée par défaut, mais si les tables ont été modifiées ou reconstruites, des index peuvent manquer. Les index clés sont sur id_word et id_lang dans ps_search_word, et sur id_product et id_word dans ps_search_index.

Longueur minimale de mot

Le paramètre de longueur minimale de mot contrôle le mot le plus court qui sera indexé. La valeur par défaut est généralement de 3 caractères, ce qui signifie que les mots d'un et deux caractères sont exclus. L'augmenter à 4 réduit la taille de l'index et peut améliorer la vitesse de recherche, mais cela signifie que les recherches de termes courts comme "XL" ou "TV" ne fonctionneront pas. Trouvez un équilibre entre la taille de l'index et vos exigences de recherche.

Mots blacklistés

L'ajout de mots courants ("le", "et", "pour", "avec") à la liste noire réduit significativement la taille de l'index car ces mots apparaissent dans presque chaque description de produit. Des tables d'index plus petites signifient des requêtes plus rapides.

Optimisation des tables

Après une réindexation complète, exécutez OPTIMIZE TABLE ps_search_word, ps_search_index dans MySQL. Le processus de réindexation supprime et réinsère de grandes quantités de lignes, ce qui peut fragmenter les tables. L'optimisation récupère cet espace et améliore les performances des requêtes.

Elasticsearch comme alternative

Pour les boutiques qui ont dépassé la recherche intégrée de PrestaShop, Elasticsearch offre une amélioration significative tant en qualité de recherche qu'en performances. Elasticsearch est un moteur de recherche dédié qui fonctionne comme un service séparé et offre des fonctionnalités que la recherche intégrée basée sur MySQL ne peut pas égaler.

Ce qu'Elasticsearch apporte

La correspondance approximative permet à Elasticsearch de trouver des résultats même lorsque le terme de recherche est mal orthographié. Une recherche de "cuire" trouvera quand même les produits "cuir". Le stemming réduit les mots à leur forme racine, de sorte que "courant", "court" et "couru" trouvent tous les produits contenant l'une de ces variations. Le support des synonymes vous permet de définir des relations entre les mots ("canapé" et "sofa") au niveau du moteur de recherche plutôt que via des alias manuels.

La recherche à facettes (filtrage des résultats par attributs comme la fourchette de prix, la couleur, la marque) est drastiquement plus rapide avec Elasticsearch car il est conçu exactement pour ce type de requête d'agrégation. Les suggestions d'auto-complétion et les fonctionnalités "vouliez-vous dire" sont également des capacités natives d'Elasticsearch.

En termes de performances, Elasticsearch gère les gros catalogues (100 000+ produits) avec des temps de réponse inférieurs à la seconde car il utilise des index inversés optimisés pour la recherche en texte intégral, contrairement à MySQL qui est principalement conçu pour les données relationnelles.

Intégration avec PrestaShop

Plusieurs modules PrestaShop fournissent une intégration Elasticsearch. Ces modules remplacent typiquement le contrôleur de recherche par défaut par un qui interroge Elasticsearch au lieu des tables de recherche MySQL. Les données produits sont synchronisées de PrestaShop vers Elasticsearch soit en temps réel (lors de l'enregistrement du produit) soit via une synchronisation par lots périodique.

L'exécution d'Elasticsearch nécessite un serveur ou conteneur dédié avec suffisamment de RAM (minimum 2 Go pour les petits catalogues, plus pour les plus grands). Cela ajoute de la complexité opérationnelle puisque vous avez maintenant un service supplémentaire à surveiller et maintenir. Pour de nombreuses petites et moyennes boutiques, la recherche intégrée avec une configuration de poids appropriée et une réindexation régulière est suffisante.

Quand envisager Elasticsearch

Envisagez Elasticsearch lorsque votre catalogue dépasse 10 000 produits et que les performances de recherche se dégradent, lorsque les clients font fréquemment des fautes de frappe dans les termes de recherche et s'attendent à une correspondance approximative, lorsque vous avez besoin de fonctionnalités avancées comme l'auto-complétion ou le filtrage à facettes, ou lorsque la qualité de recherche est un avantage concurrentiel pour votre entreprise (boutiques B2B avec des catalogues de produits complexes, par exemple).

La checklist de réindexation

Lorsque la recherche ne fonctionne pas correctement dans votre boutique PrestaShop, suivez ce processus de diagnostic et de résolution. Premièrement, vérifiez que les produits concernés sont actifs, visibles et en stock (si votre recherche exclut les produits en rupture de stock). Deuxièmement, vérifiez la configuration des poids de recherche et assurez-vous qu'elle correspond à vos priorités. Troisièmement, lancez une reconstruction complète de l'index de recherche depuis le back-office ou la CLI. Quatrièmement, videz le cache PrestaShop après la réindexation. Cinquièmement, testez la recherche avec des termes spécifiques pour vérifier la correction. Sixièmement, si les problèmes persistent, vérifiez les tables ps_search_word et ps_search_index directement pour vérifier que les produits problématiques ont des entrées. Septièmement, si l'index semble correct mais que la recherche échoue toujours, examinez la logique du contrôleur de recherche et les modules qui le remplacent.

Une réindexation régulière, combinée à une configuration de poids réfléchie et une liste d'alias bien maintenue, maintient la recherche intégrée de PrestaShop fonctionnelle de manière fiable pour la majorité des boutiques. Pour celles qui ont besoin de plus, Elasticsearch offre un chemin de mise à niveau sans nécessiter de changement de plateforme.

Cette réponse vous a-t-elle été utile ?

Vous avez encore des questions ?

Can't find what you're looking for? Send us your question and we'll get back to you quickly.

Loading...
Back to top