Prima o poi ogni felice possessore di un sito Magento si trova a dover fare i conti con la famigerata funzionalità di ricerca del frontend. Nonostante tutti i tentativi e le modifiche nella configurazione di sistema, se proviamo a cercare uno dei nostri prodotti sulla parte pubblica del sito i risultati sono a dir poco “originali”. Pagine e pagine di prodotti possono essere visualizzate prima del prodotto di cui si è digitato il nome, gettando nello sconcerto l'amministratore che già trema al solo pensiero delle vendite potenzialmente perse.

Il motivo per cui la ricerca lato pubblico è inferiore persino alla semplice ricerca lato amministrazione che si usa normalmente nella griglia dei prodotti, è dovuto ad una scelta opinabile del team di sviluppo magento. I termini inseriti nel campo di ricerca infatti vengono ricercati con la relazione OR invece che AND. Ciò comporta che se inseriamo nel campo di ricerca ad esempio la frase

“Samsung Galaxy S6”

verranno visualizzati tutti i prodotti che hanno all'interno degli attributi ricercabili la parola Samsung oppure la parola Galaxy oppure la parola S6. In un catalogo particolarmente voluminoso abbiamo riscontrato che il prodotto in questione viene visualizzato solo dopo alcune decine di prodotti (Samsung e non).

Per ovviare a questo comportamento è necessario rivedere una classe del core di magento chiamata

Mage_CatalogSearch_Model_Resource_Fulltext

che si trova appunto all'interno del file

app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php

alla linea 331 troveremo

$likeCond = '(' . join(' OR ', $like) . ')';

è sufficiente sostituire l'OR con un AND

$likeCond = '(' . join(' AND ', $like) . ')';

 

quindi nella configurazione di sistema impostare la ricerca di tipo Like e resettare la cache della ricerca. A questo punto i risultati prodotti dalla ricerca saranno finalmente quelli attesi.

Per la modifica del file sconsigliamo vivamente di operare direttamente sul file del core di magento in quanto la modifica andrebbe persa al prossimo aggiornamento. Suggeriamo invece di copiare il file all'interno del codepool local per fare l'override della classe. Quindi il file dovrebbe essere copiato all'interno di

app/code/local/Mage/CatalogSearch/Model/Resource/Fulltext.php

lasciando intatto il file del core.