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

41

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

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

Chi sono?Magento e TYPO3 developer in

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

Di cosa vi parlerò

- L’importanza della ricerca nell’e-commerce

- Cosa offre Magento

- Apache Solr

- Prestazioni

- Qualcosa in più

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

Ricerca

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

Perchè è importante

“L’80% di chi acquista usa la ricerca per trovare quello che vuole”

“Chi trova un prodotto attraverso la ricerca interna compra il doppio delle volte”

“L’utente 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

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

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

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

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

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

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

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

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”

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

Query: “school”

Calcolo della rilevanza disatteso, vorrei che il primo risultato fosse l’oggetto che ha la Keyword nel nome.

Problemi Fulltext (2/3)

Rilevanza risultati

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

Problemi Fulltext (3/3)

Query: “jeens”

Se l’utente sbaglia non ottiene nessun risultato

L’importanza del Did you mean...

Spellcheck

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

Apache Solr

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

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

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

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

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

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)

<fieldType name="text_en"

class="solr.TextField" ..>

<analyzer type="index">

<tokenizer />

<charFilter />

<filter />

</analyzer>

<analyzer ..

</fieldType>

<!-- System required fields. -->

<field name="id" type="string" indexed="true" required="true" stored="true"/>

<field name="in_stock" type="boolean" indexed="true" required="true"/>

<dynamicField name="*_def" type="textgen" indexed="true"/>

<dynamicField name="*_en" type="text_en" indexed="true"/>

<dynamicField name="*_fr" type="text_fr" indexed="true"/>

<dynamicField name="*_de" type="text_de" indexed="true"/>

Esempio di Schema

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

Solr + Magento EE- Codice EE per l’integrazione + 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 l’elenco degli ID

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

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

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

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.)

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

Prestazioni

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

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 MagentoTest su strada

Dataset

Ricerca per keyword Navigazione catalogo

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

Ricerca per keyword

Maximizing Performance and Scalability with Magento Enterprise Editionhttp://www.magentocommerce.com/whitepaper/

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

Nostri test interniRicerca 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 core4GB di ram

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

Navigazione faccette

Maximizing Performance and Scalability with Magento Enterprise Editionhttp://www.magentocommerce.com/whitepaper/

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

Magento CE

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

Community ?

- Compatibile con Solr 4.x- Autocompletamento- Ricerca per keyword- Indexing integrato

- Configurazione Solr base

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

Istant Search

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

Istant Search (Da auto-complete a rich auto-complete)

Quello che fa giàl’estensione

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

- 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

<schema name="magento_fulltext" version="100">

<types>

...

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">

<analyzer type="index">

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

</types>

<fields>

<field name="id" type="int" indexed="true" stored="true" required="true"/>

<field name="product_id" type="string" indexed="true" stored="true" required="true"

/>

<field name="store_id" type="int" indexed="true" stored="true" required="true"/>

<!-- Magento Product Fulltext -->

<field name="text" type="text_general" indexed="true" stored="true"/>

<field name="url" type="string" indexed="false" stored="true"/>

<field name="image" type="string" indexed="false" stored="true"/>

<field name="name" type="text_general" indexed="true" stored="true"/>

<field name="_version_" type="long" indexed="true" stored="true"/>

</fields>

<uniqueKey>id</uniqueKey>

<solrQueryParser defaultOperator="AND"/>

</schema>

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

- 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();

}

<doc>

<field name="id">123</field>

<field name="product_id">166</field>

<field name="store_id">1</field>

<field name="text">Fulltext index | </field>

<field name="url">url</field>

<field name="image">url_image</field>

<field name="name">Nome prodotto</field>

</doc>

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

- 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

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

- 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;

}

}

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

Risultato(Da Auto-complete a Rich auto-complete)

Con Varnish la ricerca diventa istantanea

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

Modifichiamo la rilevanza...&defType=edismax&qf=name^2.0+text

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

https://www.youtube.com/watch?v=RDb8WLzgzEg

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

Riepilogo

+ Rilevanza nella ricerca

+

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

Riepilogo

+ Rilevanza nella ricerca+ Adattabile al dominio+

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

Riepilogo

+ Rilevanza nella ricerca+ Adattabile al dominio+ Pronto per scalare+

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

Riepilogo

+ Rilevanza nella ricerca+ Adattabile al dominio+ Pronto per scalare+ Migliori prestazioni

+

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

Riepilogo

+ Rilevanza nella ricerca+ Adattabile al dominio+ Pronto per scalare+ Migliori prestazioni

+

= Migliore esperienza utente

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

Riepilogo

+= maggiori conversioni

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

?Domande

Luca PeressiniMail: [email protected]: @PeressiniLucalinkedin: http://it.linkedin.com/pub/luca-peressini/56/182/128