Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

38

Transcript of Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

Page 1: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch
Page 2: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Page 3: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Full Service Provider

Page 4: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 5: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Voglio comprare un ago in questo pagliaio

ovvero l’importanza della ricerca nell’ecommerce

Page 6: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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)

Page 7: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 8: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

rilevanza

performance

prossimità

La Ricerca in Magento CE

• Like

• Fulltext

• Combine (Like+Fulltext)

Page 9: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Product or not product?

Magento indicizza e ricerca solo i prodotti

no categorie

no pagine CMS

no altri contenuti (wordpress, typo3, …)

Page 10: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Il progetto elasticsearch

Page 11: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con 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

Page 12: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Caratteristiche strutturali

• distribuito, affidabile e scalabile

Page 13: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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"

}

}

}'

Page 14: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Caratteristiche tecniche

• (near) real time

• real time analytics

• optimistic version control

• per operation persistence

• interfaces: head, inquisitor, browser

• molto altro …..

Page 15: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 16: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Configurare elasticsearch per l’ecommerce

Page 17: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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?

Page 18: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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"

}

}

}

}

Page 19: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Integrare elasticsearch e Magento

Page 20: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Infrastruttura

• Topologia presa in esame

Page 21: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Infrastruttura ETL

• Indicizzazione bulk utilizzando ETL/ESB

Page 22: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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>

Page 23: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 24: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

}

Page 25: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 26: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Page 27: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Page 28: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Page 29: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Page 30: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 31: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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>

Page 32: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Integrazioni esistenti

• moltissimi progetti nati nell’ultimo anno

Page 33: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 34: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

develon / fullycommerce

Dubbi, domande, perplessità…

Page 35: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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/

Page 36: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 37: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

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

Page 38: Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Elasticsearch

© 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