La ricerca nativa del catalogo va bene sui negozi piccoli. Su cataloghi grandi può rallentare a ogni battitura e a ogni reindicizzazione. La ricerca sphinx prestashop sposta la corrispondenza full-text su un motore dedicato, così le ricerche prodotti restano veloci mentre PrestaShop continua a renderizzare le schede prodotto.
Sphinx è un server di ricerca full-text. Indicizzi i campi prodotto da MySQL, avvii un daemon di ricerca, poi sovrascrivi il metodo Search::find di PrestaShop così le query del negozio colpiscono quel motore invece dell’indice integrato. Due linee della tecnologia contano in pratica: Sphinx (ancora in sviluppo; le build attuali di Sphinx 3 differiscono dai classici pacchetti open source 2.x) e Manticore Search (un fork open source di Sphinx 2.x). I percorsi di installazione e gli esempi di configurazione qui sotto seguono i pacchetti in stile Sphinx 2 classico, come sphinxsearch su Debian/Ubuntu. Su Manticore o Sphinx 3, aspettati nomi pacchetto, directory di configurazione e porte in ascolto diverse – mantieni la stessa idea (indicizza gli ID prodotto, interrogali da PHP).
Prima di impegnarti con un daemon e un override, prova prima gli strumenti nativi – alias, fuzzy matching e pesi risolvono spesso i risultati scarsi senza nuova infrastruttura. Segui la procedura nella nostra guida alla configurazione della ricerca in PrestaShop. Le etichette ufficiali delle opzioni per i negozi attuali sono nella documentazione sui parametri di ricerca di PrestaShop 9.
Quando la ricerca sphinx prestashop vale la configurazione
Sphinx ripaga l’investimento quando:
- La ricerca prodotti o la ricostruzione dell’indice rallentano sotto traffico reale.
- Hai bisogno di morfologia / stemming oltre quanto offre Shop Parameters → Search.
- Ti senti a tuo agio nel far girare un piccolo servizio sullo stesso host (o uno vicino) e nel mantenere sano un cron dell’indice.
Salta l’integrazione quando il catalogo è modesto e il problema è solo la pertinenza – correggi prima indicizzazione, alias e pesi. Esegui anche un backup completo di PrestaShop prima di qualsiasi override di classe; un Search.php errato può far comparire una pagina di ricerca vuota nel negozio.
Installare Sphinx sul server
I nomi dei pacchetti cambiano a seconda della distribuzione. Su Debian/Ubuntu, se il pacchetto classico è disponibile:
sudo apt-get update
sudo apt-get install sphinxsearchQuel pacchetto è ancora presente su diverse release Debian, ma appartiene alla vecchia linea Sphinx 2 – non a Sphinx 3. Se sphinxsearch manca nei tuoi repository, o vuoi una build open source mantenuta, installa Manticore seguendo le istruzioni Debian/Ubuntu attuali. Evita di fissare vecchi nomi di file .deb copiati da tutorial datati (ad esempio pacchetti Sphinx 2.2 dell’era Wheezy) – prendi ciò che la tua distribuzione o il vendor documentano oggi.
I percorsi qui sotto assumono un layout classico sotto /etc/sphinxsearch/. Manticore usa spesso /etc/manticoresearch/. Annota la porta SQL in ascolto dalle istruzioni di installazione prima di puntare la ricerca sphinx prestashop al daemon (il Sphinx classico usava spesso 9306; altre build differiscono).
Configurare la sorgente e l’indice Sphinx
Modifica la configurazione (spesso /etc/sphinxsearch/sphinx.conf):
sudo nano /etc/sphinxsearch/sphinx.confDefinisci una sorgente MySQL che estrae i campi che vuoi rendere ricercabili. Sostituisci credenziali e prefisso tabella con i valori del tuo negozio (ps_ è il prefisso PrestaShop predefinito):
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 prima colonna di sql_query diventa l’ID documento che Sphinx restituisce – qui è id_product. La query è volutamente minimale. I negozi multilingua o multistore filtrano di solito per id_lang / shop, oppure costruiscono un indice per lingua. Lascia i blocchi indexer e search-daemon ai valori predefiniti sensati, a meno che tu non abbia bisogno di porte o percorsi log personalizzati. Su Sphinx 3 o Manticore, la sintassi di configurazione può essere diversa; mappa gli stessi elementi (credenziali DB, SELECT dei campi prodotto, percorso indice).
Costruire l’indice e avviare il daemon di ricerca
Indicizza una volta, poi avvia il daemon. Il Sphinx classico usa indexer / searchd; alcuni pacchetti racchiudono gli stessi passaggi in systemctl:
sudo indexer --all
sudo searchdAggiorna su un programma così i prodotti nuovi e modificati compaiono nei risultati. Ogni ora è un punto di partenza comune. In /etc/crontab (crontab di sistema, che include una colonna username):
15 * * * * root indexer --allSe usi un crontab utente (crontab -e), togli la colonna root e chiama il percorso completo di indexer. Verifica che il daemon sia in ascolto sulla porta dichiarata nella configurazione. Se non parte, controlla i permessi sul path dell’indice e che nessun altro processo occupi già quella porta. La ricerca sphinx prestashop funziona solo quando questo listener risponde alle query MATCH.
Collegare la ricerca sphinx prestashop con un override di Search
PrestaShop gestisce ancora caricamento prodotti, stock, immagini e template. Sphinx restituisce solo gli ID prodotto corrispondenti. Sovrascrivi Search::find così quegli ID arrivano da Sphinx, poi esegui una normale query SQL prodotti per lingua e negozio correnti.
Sulle release PrestaShop attuali (dalla 1.7 alla 9), Search::find accetta ancora una lista di argomenti simile, ma il corpo del metodo, la gestione della fuzzy search e la query SQL prodotti sono cambiati molto dalla 1.6. Non copiare un vecchio file override su un negozio moderno. Apri il classes/Search.php del tuo negozio, copia find in /override/classes/Search.php, poi sostituisci solo la parte che risolve gli ID prodotto corrispondenti con una query Sphinx/Manticore – mantieni il resto della logica core. Il PHP qui sotto è un’illustrazione semplificata di quello scambio di ID (SphinxSQL sulla porta 9306, nome indice PrestaSite), non un override pronto da incollare per 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);
}Nel tuo override di find, chiama quell’helper, poi restringi la query prodotti core con WHERE p.id_product IN (...) usando gli ID restituiti (convertiti in interi). Questo è l’intero hook della ricerca sphinx prestashop: ID dal daemon, tutto il resto da PrestaShop. Rafforza per la produzione: esegui l’escape con cura, preferisci prepared statement dove il client lo consente, e torna alla ricerca nativa se il daemon è giù. Dopo aver salvato l’override, svuota le cache così PrestaShop ricarica la classe.
Svuotare la cache e verificare la ricerca nel negozio
- Svuota la cache da Advanced Parameters → Performance (e rimuovi un legacy
/cache/class_index.phpse la tua installazione usa ancora quel percorso). - Verifica che il file override sia leggibile e si chiami esattamente
Search.phpsotto/override/classes/. - Cerca il nome di un prodotto noto in una finestra privata.
- Se dopo l’override compare una pagina bianca, trattala come qualsiasi errore PHP fatale – consulta la nostra checklist sulla schermata bianca della morte, poi ripristina il backup se necessario.
La ricerca sphinx prestashop è infrastruttura, non un interruttore nel Back Office. Mantieni onesto il cron dell’indexer, controlla lo spazio disco sul percorso dell’indice e rivedi le impostazioni di ricerca native ogni volta che il vero problema è la pertinenza – non la velocità.
