{"id":894,"date":"2021-10-22T15:18:50","date_gmt":"2021-10-22T12:18:50","guid":{"rendered":"https:\/\/presta.site\/blog\/?p=894"},"modified":"2026-07-24T15:00:58","modified_gmt":"2026-07-24T12:00:58","slug":"utiliser-la-recherche-sphinx-dans-prestashop","status":"publish","type":"post","link":"https:\/\/presta.site\/blog\/fr\/utiliser-la-recherche-sphinx-dans-prestashop\/","title":{"rendered":"Recherche Sphinx PrestaShop : recherche catalogue plus rapide sur les grandes boutiques"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">La recherche catalogue native convient aux petites boutiques. Sur les grands catalogues, chaque frappe et chaque r\u00e9indexation peuvent ralentir l&#8217;exp\u00e9rience. La <strong>recherche sphinx prestashop<\/strong> d\u00e9porte la correspondance plein texte vers un moteur d\u00e9di\u00e9 afin que les recherches produits restent rapides, PrestaShop affichant toujours les fiches produit.<\/p>\n\n\n<!--more-->\n\n\n<p class=\"wp-block-paragraph\">Sphinx est un serveur de recherche plein texte. On indexe les champs produits depuis MySQL, on lance un daemon de recherche, puis on surcharge <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> de PrestaShop pour que les requ\u00eates boutique passent par ce moteur plut\u00f4t que par l&#8217;index int\u00e9gr\u00e9. Deux lignes technologiques comptent en pratique : <a href=\"https:\/\/sphinxsearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Sphinx<\/a> (toujours d\u00e9velopp\u00e9 ; les builds Sphinx 3 actuels diff\u00e8rent des paquets open source 2.x classiques) et <a href=\"https:\/\/manticoresearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Manticore Search<\/a> (un fork open source de Sphinx 2.x). Les chemins d&#8217;installation et les exemples de configuration ci-dessous suivent les paquets Sphinx 2 classiques comme <code class=\"codecolorer text default\"><span class=\"text\">sphinxsearch<\/span><\/code> sur Debian\/Ubuntu. Avec Manticore ou Sphinx 3, attendez-vous \u00e0 d&#8217;autres noms de paquets, r\u00e9pertoires de config et ports d&#8217;\u00e9coute &#8211; le principe reste le m\u00eame (indexer les ID produits, les interroger depuis PHP).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avant de s&#8217;engager sur un daemon et un override, il vaut la peine d&#8217;essayer d&#8217;abord les outils natifs &#8211; alias, correspondance floue et pond\u00e9rations r\u00e8glent souvent les \u00ab mauvais r\u00e9sultats \u00bb sans nouvelle infrastructure. Le d\u00e9tail se trouve dans notre <a href=\"https:\/\/presta.site\/blog\/fr\/guide-rapide-pour-configurer-la-recherche-prestashop\/\" data-wpel-link=\"internal\">guide de configuration de la recherche PrestaShop<\/a>. Les libell\u00e9s officiels pour les boutiques actuelles figurent dans la <a href=\"https:\/\/docs.prestashop-project.org\/v.9-documentation\/user-guide\/configuring-shop\/shop-parameters\/search\/search-parameters\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">documentation PrestaShop 9 sur les param\u00e8tres de recherche<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quand la recherche sphinx prestashop vaut l&#8217;investissement<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sphinx devient rentable lorsque :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La recherche produits ou les reconstructions d&#8217;index semblent lentes sous trafic r\u00e9el.<\/li>\n<li>La morphologie \/ le stemming au-del\u00e0 de Shop Parameters \u2192 Search est n\u00e9cessaire.<\/li>\n<li>Un petit service sur le m\u00eame h\u00f4te (ou un h\u00f4te proche) et un cron d&#8217;index sains sont acceptables.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mieux vaut s&#8217;en passer si le catalogue est modeste et que seule la pertinence pose probl\u00e8me &#8211; corriger l&#8217;indexation, les alias et les pond\u00e9rations d&#8217;abord. Pr\u00e9voir aussi une <a href=\"https:\/\/presta.site\/blog\/fr\/comment-creer-une-sauvegarde-dans-prestashop\/\" data-wpel-link=\"internal\">sauvegarde compl\u00e8te PrestaShop<\/a> avant tout override de classe ; un mauvais <code class=\"codecolorer text default\"><span class=\"text\">Search.php<\/span><\/code> peut vider la page de recherche en boutique.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installer Sphinx sur le serveur<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Les noms de paquets varient selon la distribution. Sur Debian\/Ubuntu, si le paquet classique est disponible :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get update\nsudo apt-get install sphinxsearch<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ce paquet est encore pr\u00e9sent sur plusieurs versions de Debian, mais il s&#8217;agit de l&#8217;ancienne ligne Sphinx 2 &#8211; pas Sphinx 3. Si <code class=\"codecolorer text default\"><span class=\"text\">sphinxsearch<\/span><\/code> manque dans les d\u00e9p\u00f4ts, ou pour un build open source maintenu, installer <a href=\"https:\/\/manticoresearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Manticore<\/a> selon les instructions Debian\/Ubuntu actuelles. \u00c9viter de figer d&#8217;anciens noms de <code class=\"codecolorer text default\"><span class=\"text\">.deb<\/span><\/code> copi\u00e9s depuis de vieux tutoriels (par exemple des paquets Sphinx 2.2 de l&#8217;\u00e8re Wheezy) &#8211; utiliser ce que la distribution ou l&#8217;\u00e9diteur documente aujourd&#8217;hui.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les chemins ci-dessous supposent une disposition classique sous <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/sphinxsearch\/<\/span><\/code>. Manticore utilise souvent <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/manticoresearch\/<\/span><\/code>. Noter le port d&#8217;\u00e9coute SQL de l&#8217;installation avant de pointer la recherche sphinx prestashop vers le daemon (Sphinx classique utilisait souvent <code class=\"codecolorer text default\"><span class=\"text\">9306<\/span><\/code> ; d&#8217;autres builds diff\u00e8rent).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configurer la source et l&#8217;index Sphinx<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modifier la configuration (souvent <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/sphinxsearch\/sphinx.conf<\/span><\/code>) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/sphinxsearch\/sphinx.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9finir une source MySQL qui extrait les champs \u00e0 indexer. Remplacer identifiants et pr\u00e9fixe de table par ceux de la boutique (<code class=\"codecolorer text default\"><span class=\"text\">ps_<\/span><\/code> est le pr\u00e9fixe PrestaShop par d\u00e9faut) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>source PrestaSite\n{\n    type = mysql\n    sql_host = localhost\n    sql_user = DBUSER\n    sql_pass = DBPASSWORD\n    sql_db = DBNAME\n    sql_port = 3306\n    sql_query_pre = SET NAMES utf8mb4\n\n    sql_query = \n        SELECT id_product, name, description, description_short \n        FROM ps_product_lang\n}\n\nindex PrestaSite\n{\n    source = PrestaSite\n    path = \/var\/lib\/sphinxsearch\/data\/prestasite\n    morphology = stem_en\n    min_word_len = 1\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La premi\u00e8re colonne de <code class=\"codecolorer text default\"><span class=\"text\">sql_query<\/span><\/code> devient l&#8217;ID document renvoy\u00e9 par Sphinx &#8211; ici <code class=\"codecolorer text default\"><span class=\"text\">id_product<\/span><\/code>. La requ\u00eate est volontairement minimale. Les boutiques multilingues ou multiboutiques filtrent en g\u00e9n\u00e9ral par <code class=\"codecolorer text default\"><span class=\"text\">id_lang<\/span><\/code> \/ boutique, ou construisent un index par langue. Laisser les blocs indexer et search-daemon aux valeurs par d\u00e9faut sauf besoin de ports ou chemins de logs personnalis\u00e9s. Sur Sphinx 3 ou Manticore, la syntaxe de config peut diff\u00e9rer ; mapper les m\u00eames \u00e9l\u00e9ments (identifiants DB, SELECT des champs produits, chemin d&#8217;index).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Construire l&#8217;index et d\u00e9marrer le daemon de recherche<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Indexer une fois, puis d\u00e9marrer le daemon. Sphinx classique utilise <code class=\"codecolorer text default\"><span class=\"text\">indexer<\/span><\/code> \/ <code class=\"codecolorer text default\"><span class=\"text\">searchd<\/span><\/code> ; certains paquets encapsulent les m\u00eames \u00e9tapes dans <code class=\"codecolorer text default\"><span class=\"text\">systemctl<\/span><\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo indexer --all\nsudo searchd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Rafra\u00eechir selon un planning pour que les produits nouveaux ou modifi\u00e9s apparaissent dans les r\u00e9sultats. Toutes les heures est un point de d\u00e9part courant. Dans <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/crontab<\/span><\/code> (crontab syst\u00e8me, avec colonne utilisateur) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>15 * * * * root indexer --all<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Avec un crontab utilisateur (<code class=\"codecolorer text default\"><span class=\"text\">crontab -e<\/span><\/code>), retirer la colonne <code class=\"codecolorer text default\"><span class=\"text\">root<\/span><\/code> et appeler le chemin complet vers <code class=\"codecolorer text default\"><span class=\"text\">indexer<\/span><\/code>. V\u00e9rifier que le daemon \u00e9coute sur le port d\u00e9clar\u00e9 dans la config. En cas d&#8217;\u00e9chec au d\u00e9marrage, contr\u00f4ler les droits sur le <code class=\"codecolorer text default\"><span class=\"text\">path<\/span><\/code> d&#8217;index et qu&#8217;aucun autre service n&#8217;occupe d\u00e9j\u00e0 ce port. La recherche sphinx prestashop ne fonctionne qu&#8217;une fois ce listener pr\u00eat \u00e0 r\u00e9pondre aux requ\u00eates MATCH.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Brancher la recherche sphinx prestashop via un override de Search<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PrestaShop conserve le chargement produits, le stock, les images et les templates. Sphinx ne renvoie que les ID produits correspondants. On surcharge <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> pour que ces ID viennent de Sphinx, puis on ex\u00e9cute une requ\u00eate SQL produit normale pour la langue et la boutique courantes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sur les versions PrestaShop actuelles (1.7 \u00e0 9), <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> garde une liste d&#8217;arguments similaire, mais le corps de m\u00e9thode, la gestion de la recherche floue et le SQL produit ont beaucoup \u00e9volu\u00e9 depuis la 1.6. Ne pas d\u00e9poser un ancien fichier d&#8217;override sur une boutique moderne. Ouvrir le <code class=\"codecolorer text default\"><span class=\"text\">classes\/Search.php<\/span><\/code> de la boutique, copier <code class=\"codecolorer text default\"><span class=\"text\">find<\/span><\/code> dans <code class=\"codecolorer text default\"><span class=\"text\">\/override\/classes\/Search.php<\/span><\/code>, puis remplacer uniquement la partie qui r\u00e9sout les ID produits par une requ\u00eate Sphinx\/Manticore &#8211; conserver le reste de la logique c\u0153ur. Le PHP ci-dessous est une <strong>illustration simplifi\u00e9e<\/strong> de cet \u00e9change d&#8217;ID (SphinxSQL sur le port <code class=\"codecolorer text default\"><span class=\"text\">9306<\/span><\/code>, index <code class=\"codecolorer text default\"><span class=\"text\">PrestaSite<\/span><\/code>), pas un override pr\u00eat \u00e0 coller pour PrestaShop 9.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/\/ Illustration only - adapt against your shop's classes\/Search.php\n\nprotected static function getSphinxResults($search_query, $offset, $page_size)\n{\n    $results = array();\n    $total = 0;\n\n    if (!$search_query) {\n        return null;\n    }\n\n    \/\/ Port and index name must match your Sphinx\/Manticore config\n    $link = @mysqli_connect('127.0.0.1', '', '', '', 9306);\n    if (!$link) {\n        return array('results' =&gt; $results, 'total' =&gt; $total);\n    }\n\n    $query = 'SELECT id FROM `PrestaSite` WHERE MATCH(''.pSQL($search_query).'') LIMIT '.(int)$offset.', '.(int)$page_size;\n    if ($result = $link-&gt;query($query)) {\n        while ($row = $result-&gt;fetch_assoc()) {\n            if (isset($row['id'])) {\n                $results[] = (int) $row['id'];\n            }\n        }\n        $result-&gt;close();\n    }\n\n    $query_total = 'SELECT count(*) AS c FROM `PrestaSite` WHERE MATCH(''.pSQL($search_query).'')';\n    if ($result = $link-&gt;query($query_total)) {\n        $total = (int) $result-&gt;fetch_assoc()['c'];\n        if ($total &gt; 1000) {\n            $total = 1000;\n        }\n        $result-&gt;close();\n    }\n\n    mysqli_close($link);\n\n    return array('results' =&gt; $results, 'total' =&gt; $total);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dans l&#8217;override de <code class=\"codecolorer text default\"><span class=\"text\">find<\/span><\/code>, appeler cet helper, puis restreindre la requ\u00eate produit c\u0153ur avec <code class=\"codecolorer text default\"><span class=\"text\">WHERE p.id_product IN (...)<\/span><\/code> en utilisant les ID renvoy\u00e9s (cast\u00e9s en entiers). C&#8217;est tout le branchement recherche sphinx prestashop : ID depuis le daemon, le reste depuis PrestaShop. Pour la production : \u00e9chapper avec soin, privil\u00e9gier les requ\u00eates pr\u00e9par\u00e9es quand le client le permet, et revenir \u00e0 la recherche native si le daemon est indisponible. Apr\u00e8s enregistrement de l&#8217;override, vider les caches pour que PrestaShop recharge la classe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vider le cache et v\u00e9rifier la recherche en boutique<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Vider le cache depuis Advanced Parameters \u2192 Performance (et supprimer un ancien <code class=\"codecolorer text default\"><span class=\"text\">\/cache\/class_index.php<\/span><\/code> si l&#8217;installation l&#8217;utilise encore).<\/li>\n<li>Confirmer que le fichier d&#8217;override est lisible et nomm\u00e9 exactement <code class=\"codecolorer text default\"><span class=\"text\">Search.php<\/span><\/code> sous <code class=\"codecolorer text default\"><span class=\"text\">\/override\/classes\/<\/span><\/code>.<\/li>\n<li>Rechercher un nom de produit connu dans une fen\u00eatre priv\u00e9e.<\/li>\n<li>En cas de page blanche apr\u00e8s l&#8217;override, traiter comme toute erreur PHP fatale &#8211; voir notre <a href=\"https:\/\/presta.site\/blog\/fr\/ecran-blanc-de-la-mort-dans-prestashop-un-guide-etape-par-etape\/\" data-wpel-link=\"internal\">checklist \u00e9cran blanc de la mort<\/a>, puis restaurer la sauvegarde si besoin.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La recherche sphinx prestashop est une couche d&#8217;infrastructure, pas un interrupteur Back Office. Maintenir le cron indexer, surveiller l&#8217;espace disque du chemin d&#8217;index, et revenir aux r\u00e9glages de recherche native lorsque la pertinence &#8211; et non la vitesse &#8211; est le vrai probl\u00e8me.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Configurer la recherche sphinx prestashop pour acc\u00e9l\u00e9rer les requ\u00eates produits sur les grands catalogues. Installer Sphinx, indexer les produits et brancher un override de Search.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[87],"tags":[],"class_list":["post-894","post","type-post","status-publish","format-standard","hentry","category-developpement"],"_links":{"self":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/comments?post=894"}],"version-history":[{"count":2,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/894\/revisions"}],"predecessor-version":[{"id":1981,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/894\/revisions\/1981"}],"wp:attachment":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/media?parent=894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/categories?post=894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/tags?post=894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}