Per un utente di un sito eCommerce la “buca” di ricerca è lo strumento preferenziale per l’inizio dell’esperienza di acquisto. Allo stesso tempo per il venditore può diventare un canale privilegiato per veicolare messaggi mirati. In questo talk Manuel e Simone analizzeranno la possibilità di integrare Magento con il motore di ricerca open source Elasticsearch (utilizzato fra gli altri da github, stackoverflow e mozilla). Ci mostreranno quali sono le peculiarità della soluzione rispetto a quelle offerte “out of the box” da Magento CE, parleranno brevemente dell’ecosistema di Elasticsearch, delle integrazioni disponibili e delle peculiarità rispetto ad altri full text search engine come Solr. Esamineranno, in particolare, una soluzione che utilizza Elasticsearch come engine per le collection Magento evidenziandone vantaggi e criticità.
4. develon /
fullycommerce
• Criticità della ricerca su Magento CE
• Il progetto elasticsearch
• Integrazione tra elasticsearch e Magento CE
• mapping (fields, analyzers, boost)
• infrastruttura
• query
• Renderizzazione dei risultati
• E se usassimo elasticsearch per tutti i casi di
navigazione layered?
Outline
6. develon /
fullycommerce
Perché investire sull’internal search?
• il 30% dei visitatori usa la ricerca interna
(eConsultancy, 2012)
• chi usa la ricerca è un visitatore di valore
(conversion rate più alto del 70%-80%)
• gli utenti si aspettano
strumenti avanzati di
ricerca (pertinenza, do you
mean, autocomplete,
instant search)
7. develon /
fullycommerce
Perché investire sull’internal search?
• grande vantaggio
competitivo
(Baymard Institute,
2014)
• i dati raccolti con la
ricerca interna
sono fondamentali
per il marketing
9. develon /
fullycommerce
Product or not product?
Magento indicizza e
ricerca solo i prodotti
no categorie
no pagine CMS
no altri contenuti
(wordpress, typo3, …)
14. develon /
fullycommerce
Caratteristiche tecniche
• (near) real time
• real time analytics
• optimistic version control
• per operation persistence
• interfaces: head, inquisitor,
browser
• molto altro …..
15. develon /
fullycommerce
elasticsearch vs Solr
• multitenancy as default
• nativamente cloud oriented
• supporto per documenti “strutturati”
• possibilità di piani di supporto business
• caratteristiche tecniche in continua evoluzione
• interesse in crescita, community in crescita
22. develon /
fullycommerce
Infrastruttura river
• I data-pump di elasticsearch: i River
• Indicizzazione in real-time usando
RabbitMQ river
<events>
<catalog_product_save_after>
<observers>
<fullycommerce_reindex_product>
<class>elasticsearch/observer</class>
<method>productReindex</method>
</fullycommerce_reindex_product>
</observers>
</catalog_product_save_after>
</events>
24. develon /
fullycommerce
“Hello world”: una semplice query di ricerca
$this->_elasticaclient = new ElasticaClient(array(
'host' => 'localhost',
'port' => '9200'
));
$search = new ElasticaSearch($this->_elasticaclient);
$search->addIndex($this->_index)->addType($this->_type);
$qb = new ElasticaQueryBuilder();
$query=$qb->query()
->multi_match()
->setFields(array('name^2', 'description', 'sku^3'))
->setQuery($q);
$suggest = $qb->suggest()
->term('suggest_description', 'description')
->setText($q);
$elastic_query=new ElasticaQuery();
$elastic_query->setQuery($query)
->setSuggest(new ElasticaSuggest($suggest));
$search->setQuery($elastic_query);
$resultset=$search->search();
print_r($resultset->getResults());
if($resultset->hasSuggests()){
print_r($resultset->getSuggests());
}
25. develon /
fullycommerce
{
"query": {
"filtered": {
"query": {
"bool": {
"should": [
{
"fuzzy_like_this": {
"fields": [
"color_en",
"color_it",
"manufacturer_en",
"manufacturer_it",
"name_en",
"name_it",
"description_en",
"description_it",
"short_description_en",
"short_description_it",
"sku",
"category_terms_en",
"category_terms_it"
],
"boost": 1,
"like_text": "(scrpe puma)",
"min_similarity": 0.7,
"prefix_length": 0,
"ignore_tf": false,
"max_query_terms": 10
}
• multi term query rewrite
• template query
• elasticsearch prevede
39 tipi di query a
fronte dei 13 tipi
previsti da Lucene.
• La nostra scelta è stata
di combinare una
ricerca esatta
(query_string)
con una ricerca fuzzy
(fuzzy_like_this),
e poi filtrare per store
Le query di elasticsearch
30. develon /
fullycommerce
Come mostrare i risultati
• Utilizzando le collection di Magento (filtro per
product_id)
$ids = $this->getSearchResultIds();
$this->addIdFilter($ids);
• Renderizzando direttamente gli oggetti JSON restituiti
da elasticsearch
Vantaggi: non serve arricchimento,
in automatico paginazione, ordinamento, ecc.
Svantaggi: seconda query su DB (lentezza)
Vantaggi: molto veloce
Svantaggi: necessità di indicizzare i dati necessari per il
template
paginazione e ordinamento molto complicati
Soluzione preferibile per l’autocomplete
31. develon /
fullycommerce
E se usassimo elasticsearch per tutti i
casi di layered navigation?
• È la soluzione
adottata dalla
maggior parte
dei moduli
• Performance
migliori?
• Fragilità della
soluzione!!!
<config>
<global>
<blocks>
<nanowebg_elasticsearch>
<class>NanoWebG_ElasticSearch_Block</class>
</nanowebg_elasticsearch>
<catalog>
<rewrite>
<layer_view>
NanoWebG_ElasticSearch_Block_Catalog_Layer_View
</layer_view>
</rewrite>
</catalog>
<catalogsearch>
<rewrite>
<layer>
NanoWebG_ElasticSearch_Block_Catalogsearch_Layer
</layer>
</rewrite>
</catalogsearch>
</blocks>
</global>
</config>
35. develon /
fullycommerce
References (1)
Sulla ricerca interna nell’ecommerce
• Why Ecommerce Stores Can't Afford to Ignore Site Search,
di Barett Johnson, 4/11/2014, visitato il 27/2/2014
http://blog.swiftype.com/why-ecommerce-stores-cant-afford-to-ignore-site-
search
• The Current State Of E-Commerce Search,
di Christian Holst, 18/08/2014, visitato il 27/2/2014
http://www.smashingmagazine.com/2014/08/18/the-current-state-of-e-
commerce-search/
Elasticsearch
• Il nuovo sito (lanciato il 10/3/2015) :
https://www.elastic.co/
• Elastica:
http://elastica.io/
36. develon /
fullycommerce
References (2)
Elasticsearch e Magento
• BubbleShop Extension for Elasticsearch,
https://www.bubbleshop.net/magento-elasticsearch.html
• Qbox Elasticsearch Extension,
http://www.magentocommerce.com/magento-connect/qbox-
elasticsearch-extension.html
• Johann Reinke Extension (versione preliminare di BubbleShop)
https://github.com/jreinke/magento-elasticsearch
• Carlo Tasca Extension (non utilizza Elastica)
https://github.com/ctasca/magento-elasticsearch-module