La recherche catalogue native convient aux petites boutiques. Sur les grands catalogues, chaque frappe et chaque réindexation peuvent ralentir l’expérience. La recherche sphinx prestashop déporte la correspondance plein texte vers un moteur dédié afin que les recherches produits restent rapides, PrestaShop affichant toujours les fiches produit.
Sphinx est un serveur de recherche plein texte. On indexe les champs produits depuis MySQL, on lance un daemon de recherche, puis on surcharge Search::find de PrestaShop pour que les requêtes boutique passent par ce moteur plutôt que par l’index intégré. Deux lignes technologiques comptent en pratique : Sphinx (toujours développé ; les builds Sphinx 3 actuels diffèrent des paquets open source 2.x classiques) et Manticore Search (un fork open source de Sphinx 2.x). Les chemins d’installation et les exemples de configuration ci-dessous suivent les paquets Sphinx 2 classiques comme sphinxsearch sur Debian/Ubuntu. Avec Manticore ou Sphinx 3, attendez-vous à d’autres noms de paquets, répertoires de config et ports d’écoute – le principe reste le même (indexer les ID produits, les interroger depuis PHP).
Avant de s’engager sur un daemon et un override, il vaut la peine d’essayer d’abord les outils natifs – alias, correspondance floue et pondérations règlent souvent les « mauvais résultats » sans nouvelle infrastructure. Le détail se trouve dans notre guide de configuration de la recherche PrestaShop. Les libellés officiels pour les boutiques actuelles figurent dans la documentation PrestaShop 9 sur les paramètres de recherche.
Quand la recherche sphinx prestashop vaut l’investissement
Sphinx devient rentable lorsque :
- La recherche produits ou les reconstructions d’index semblent lentes sous trafic réel.
- La morphologie / le stemming au-delà de Shop Parameters → Search est nécessaire.
- Un petit service sur le même hôte (ou un hôte proche) et un cron d’index sains sont acceptables.
Mieux vaut s’en passer si le catalogue est modeste et que seule la pertinence pose problème – corriger l’indexation, les alias et les pondérations d’abord. Prévoir aussi une sauvegarde complète PrestaShop avant tout override de classe ; un mauvais Search.php peut vider la page de recherche en boutique.
Installer Sphinx sur le serveur
Les noms de paquets varient selon la distribution. Sur Debian/Ubuntu, si le paquet classique est disponible :
sudo apt-get update
sudo apt-get install sphinxsearchCe paquet est encore présent sur plusieurs versions de Debian, mais il s’agit de l’ancienne ligne Sphinx 2 – pas Sphinx 3. Si sphinxsearch manque dans les dépôts, ou pour un build open source maintenu, installer Manticore selon les instructions Debian/Ubuntu actuelles. Éviter de figer d’anciens noms de .deb copiés depuis de vieux tutoriels (par exemple des paquets Sphinx 2.2 de l’ère Wheezy) – utiliser ce que la distribution ou l’éditeur documente aujourd’hui.
Les chemins ci-dessous supposent une disposition classique sous /etc/sphinxsearch/. Manticore utilise souvent /etc/manticoresearch/. Noter le port d’écoute SQL de l’installation avant de pointer la recherche sphinx prestashop vers le daemon (Sphinx classique utilisait souvent 9306 ; d’autres builds diffèrent).
Configurer la source et l’index Sphinx
Modifier la configuration (souvent /etc/sphinxsearch/sphinx.conf) :
sudo nano /etc/sphinxsearch/sphinx.confDéfinir une source MySQL qui extrait les champs à indexer. Remplacer identifiants et préfixe de table par ceux de la boutique (ps_ est le préfixe PrestaShop par défaut) :
source PrestaSite
{
type = mysql
sql_host = localhost
sql_user = DBUSER
sql_pass = DBPASSWORD
sql_db = DBNAME
sql_port = 3306
sql_query_pre = SET NAMES utf8mb4
sql_query =
SELECT id_product, name, description, description_short
FROM ps_product_lang
}
index PrestaSite
{
source = PrestaSite
path = /var/lib/sphinxsearch/data/prestasite
morphology = stem_en
min_word_len = 1
}La première colonne de sql_query devient l’ID document renvoyé par Sphinx – ici id_product. La requête est volontairement minimale. Les boutiques multilingues ou multiboutiques filtrent en général par id_lang / boutique, ou construisent un index par langue. Laisser les blocs indexer et search-daemon aux valeurs par défaut sauf besoin de ports ou chemins de logs personnalisés. Sur Sphinx 3 ou Manticore, la syntaxe de config peut différer ; mapper les mêmes éléments (identifiants DB, SELECT des champs produits, chemin d’index).
Construire l’index et démarrer le daemon de recherche
Indexer une fois, puis démarrer le daemon. Sphinx classique utilise indexer / searchd ; certains paquets encapsulent les mêmes étapes dans systemctl :
sudo indexer --all
sudo searchdRafraîchir selon un planning pour que les produits nouveaux ou modifiés apparaissent dans les résultats. Toutes les heures est un point de départ courant. Dans /etc/crontab (crontab système, avec colonne utilisateur) :
15 * * * * root indexer --allAvec un crontab utilisateur (crontab -e), retirer la colonne root et appeler le chemin complet vers indexer. Vérifier que le daemon écoute sur le port déclaré dans la config. En cas d’échec au démarrage, contrôler les droits sur le path d’index et qu’aucun autre service n’occupe déjà ce port. La recherche sphinx prestashop ne fonctionne qu’une fois ce listener prêt à répondre aux requêtes MATCH.
Brancher la recherche sphinx prestashop via un override de Search
PrestaShop conserve le chargement produits, le stock, les images et les templates. Sphinx ne renvoie que les ID produits correspondants. On surcharge Search::find pour que ces ID viennent de Sphinx, puis on exécute une requête SQL produit normale pour la langue et la boutique courantes.
Sur les versions PrestaShop actuelles (1.7 à 9), Search::find garde une liste d’arguments similaire, mais le corps de méthode, la gestion de la recherche floue et le SQL produit ont beaucoup évolué depuis la 1.6. Ne pas déposer un ancien fichier d’override sur une boutique moderne. Ouvrir le classes/Search.php de la boutique, copier find dans /override/classes/Search.php, puis remplacer uniquement la partie qui résout les ID produits par une requête Sphinx/Manticore – conserver le reste de la logique cœur. Le PHP ci-dessous est une illustration simplifiée de cet échange d’ID (SphinxSQL sur le port 9306, index PrestaSite), pas un override prêt à coller pour PrestaShop 9.
<?php
// Illustration only - adapt against your shop's classes/Search.php
protected static function getSphinxResults($search_query, $offset, $page_size)
{
$results = array();
$total = 0;
if (!$search_query) {
return null;
}
// Port and index name must match your Sphinx/Manticore config
$link = @mysqli_connect('127.0.0.1', '', '', '', 9306);
if (!$link) {
return array('results' => $results, 'total' => $total);
}
$query = 'SELECT id FROM `PrestaSite` WHERE MATCH(''.pSQL($search_query).'') LIMIT '.(int)$offset.', '.(int)$page_size;
if ($result = $link->query($query)) {
while ($row = $result->fetch_assoc()) {
if (isset($row['id'])) {
$results[] = (int) $row['id'];
}
}
$result->close();
}
$query_total = 'SELECT count(*) AS c FROM `PrestaSite` WHERE MATCH(''.pSQL($search_query).'')';
if ($result = $link->query($query_total)) {
$total = (int) $result->fetch_assoc()['c'];
if ($total > 1000) {
$total = 1000;
}
$result->close();
}
mysqli_close($link);
return array('results' => $results, 'total' => $total);
}Dans l’override de find, appeler cet helper, puis restreindre la requête produit cœur avec WHERE p.id_product IN (...) en utilisant les ID renvoyés (castés en entiers). C’est tout le branchement recherche sphinx prestashop : ID depuis le daemon, le reste depuis PrestaShop. Pour la production : échapper avec soin, privilégier les requêtes préparées quand le client le permet, et revenir à la recherche native si le daemon est indisponible. Après enregistrement de l’override, vider les caches pour que PrestaShop recharge la classe.
Vider le cache et vérifier la recherche en boutique
- Vider le cache depuis Advanced Parameters → Performance (et supprimer un ancien
/cache/class_index.phpsi l’installation l’utilise encore). - Confirmer que le fichier d’override est lisible et nommé exactement
Search.phpsous/override/classes/. - Rechercher un nom de produit connu dans une fenêtre privée.
- En cas de page blanche après l’override, traiter comme toute erreur PHP fatale – voir notre checklist écran blanc de la mort, puis restaurer la sauvegarde si besoin.
La recherche sphinx prestashop est une couche d’infrastructure, pas un interrupteur Back Office. Maintenir le cron indexer, surveiller l’espace disque du chemin d’index, et revenir aux réglages de recherche native lorsque la pertinence – et non la vitesse – est le vrai problème.
