13

Prima di tutto, ho trovato domande simili in SO ma non c'è alcuna risposta per loro. Quindi, la prima parte della domanda è un po 'duplicata. Voglio migliorare i risultati di ricerca in Magento. Ecco quello che ho fatto già:Come e dove modificare la query di ricerca Magento?

1. Cerca con AND invece di OR quando ci sono più parole.

2. La ricerca Ajax inizia a cercare da qualsiasi luogo e non solo dall'inizio dei campi.

3. Tagliare l'ultimo s dalle parole per evitare risultati vuoti durante la ricerca con plurali.

4. ho cambiato il tipo di ricerca Like-Fulltext o Combine ma i risultati non erano meglio e anche erano peggiori, quindi lo lascio così com'è. È Like ora, quindi non c'è l'ordinazione relevance.

L'ultima cosa che voglio provare è adding this to the search query:

SELECT ... other non-full-text-cols 
MATCH (product_title) AGAINST ('lean body for her') AS rel1, 
MATCH (content) AGAINST ('lean body for her') AS rel2 
FROM table 
WHERE MATCH (product_title,content) AGAINST ('lean body for her') 
ORDER BY (rel1*1.5)+(rel2) 

Ecco la mia domanda, ma non sono sicuro se avrebbe funzionato perché non posso provarlo:

$this->_productCollection->addAttributeToSelect(
    array(
    'rel1' => new Zend_Db_Expr('MATCH (name) AGAINST ("'.$queryText.'")'), 
    'rel2' => new Zend_Db_Expr('MATCH (short_description) AGAINST ("'.$queryText.'")') 
    ) 
); 

$this->_productCollection->getSelect() 
    ->where('MATCH (name,short_description) AGAINST ("'.$queryText.'")') 
    ->order('(rel1*1.5)+(rel2)'); 

L'idea principale è quella di aggiungere un bonus weight a un risultato se la query di ricerca si trova nel titolo del prodotto. Il problema è che non so dove modificare la query. Non riesco a trovare dove sia. $this->_productCollection non è l'oggetto giusto, lo so. Ho guardato tutti i file Collection.php, i modelli di risorse, i modelli e anche il registro delle query ma senza fortuna. Ci sono solo 1 o 2 parti di riga in alcuni file ma non una query completa. Sono nuovo di Magento e ho ancora problemi con la ricerca di questo tipo di cose. Quindi, dove devo inserire le mie cose aggiuntive quando devo estendere una query?

Community Edition Magento, versione 1.6.1.0.

Nota: so che alcune estensioni per migliorare i risultati di ricerca funzioneranno molto meglio delle mie soluzioni ma per ora devo farlo in questo modo. Sarebbe anche una bella esperienza per me.

Edit:

Così, ho capito come aggiungere i miei campi personalizzati per l'ordinamento, ma è
untruly credo. Nel metodo class Mage_CatalogSearch_Model_Layer extends Mage_Catalog_Model_Layer s' prepareProductCollection ho aggiunto due si unisce alla query e ottenere i campi rel1 e rel2:

$collection->getSelect()->joinLeft(
    array('cpev' => 'catalog_product_entity_varchar'), 
    'cpev.entity_id = e.entity_id AND cpev.attribute_id = 96', 
    array('rel1' => new Zend_Db_Expr('2.01*(LENGTH(cpev.value) - LENGTH(REPLACE(LCASE(cpev.value), LCASE("'.$queryText.'"), "")))/LENGTH("'.$queryText.'")')) 
); 

$collection->getSelect()->joinLeft(
    array('cpet' => 'catalog_product_entity_text'), 
    'cpet.entity_id = e.entity_id AND cpet.attribute_id = 506', 
    array('rel2' => new Zend_Db_Expr('(LENGTH(cpet.value) - LENGTH(REPLACE(LCASE(cpet.value), LCASE("'.$queryText.'"), "")))/LENGTH("'.$queryText.'")')) 
); 

ho questi campi ora, ma come si può vedere che ho codificato duro roba come attribute_id = 96 ecc che non è buono a tutti e non funzionerà ogni volta - ho controllato questi ID direttamente dalle tabelle del database. L'ho scritto così perché non ho accesso ai campi name e short_description ma sono nel risultato. Non so perché. Quindi, cpev.value è il campo name e cpet.value è il campo short_description. Inoltre non posso ordinare i risultati con questi campi.Ho provato $collection->addOrder('SUM(rel1+rel2)');, $collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');, alcune cose addAttributeToFilter ecc. Ma non funziona.

Edit 2: ho accettato @james 'risposta, ma alla fine abbiamo comprato un'estensione per migliorare i risultati di ricerca.

+0

Utilizzo di Solr o ElasticSearch Credo che sia un approccio migliore al problema. È una soluzione migliore per coprire la ricerca al plurale/singolare, i sinonimi, l'ortografia, la pertinenza. – FlorinelChis

+0

Grazie, @FlorinelChis. Ho controllato anche diverse estensioni Magento. Ma per ora voglio farlo in questo modo perché non ho molta esperienza nell'aggiunta di materiale di terze parti e la seconda è che non ho molti diritti sul web shop. Potresti aiutare a modificare la query originale, per favore? – enenen

risposta

4

In Mage_CatalogSearch_Model_Resource_Fulltext check out prepareResult (linea 310 in 1,7 CE) e cercare il seguente:

$select->columns(array('relevance' => new Zend_Db_Expr(0))); 

Magento imposta tutte le rilevanze dei risultati di ricerca come 0; (!) aggiungi le pertinenze che vuoi (più in alto è meglio) qui. È possibile creare una query personalizzata in Zend_Db_Expr() per generare rilevanze più elevate sulle corrispondenze degli attributi.

3

La risposta alla prima domanda (1): Per effettuare una e cercare invece di O, è necessario riscrivere la classe

Mage_CatalogSearch_Model_Resource_Fulltext 

Nel metodo

public function prepareResult($object, $queryText, $query) 

vuoi per commutare la parte

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

a

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

Assicurarsi di reindicizzare l'indice di ricerca in seguito per avere un effetto.

+0

_ Ecco cosa ho già fatto: _ era in testa alla lista –

+0

@mpaepper, li ho già fatti. Il mio problema è la modifica della query di ricerca. – enenen

+0

@enenen Spiacente, ho letto male nella tua domanda. – mpaepper

Problemi correlati