La recherche native de PrestaShop, mesurée : ce qu'elle corrige, ce qu'elle remplace, ce qu'elle ne lit pas
Notre page PrestaShop disait que « rondele » ne trouve pas « rondelle ». Nous avons installé un PrestaShop neuf, indexé un catalogue de visserie, et passé 51 requêtes. « rondele » trouve « rondelle ». Le vrai défaut est ailleurs, et il est plus grave pour un distributeur.
Notre argument était faux
Depuis sa publication, notre page PrestaShop présentait les fautes de frappe comme le premier défaut de la recherche native, avec cet exemple : « rondele » ne trouve pas « rondelle ». En anglais, « wahser » ne trouvait pas « washer ». Nous ne l'avions jamais mesuré.
Mesuré le 19 septembre 2026 : sur une installation neuve de PrestaShop 9.1.4, le réglage PS_SEARCH_FUZZY vaut 1, c'est-à-dire que la recherche approchée est activée à la livraison. « rondele » rend les quatre rondelles du catalogue, plus deux fiches qui en citent une dans leur description. « wahser » rend les deux produits « washer » que nous avions ajoutés pour le vérifier. Notre page disait le contraire de ce que fait le produit de nos futurs clients. Elle a été corrigée le jour même.
Cet article dit ce que nous avons trouvé à la place. Trois choses, dont une que nous n'aurions pas vue sans un catalogue réel.
La mesure
PrestaShop 9.1.4, installé en ligne de commande, en français, sans produits de démonstration. Les réglages de recherche sont ceux de la livraison, lus en base après l'installation :
PS_SEARCH_FUZZY 1 recherche approchée activée
PS_SEARCH_FUZZY_MAX_DIFFERENCE 5 lettres d'écart tolérées
PS_SEARCH_MINWORDLEN 3 longueur minimale d'un mot
Le catalogue compte 177 fiches, et il faut dire d'où elles viennent. 91 sont réelles : la collection « chevilles et vis » d'une boutique de fixation, Fischer, SPAX, DEWALT, copiée le 1er août 2026. Les 86 autres sont à nous : 10 fiches d'exemple de notre site, 64 fiches de vis générées pour un article précédent, et 12 fiches écrites pour cette mesure (rondelles, écrous, roulements), parce qu'aucune source réelle à notre disposition ne portait de roulement.
Chaque requête est passée deux fois : par la fonction de recherche de PrestaShop, Search::find(), avec la trace de ce qu'elle fait de chaque mot, puis par le fournisseur de résultats qu'appelle la page de recherche de la boutique. Les deux rendent les mêmes totaux.
M8 n'est pas indexé
C'est le défaut qui compte pour un distributeur, et notre page ne le disait pas. PrestaShop ignore les mots de moins de trois caractères. Il ne les cherche pas, et il ne les indexe pas non plus : dans la table des mots de la boutique, « M8 », « A2 », « 20 » n'existent pas.
| Requête | Ce que PrestaShop cherche | Résultat |
|---|---|---|
| M8 | rien | 0 |
| M8 x 20 | rien : les trois mots sont trop courts | 0 |
| vis inox M8 20 | vis, inox | 80, toutes les vis inox, M6 en tête |
| ecrou M8 | ecrou | 3 écrous, dont un M10 en premier |
| vis 6 pans | vis, pans | 2, dont aucune vis à tête hexagonale |
La requête ne rend pas zéro résultat, ce qui se verrait. Elle rend des résultats, et ce ne sont pas ceux qu'on demandait. « vis inox M8 20 » est une spécification complète ; PrestaShop en garde « vis inox », et le client reçoit 80 vis dans un ordre où le diamètre n'a joué aucun rôle.
La même règle explique le test des graphies. Sur un catalogue qui écrit « M8x20 », « M8x20 » trouve la vis, parce que c'est un seul mot de cinq caractères. « M8 x 20 » ne rend rien. Et « M8-20 » rend une autre vis, pour la raison qui suit.
Une correction sans plancher
La recherche approchée de PrestaShop fonctionne ainsi : si un mot de la requête ne commence aucun mot indexé, PrestaShop le remplace par le mot indexé le plus proche, jusqu'à cinq lettres d'écart. C'est ce qui fait marcher « rondele ». C'est aussi ce qui fait ceci :
M8-20 → m820 remplacé par m840 → la vis M8-40
6205 2RS → 2rs remplacé par vis → 0 résultat
zzzzzz → remplacé par 6205zz → un roulement 6205-ZZ
pneu → remplacé par une → 68 produits sans rapport
Sur un mot de quatre lettres, cinq lettres d'écart autorisent presque n'importe quel mot du catalogue. La correction ne sait pas dire « je n'ai rien de proche » : elle prend le moins éloigné, et le client voit une page de résultats pleine, sans savoir que sa requête a été réécrite. Pour « M8-20 », il reçoit une vis M8-40 présentée comme la réponse. Pour « 6205 2RS », il reçoit zéro alors que « 6205-2RS » trouve le roulement : le second mot a été remplacé par « vis », et aucune fiche ne porte à la fois « 6205 » et « vis ».
Une faute dans une fiche désactive la correction pour tout le monde
C'est la mesure que nous n'aurions pas faite sans fiches réelles. La correction ne se déclenche que si aucun mot indexé ne commence par le mot tapé. Or les catalogues contiennent des fautes. Dans la description d'une vraie cheville Fischer DuoPower, on lit « une chevile intelligente ».
| Requête | Ce que PrestaShop fait | Résultat |
|---|---|---|
| cheville | cherche « cheville » | 60 |
| chevile | trouve « chevile » dans la fiche DuoPower, ne corrige pas | 2 chevilles sur 51 |
Le client qui tape « chevile » ne reçoit pas les 51 chevilles corrigées : il reçoit les deux fiches qui portent la même faute que lui. Une seule faute, dans une seule fiche, a désactivé la correction de ce mot pour tous les visiteurs. Le marchand ne le voit pas, puisque la requête rend des résultats, et le mot fautif est dans une description que personne ne relit.
Nous avons refait le mécanisme sur un catalogue sans fiche réelle, en ajoutant une seule fiche dont la description porte « chevile » :
sans la fiche fautive cheville → 2 chevile → 2 (corrigé)
avec la fiche fautive cheville → 3 chevile → 1 (la fiche fautive seule)
Ce que notre module fait sur la même boutique
Nous avons installé notre module PrestaShop sur cette même boutique, branché sur notre moteur lancé en local sur le code du 19 septembre, et passé les mêmes requêtes par le même point d'entrée que la page de recherche. Pour 48 des 51 requêtes, les fiches attendues sont fixées par une règle sur leur nom (les rondelles pour « rondele », la vis M8x20 pour « M8-20 »), et nous comptons si le premier résultat en fait partie. Ces règles ont été écrites après la mesure : elles sont publiées avec le reste, pour qu'on puisse les contester.
Neuf fois, le natif ne rend rien ou rend un mauvais premier résultat, et le module rend le bon : « M8 », « M8 x 20 », « M8-20 », « M10 x 30 », « 6205 2RS » dans ses deux casses, « vis inox A4 M10 », « ecrou M8 », « vis 6 pans ». Le moteur lit « M8 » comme un diamètre, « M8 x 20 » et « M8-20 » comme la vis M8x20, « 6 pans » comme une tête hexagonale. Et « pneu », « zzzzzz » rendent zéro.
Et voici ce que nous ne faisons pas mieux :
- « M8 20 ». Un nombre seul, sans « x » ni tiret, n'est pas lu comme une longueur : la vis M8x20 n'est pas sur la première page. Le natif ne la trouve pas non plus.
- « vis inox M8 20 ». La bonne vis arrive deuxième, derrière une vis M8x25.
- Les fautes de frappe. Sur « rondele », « rondlle », « roulemnt », le module met en tête les mêmes produits que le natif. La correction de PrestaShop fait ce travail-là.
- Le nombre de résultats. Le moteur annonce large : 151 résultats pour « vis CHC », dont un seul est une vis CHC. Le premier est le bon ; le total ne dit rien.
Un dernier point, qui compte autant que les autres. Sur ces 48 requêtes, le natif met le bon produit en tête 37 fois, le module 46 fois. Nous ne publions pas ce rapport comme un taux : nous avons choisi les requêtes, et 86 des 177 fiches sont les nôtres. Ce sont des cas, pas une moyenne.
Refaire la mesure
Le kit est publié : docs/mesures/prestashop-natif-2026-09-19, dans le dépôt public de ce site. Il contient le catalogue, les 51 requêtes, les scripts qui importent les fiches et passent les requêtes par Search::find(), et ce qu'ils ont rendu. Il porte 86 fiches, pas 177 : les 91 fiches réelles sont des textes de Fischer et de la boutique d'origine, nous ne les republions pas. Les totaux changent là où elles comptaient (« rondele » rend 4 au lieu de 6), le mécanisme non ; le README donne les deux colonnes.
Sur votre propre boutique, trois requêtes suffisent :
- un diamètre seul, « M8 » : si la page est vide, vos mots courts ne sont pas indexés ;
- une référence de votre catalogue écrite avec un tiret à la place du « x » : regardez si le premier résultat est le bon produit, et pas seulement s'il y a un résultat ;
- un mot mal orthographié que vous savez présent dans une de vos fiches : si la requête correcte rend beaucoup plus que la requête fautive, la correction est désactivée pour ce mot.
Ces chiffres valent pour PrestaShop 9.1.4 avec ses réglages de livraison. Un marchand peut désactiver la recherche approchée, changer la longueur minimale ou installer un module de recherche : chacun de ces choix change le résultat. Le mécanisme de la correction et celui des mots courts sont lisibles dans classes/Search.php ; les effets décrits ici, eux, ont été mesurés.