{"id":1021,"date":"2021-10-22T15:18:50","date_gmt":"2021-10-22T12:18:50","guid":{"rendered":"https:\/\/presta.site\/blog\/utilizzare-la-ricerca-sphinx-in-prestashop\/"},"modified":"2026-07-24T15:01:00","modified_gmt":"2026-07-24T12:01:00","slug":"utilizzare-la-ricerca-sphinx-in-prestashop","status":"publish","type":"post","link":"https:\/\/presta.site\/blog\/it\/utilizzare-la-ricerca-sphinx-in-prestashop\/","title":{"rendered":"Ricerca Sphinx PrestaShop: catalogo pi\u00f9 veloce nei negozi grandi"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">La ricerca nativa del catalogo va bene sui negozi piccoli. Su cataloghi grandi pu\u00f2 rallentare a ogni battitura e a ogni reindicizzazione. La <strong>ricerca sphinx prestashop<\/strong> sposta la corrispondenza full-text su un motore dedicato, cos\u00ec le ricerche prodotti restano veloci mentre PrestaShop continua a renderizzare le schede prodotto.<\/p>\n\n\n<!--more-->\n\n\n<p class=\"wp-block-paragraph\">Sphinx \u00e8 un server di ricerca full-text. Indicizzi i campi prodotto da MySQL, avvii un daemon di ricerca, poi sovrascrivi il metodo <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> di PrestaShop cos\u00ec le query del negozio colpiscono quel motore invece dell&#8217;indice integrato. Due linee della tecnologia contano in pratica: <a href=\"https:\/\/sphinxsearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Sphinx<\/a> (ancora in sviluppo; le build attuali di Sphinx 3 differiscono dai classici pacchetti open source 2.x) e <a href=\"https:\/\/manticoresearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Manticore Search<\/a> (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 <code class=\"codecolorer text default\"><span class=\"text\">sphinxsearch<\/span><\/code> su Debian\/Ubuntu. Su Manticore o Sphinx 3, aspettati nomi pacchetto, directory di configurazione e porte in ascolto diverse &#8211; mantieni la stessa idea (indicizza gli ID prodotto, interrogali da PHP).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di impegnarti con un daemon e un override, prova prima gli strumenti nativi &#8211; alias, fuzzy matching e pesi risolvono spesso i risultati scarsi senza nuova infrastruttura. Segui la procedura nella nostra <a href=\"https:\/\/presta.site\/blog\/it\/guida-rapida-alla-configurazione-della-ricerca-in-prestashop\/\" data-wpel-link=\"internal\">guida alla configurazione della ricerca in PrestaShop<\/a>. Le etichette ufficiali delle opzioni per i negozi attuali sono nella <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\">documentazione sui parametri di ricerca di PrestaShop 9<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quando la ricerca sphinx prestashop vale la configurazione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sphinx ripaga l&#8217;investimento quando:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La ricerca prodotti o la ricostruzione dell&#8217;indice rallentano sotto traffico reale.<\/li>\n<li>Hai bisogno di morfologia \/ stemming oltre quanto offre Shop Parameters \u2192 Search.<\/li>\n<li>Ti senti a tuo agio nel far girare un piccolo servizio sullo stesso host (o uno vicino) e nel mantenere sano un cron dell&#8217;indice.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Salta l&#8217;integrazione quando il catalogo \u00e8 modesto e il problema \u00e8 solo la pertinenza &#8211; correggi prima indicizzazione, alias e pesi. Esegui anche un <a href=\"https:\/\/presta.site\/blog\/it\/come-creare-un-backup-in-prestashop\/\" data-wpel-link=\"internal\">backup completo di PrestaShop<\/a> prima di qualsiasi override di classe; un <code class=\"codecolorer text default\"><span class=\"text\">Search.php<\/span><\/code> errato pu\u00f2 far comparire una pagina di ricerca vuota nel negozio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installare Sphinx sul server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I nomi dei pacchetti cambiano a seconda della distribuzione. Su Debian\/Ubuntu, se il pacchetto classico \u00e8 disponibile:<\/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\">Quel pacchetto \u00e8 ancora presente su diverse release Debian, ma appartiene alla vecchia linea Sphinx 2 &#8211; non a Sphinx 3. Se <code class=\"codecolorer text default\"><span class=\"text\">sphinxsearch<\/span><\/code> manca nei tuoi repository, o vuoi una build open source mantenuta, installa <a href=\"https:\/\/manticoresearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Manticore<\/a> seguendo le istruzioni Debian\/Ubuntu attuali. Evita di fissare vecchi nomi di file <code class=\"codecolorer text default\"><span class=\"text\">.deb<\/span><\/code> copiati da tutorial datati (ad esempio pacchetti Sphinx 2.2 dell&#8217;era Wheezy) &#8211; prendi ci\u00f2 che la tua distribuzione o il vendor documentano oggi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I percorsi qui sotto assumono un layout classico sotto <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/sphinxsearch\/<\/span><\/code>. Manticore usa spesso <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/manticoresearch\/<\/span><\/code>. Annota la porta SQL in ascolto dalle istruzioni di installazione prima di puntare la ricerca sphinx prestashop al daemon (il Sphinx classico usava spesso <code class=\"codecolorer text default\"><span class=\"text\">9306<\/span><\/code>; altre build differiscono).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configurare la sorgente e l&#8217;indice Sphinx<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modifica la configurazione (spesso <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\">Definisci una sorgente MySQL che estrae i campi che vuoi rendere ricercabili. Sostituisci credenziali e prefisso tabella con i valori del tuo negozio (<code class=\"codecolorer text default\"><span class=\"text\">ps_<\/span><\/code> \u00e8 il prefisso PrestaShop predefinito):<\/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 prima colonna di <code class=\"codecolorer text default\"><span class=\"text\">sql_query<\/span><\/code> diventa l&#8217;ID documento che Sphinx restituisce &#8211; qui \u00e8 <code class=\"codecolorer text default\"><span class=\"text\">id_product<\/span><\/code>. La query \u00e8 volutamente minimale. I negozi multilingua o multistore filtrano di solito per <code class=\"codecolorer text default\"><span class=\"text\">id_lang<\/span><\/code> \/ 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\u00f2 essere diversa; mappa gli stessi elementi (credenziali DB, SELECT dei campi prodotto, percorso indice).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Costruire l&#8217;indice e avviare il daemon di ricerca<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Indicizza una volta, poi avvia il daemon. Il Sphinx classico usa <code class=\"codecolorer text default\"><span class=\"text\">indexer<\/span><\/code> \/ <code class=\"codecolorer text default\"><span class=\"text\">searchd<\/span><\/code>; alcuni pacchetti racchiudono gli stessi passaggi in <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\">Aggiorna su un programma cos\u00ec i prodotti nuovi e modificati compaiono nei risultati. Ogni ora \u00e8 un punto di partenza comune. In <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/crontab<\/span><\/code> (crontab di sistema, che include una colonna username):<\/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\">Se usi un crontab utente (<code class=\"codecolorer text default\"><span class=\"text\">crontab -e<\/span><\/code>), togli la colonna <code class=\"codecolorer text default\"><span class=\"text\">root<\/span><\/code> e chiama il percorso completo di <code class=\"codecolorer text default\"><span class=\"text\">indexer<\/span><\/code>. Verifica che il daemon sia in ascolto sulla porta dichiarata nella configurazione. Se non parte, controlla i permessi sul <code class=\"codecolorer text default\"><span class=\"text\">path<\/span><\/code> dell&#8217;indice e che nessun altro processo occupi gi\u00e0 quella porta. La ricerca sphinx prestashop funziona solo quando questo listener risponde alle query MATCH.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Collegare la ricerca sphinx prestashop con un override di Search<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PrestaShop gestisce ancora caricamento prodotti, stock, immagini e template. Sphinx restituisce solo gli ID prodotto corrispondenti. Sovrascrivi <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> cos\u00ec quegli ID arrivano da Sphinx, poi esegui una normale query SQL prodotti per lingua e negozio correnti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sulle release PrestaShop attuali (dalla 1.7 alla 9), <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> 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 <code class=\"codecolorer text default\"><span class=\"text\">classes\/Search.php<\/span><\/code> del tuo negozio, copia <code class=\"codecolorer text default\"><span class=\"text\">find<\/span><\/code> in <code class=\"codecolorer text default\"><span class=\"text\">\/override\/classes\/Search.php<\/span><\/code>, poi sostituisci solo la parte che risolve gli ID prodotto corrispondenti con una query Sphinx\/Manticore &#8211; mantieni il resto della logica core. Il PHP qui sotto \u00e8 un&#8217;<strong>illustrazione semplificata<\/strong> di quello scambio di ID (SphinxSQL sulla porta <code class=\"codecolorer text default\"><span class=\"text\">9306<\/span><\/code>, nome indice <code class=\"codecolorer text default\"><span class=\"text\">PrestaSite<\/span><\/code>), non un override pronto da incollare per 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\">Nel tuo override di <code class=\"codecolorer text default\"><span class=\"text\">find<\/span><\/code>, chiama quell&#8217;helper, poi restringi la query prodotti core con <code class=\"codecolorer text default\"><span class=\"text\">WHERE p.id_product IN (...)<\/span><\/code> usando gli ID restituiti (convertiti in interi). Questo \u00e8 l&#8217;intero hook della ricerca sphinx prestashop: ID dal daemon, tutto il resto da PrestaShop. Rafforza per la produzione: esegui l&#8217;escape con cura, preferisci prepared statement dove il client lo consente, e torna alla ricerca nativa se il daemon \u00e8 gi\u00f9. Dopo aver salvato l&#8217;override, svuota le cache cos\u00ec PrestaShop ricarica la classe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Svuotare la cache e verificare la ricerca nel negozio<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Svuota la cache da Advanced Parameters \u2192 Performance (e rimuovi un legacy <code class=\"codecolorer text default\"><span class=\"text\">\/cache\/class_index.php<\/span><\/code> se la tua installazione usa ancora quel percorso).<\/li>\n<li>Verifica che il file override sia leggibile e si chiami esattamente <code class=\"codecolorer text default\"><span class=\"text\">Search.php<\/span><\/code> sotto <code class=\"codecolorer text default\"><span class=\"text\">\/override\/classes\/<\/span><\/code>.<\/li>\n<li>Cerca il nome di un prodotto noto in una finestra privata.<\/li>\n<li>Se dopo l&#8217;override compare una pagina bianca, trattala come qualsiasi errore PHP fatale &#8211; consulta la nostra <a href=\"https:\/\/presta.site\/blog\/it\/schermata-bianca-della-morte-in-prestashop-una-guida-passo-passo\/\" data-wpel-link=\"internal\">checklist sulla schermata bianca della morte<\/a>, poi ripristina il backup se necessario.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La ricerca sphinx prestashop \u00e8 infrastruttura, non un interruttore nel Back Office. Mantieni onesto il cron dell&#8217;indexer, controlla lo spazio disco sul percorso dell&#8217;indice e rivedi le impostazioni di ricerca native ogni volta che il vero problema \u00e8 la pertinenza &#8211; non la velocit\u00e0.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Configura la ricerca sphinx prestashop per velocizzare le query prodotto su cataloghi grandi. Installa Sphinx, indicizza i prodotti e collega un override di Search.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[140],"tags":[],"class_list":["post-1021","post","type-post","status-publish","format-standard","hentry","category-sviluppo"],"_links":{"self":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/1021","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=1021"}],"version-history":[{"count":1,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/1021\/revisions"}],"predecessor-version":[{"id":1983,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/1021\/revisions\/1983"}],"wp:attachment":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/media?parent=1021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/categories?post=1021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/tags?post=1021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}