Luca Peressini: Integrare Apache Solr in Magento per migliorare la ricerca

of 41 /41

Embed Size (px)

description

Meet Magento Italy - 3 e 4 giugno 2014 - Milano Luca Peressini: Talk Business Integrare Apache Solr in Magento per migliorare la ricerca. Gli utenti di un sito eCommerce che usano il motore di ricerca hanno un tasso di conversione molto più alto rispetto agli utenti che non lo usano. Lo dimostrano diversi studi. Alcuni parlano addirittura di un raddoppio del conversion rate quando l’utente passa attraverso la ricerca del sito. Qualora però l’utente non trovi subito il prodotto che cerca, è il bounce rate a crescere in modo pericoloso, trasformando così in un’arma a doppio taglio le funzionalità di ricerca, se non sono sufficientemente intelligenti. Fornire, perciò, un servizio di ricerca semplice e veloce, e allo stesso tempo completo e ricco di funzionalità perché l’utente trovi il prodotto desiderato anche quando non sa esattamente cosa cercare, è fondamentale. Il motore di ricerca offerto da Magento non è sufficiente a questo scopo, ma diviene molto performante se integrato con uno strumento come Apache Solr, ovvero una enterprise search platform che consente di indicizzare i prodotti del proprio sito eCommerce e di offrire funzionalità di ricerca veloci e pro-attive (in grado, tra le altre cose, di prevedere cosa l’utente sta cercando e di dargli dei suggerimenti). Luca Peressini nel suo talk presenta un confronto tra le funzionalità di ricerca standard di Magento e quelle fornite dall’integrazione con Apache Solr, spunto da cui partire per analizzare i vantaggi, le potenzialità e le modalità di adozione di questa piattaforma.

Transcript of Luca Peressini: Integrare Apache Solr in Magento per migliorare la ricerca

  • 1. Chi sono? Magento e TYPO3 developer in

2. Di cosa vi parler - Limportanza della ricerca nelle-commerce - Cosa offre Magento - Apache Solr - Prestazioni - Qualcosa in pi 3. Ricerca 4. Perch importante L80% di chi acquista usa la ricerca per trovare quello che vuole Chi trova un prodotto attraverso la ricerca interna compra il doppio delle volte Lutente non ha sempre voglia e pazienza di navigare il catalogo per trovare quello che vuole Suggerimenti Rich auto-complete search box Aumenta le vendite fino a 4 volte Jakob Nielsen, UseIt.com 5. Rilevanza dei risultati I migliori della classe, per quanto riguarda la rilevanza della ricerca, riescono a fornire il prodotto cercato tra i primi 10 solo nel 67% dei casi La ricerca un aspetto complesso che deve essere adattato al tipo di dominio e al gruppo di utenti. Aberdeen Group study Abituati bene 6. Cosa offre Magento EE Like Fulltext serach Like + Fulltext - Non perde risultati - Problemi di prestazioni - Tende a restituire pi di quello che serve - Molto veloce anche su database grandi - Risultati spesso poco rilevanti - Poca personalizzazione (score e token) - Migliora la rilevanza della ricerca - Problemi di prestazioni 7. Mysql Fulltext 2 Modalit Natural Language Boolean Mode - Score basato su TF-IDF (term frequency / inverse document frequency) - MATCH (+keyword1, -keyword2) - Score basato su numero di match - Pesi diversi alle parole - No customizzazioni sul metodo che usa per spezzare in parole - Tokenize - Numero minimo di caratteri 4 (impostazione modificabile a livello global) - Elenco di stopwords (impostazione modificabile a livello global) - Le parole presenti nel 50% dei documenti vengono trattate come stopwords Caratteristiche comuni 8. Problemi Fulltext (1/3) Risultato atteso: http://dev.mysql.com/doc/refman/5.7/en//fulltext-stopwords.html Problemi Fulltext Lunghezza minima della parola 4 caratteri e lista di parole ignorate: Seven bag 9. Query: school Calcolo della rilevanza disatteso, vorrei che il primo risultato fosse loggetto che ha la Keyword nel nome. Problemi Fulltext (2/3) Rilevanza risultati 10. Problemi Fulltext (3/3) Query: jeens Se lutente sbaglia non ottiene nessun risultato Limportanza del Did you mean... Spellcheck 11. Apache Solr 12. cos High performance search engine server (basato su ) Open Source - 100% Java caratteristiche - Funzionalit avanzate di ricerca fulltext - Flessibile e configurabile via XML - Estendibile attraverso plug-in - REST-like APIs - Eseguito esternamente alla web-app in un Java servlet container (Tomcat, Jetty ) - Ottimizzato per alti volumi di traffico e predisposto per scalare (replication e sharding) - Indicizza documenti come insiemi di attributi (chiave valore) - Parser di documenti di formati diversi (es. word, PDF, ...) Attuali versioni stabili: 3.6.2 - 4.8.1 13. Funzionalit di ricerca avanzata - Stemming Es. "pescare", "pescato", "pescatore" si riferisco a "pesce" - Fuzzy search (es. shirt = sirt) - Score dei risultati basati su (VSM, TF, IDF, doc/query Boost, funzioni custom es. log(sum(popularity,1))) - Schemaless - Faccette (Layer navigation) - Content elevation (risultati sponsorizzati) - Did you mean? - Stopwords e Synonyms (divisi per lingua) - Recommendations (More Like This) - Geographical search 14. Configurabile da XML - ${solr.solr.home}/solr.xml - ${istanceDir}/conf/solrconfig.xml - ${istanceDir}/conf/schema.xml (configurazioni: cache, ricerca, index ) (definisce la struttura dei documenti che indicizza) Esempio di Schema 15. Solr + Magento EE - Codice EE per lintegrazione + pre-configurazione per Solr 3.6.2 - Sostituisce la ricerca standard con fallback a Mysql nel caso Solr non risponda - Sistema di indexing integrato - Ritorna lelenco degli ID 16. Solr + Magento EE - Suggerimenti e autocorrezioni - Calolo della rilevanza in base al peso degli attributi - Stopwords multi-lingua - Faccette (Layer navigation) - Ricerca con caratteri speciali spider man | spiderman = > spider-man - Migliori performance Con elevato traffico, Solr evita i frequenti updates della tabella MySQLcatalogsearch_fulltext e mitiga il problema dei lock del db. - Maggiore controllo e personalizzazione - Scalabile 17. Cosa Manca? - Auto-completamento o Rich Auto-Complete Search Box - More Like this - Indicizzare contenuti correlati ai prodotti (blog aziendale + Manuali in PDF) - Regole custom per calcolo rilevanza (pi venduti ecc.) 18. Prestazioni 19. Analisi sui dati 7.4 million Posts = 8.18 GB Like index 0 index size 0 query 49k-399k ms (%% - rexExp) Fulltext (MyISAM) index 31m18s index size 2382MiB query 16-200ms (boolean - natural) Fulltext (InnoDB) index 25m27s index size ? query 350-740ms Apache Solr index 14m28 index size 2766MiB query 79ms Full Text Search Throwdown Bill Karwin, Percona Inc. Ricerca del 2012 2 aspetti da considerare in Magento Test su strada Dataset Ricerca per keyword Navigazione catalogo 20. Ricerca per keyword Maximizing Performance and Scalability with Magento Enterprise Edition http://www.magentocommerce.com/whitepaper/ 21. Nostri test interni Ricerca Concorrenza Tempo di risposta medio Like 1 2.09 Like 5 3 Like 10 5 Like 20 13.65 sec Fullsearch 1 1.4 Fullsearch 5 1.96 Fullsearch 10 3.04 Fullsearch 20 5.14 Solr 1 1.45 Solr 5 2.20 Solr 10 3.06 Solr 20 5.4 50K prodotti Quad core 4GB di ram 22. Navigazione faccette Maximizing Performance and Scalability with Magento Enterprise Edition http://www.magentocommerce.com/whitepaper/ 23. Magento CE 24. Community ? - Compatibile con Solr 4.x - Autocompletamento - Ricerca per keyword - Indexing integrato - Configurazione Solr base 25. Istant Search 26. Istant Search (Da auto-complete a rich auto-complete) Quello che fa gi lestensione 27. - Schema.xml - Indicizzatore - QueryBuilder - Frontend Block Dove intervenire app/code/community/JeroenVermeulen/ Solarium/Model/Engine.php app/code/community/JeroenVermeulen/ Solarium/Model/Engine.php app/code/community/JeroenVermeulen/ Solarium/Block/Catalogsearch/ Autocomplete.php ${istanceDir}/conf/schema.xml ... id 28. - Schema.xml - Indicizzatore - QueryBuilder - Frontend Block Dove intervenire app/code/community/JeroenVermeulen/ Solarium/Model/Engine.php app/code/community/JeroenVermeulen/ Solarium/Model/Engine.php app/code/community/JeroenVermeulen/ Solarium/Block/Catalogsearch/ Autocomplete.php ${istanceDir}/conf/schema.xml public function rebuildIndex( $storeId = null, $productIds = null ) { ... while ( $product = $products->fetch() ) { $productModel = Mage::getModel('catalog/product') ->setStoreId($storeId) ->load($product[ 'product_id' ]); $data = array( 'id' => intval( $product[ 'fulltext_id' ] ), 'name' => $productModel->getName() ); $buffer->createDocument( $data ); } $solariumResult = $buffer->flush(); } 1231661Fulltext index | urlurl_imageNome prodotto 29. - Schema.xml - Indicizzatore - QueryBuilder - Frontend Block Dove intervenire app/code/community/JeroenVermeulen/ Solarium/Model/Engine.php app/code/community/JeroenVermeulen/ Solarium/Model/Engine.php app/code/community/JeroenVermeulen/ Solarium/Block/Catalogsearch/ Autocomplete.php ${istanceDir}/conf/schema.xml $query = $this->_client->createSelect(); $query->addParam( 'df', 'text' ); $query->setQuery( $this->_filterString( $queryString ). '*' ); $query->setRows( $this->getConf( 'results/max' ) ); $query->setFields( array( 'product_id', 'score', 'name', 'image', 'url') ); $dismax = $query->getEDisMax(); $dismax->setQueryFields('name^2 product_id^1.5 text'); $solrResultSet = $this->_client->select( $query ); { "response":{ "numFound":15, "start":0, "maxScore":1.0, "docs":[ { "product_id":"164", "name":"Gaming Computer", "score":1.0 }, { "product_id":"162", "name":"Microsoft Wireles", "score":1.0 }, ] } Result http://localhost:8983/solr/select/? spellcheck=true&sort=score+des&spellcheck.q=micr*&json. nl=flat&wt=json&rows=100&omitHeader=true&df=text&fl=product_id,score,text, name&start=0 &q=micr*&timeAllowed=5&fq=store_id:1&spellcheck.alternativeTermCount=1 Query 30. - Schema.xml - Indicizzatore - QueryBuilder - Frontend Block Dove intervenire app/code/community/JeroenVermeulen/ Solarium/Model/Engine.php app/code/community/JeroenVermeulen/ Solarium/Model/Engine.php app/code/community/JeroenVermeulen/ Solarium/Block/Catalogsearch/ Autocomplete.php ${istanceDir}/conf/schema.xml class JeroenVermeulen_Solarium_Block_Catalogsearch_Autocomplete extends Mage_CatalogSearch_Block_Autocomplete { public function getSuggestProduct() { if ( ! $this->_suggestProduct ) { $query = $this->helper('catalogsearch')->getQueryText(); $query = $query . '*'; $counter = 0; $data = array(); $storeId = Mage::app()->getStore()->getId(); $engine = Mage::getSingleton('jeroenvermeulen_solarium/engine'); $products = $engine->queryAutosuggest( $storeId, $query, 1 ); foreach ( $products as $value) { $_datap = array( 'id' => $value['product_id'], 'row_class' => ( ++$counter ) % 2 ? 'odd' : 'even', 'text' => $value['name'], ); $datap[] = $_datap; } $this->_suggestProduct = $datap; } return $this->_suggestProduct; } } 31. Risultato (Da Auto-complete a Rich auto-complete) Con Varnish la ricerca diventa istantanea 32. Modifichiamo la rilevanza ...&defType=edismax&qf=name^2.0+text 33. https://www.youtube.com/watch?v=RDb8WLzgzEg 34. Riepilogo + Rilevanza nella ricerca + 35. Riepilogo + Rilevanza nella ricerca + Adattabile al dominio + 36. Riepilogo + Rilevanza nella ricerca + Adattabile al dominio + Pronto per scalare+ 37. Riepilogo + Rilevanza nella ricerca + Adattabile al dominio + Pronto per scalare + Migliori prestazioni + 38. Riepilogo + Rilevanza nella ricerca + Adattabile al dominio + Pronto per scalare + Migliori prestazioni + = Migliore esperienza utente 39. Riepilogo + = maggiori conversioni 40. ?Domande Luca Peressini Mail: [email protected] twitter: @PeressiniLuca linkedin: http://it.linkedin.com/pub/luca-peressini/56/182/128