Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch
-
Upload
meet-magento-italy -
Category
Presentations & Public Speaking
-
view
286 -
download
8
Transcript of Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch
develon / fullycommerce
develon / fullycommerce
Full Service Provider
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
develon / fullycommerce
Voglio comprare un ago in questo pagliaio
ovvero l’importanza della ricerca nell’ecommerce
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)
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
develon / fullycommerce
rilevanza
performance
prossimità
La Ricerca in Magento CE
• Like
• Fulltext
• Combine (Like+Fulltext)
develon / fullycommerce
Product or not product?
Magento indicizza e ricerca solo i prodotti
no categorie
no pagine CMS
no altri contenuti (wordpress, typo3, …)
develon / fullycommerce
Il progetto elasticsearch
develon / fullycommerce
elasticsearch • full-text search server basato su
• utilizzato in produzione nel mercato
• supportato dalla community (licenza apache 2) e dall’azienda omonima
develon / fullycommerce
Caratteristiche strutturali
• distribuito, affidabile e scalabile
develon / fullycommerce
Caratteristiche interfaccia
• restful api
• schema free
• query DSL
curl -XPUT ‘http://elastic:9200/doc_it' -d '
{
"settings": {
"number_of_shards" : 5,
"number_of_replicas" : 1,
}
}'
curl -XPUT 'http://elastic:9200/doc_it/product' -d '
{
"sku":"1775X59",
"name":"DEAN AX®",
"description":"Dean AX® è pensato per ….",
"id":"19050"
}'
curl -XGET 'http://elastic:9200/doc_it/product/_search' -d '
{
"query": {
"match" : {
"name" : "DEAN"
}
}
}'
develon / fullycommerce
Caratteristiche tecniche
• (near) real time
• real time analytics
• optimistic version control
• per operation persistence
• interfaces: head, inquisitor, browser
• molto altro …..
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
develon / fullycommerce
Configurare elasticsearch per l’ecommerce
develon / fullycommerce
Mapping
• Attributi analyzed e attributi stored
• Attributi base: sku, name, description, short_description
• Attributi numerici: prezzo
• Attributi gerarchici / ordinati: categorie
• Attributi di view: lingua / store view
• Altri contenuti
• Immagini?
develon / fullycommerce
• standard token filter
• ascii folding token filter
• length token filter
• lowercase token filter
• uppercase token filter
• ngram token filter
• edge ngram token filter
• porter stem token filter
• shingle token filter
• stop token filter
• word delimiter token filter
• stemmer token filter
• stemmer override token filter
• keyword marker token filter
• keyword repeat token filter
• kstem token filter
• snowball token filter
• phonetic token filter
• synonym token filter
• compound word token filter
• reverse token filter
• elision token filter
• truncate token filter
• unique token filter
• pattern capture token filter
• pattern replace token filter
• trim token filter
• limit token count token filter
• hunspell token filter
• common grams token filter
• normalization token filter
• cjk width token filter
• cjk bigram token filter
• delimited payload token filter
• keep words token filter
• keep types token filter
• classic token filter
• apostrophe token filter
Mapping
• quale analyzer scelgo per i vari attributi?
• analysis = charFilter + tokenizer + tokenFilter
{
"analysis": {
"analyzer": {
"std_stemmed_it": {
"char_filter": "html_strip",
"filter": [
"it_stop",
"lowercase",
"it_stemmer"
],
"tokenizer": "standard",
"type": "custom"
}
},
"filter": {
"it_stemmer": {
"name": "light_italian",
"type": "stemmer"
},
"it_stop": {
"name": "it_stop",
"stopwords": "_italian_",
"type": "stop"
}
}
}
}
develon / fullycommerce
Integrare elasticsearch e Magento
develon / fullycommerce
Infrastruttura
• Topologia presa in esame
develon / fullycommerce
Infrastruttura ETL
• Indicizzazione bulk utilizzando ETL/ESB
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>
develon / fullycommerce
Librerie PHP di connessione
$qb = new \Elastica\QueryBuilder();
$query=$qb->query()
->multi_match()
->setFields(array('name^2', 'description', 'sku^3'))
->setQuery($q);
• Rest client + JSON handling
• Elastica: approccio Object Oriented con query builder
develon / fullycommerce
“Hello world”: una semplice query di ricerca $this->_elasticaclient = new \Elastica\Client(array(
'host' => 'localhost',
'port' => '9200'
));
$search = new \Elastica\Search($this->_elasticaclient);
$search->addIndex($this->_index)->addType($this->_type);
$qb = new \Elastica\QueryBuilder();
$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 \Elastica\Query();
$elastic_query->setQuery($query)
->setSuggest(new \Elastica\Suggest($suggest));
$search->setQuery($elastic_query);
$resultset=$search->search();
print_r($resultset->getResults());
if($resultset->hasSuggests()){
print_r($resultset->getSuggests());
}
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
}
},
{
"query_string": {
"query": "(scrpe puma)",
"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"
],
"default_operator": "AND",
"boost": 2
}
}
]
}
},
"filter": {
"query": {
"query_string": {
"query": "(store_id:1)"
}
}
}
}
},
"from": 0,
"size": 1000,
"sort": [
{
"demote_category_terms": "asc"
},
{
"_score": "desc"
}
]
}
• match query
• multi match query
• bool query
• boosting query
• common terms query
• constant score query
• dis max query
• filtered query
• fuzzy like this query
• fuzzy like this field query
• function score query
• fuzzy query
• geoshape query
• has child query
• has parent query
• ids query
• indices query
• match all query
• more like this query
• more like this field query
• nested query
• prefix query
• query string query
• simple query string query
• range query
• regexp query
• span first query
• span multi term query
• span near query
• span not query
• span or query
• span term query
• term query
• terms query
• top children query
• wildcard query
• minimum should match
• 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
develon / fullycommerce
develon / fullycommerce
develon / fullycommerce
develon / fullycommerce
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
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>
develon / fullycommerce
Integrazioni esistenti
• moltissimi progetti nati nell’ultimo anno
develon / fullycommerce
L’ecosistema elasticsearch
Oltre la ricerca: ELK-stack
• logstash: per centralizzare, elaborare e instradare i log
• kibana: sistema di visualizzazione dati in real-time
develon / fullycommerce
Dubbi, domande, perplessità…
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/
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
develon / fullycommerce
Manuel Toniato [email protected] https://www.linkedin.com/pub/manuel-toniato/45/7a/61b https://twitter.com/manuel_toniato
Simone Caretta [email protected] https://www.linkedin.com/pub/simone-caretta/4/90b/383 https://plus.google.com/+SimoneCaretta/posts
© 2013, Develon srl - Tutti i diritti riservati. Questo documento è protetto da copyright. Nessuna parte di esso può essere modificato, riprodotto o distribuito in qualunque forma o con qualunque mezzo, senza previa autorizzazione scritta di Develon srl.
develon / fullycommerce
www.develon.com - www.fullycommerce.com