Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Elasticsearch - Turbinando sua aplicação PHP
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Breno Oliveira
March 21, 2016
Programming
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Elasticsearch - Turbinando sua aplicação PHP
Utilizando Elasticsearch em suas aplicações PHP
Breno Oliveira
March 21, 2016
More Decks by Breno Oliveira
See All by Breno Oliveira
Spring e Eureka Service Discovery
brenooliveira
0
69
Como Fazer Minha Gem e o Rails Conversarem Bem
brenooliveira
0
59
Javascript Pitfalls
brenooliveira
0
100
Elasticsearch
brenooliveira
1
130
Falando sobre testes automatizados
brenooliveira
0
100
Other Decks in Programming
See All in Programming
ActionController meets Protocol Buffers
sorah
1
780
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
560
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
190
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
130
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.6k
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
160
Railsバージョンを4倍にした話
optim
0
920
AI時代のIaC入門 〜なぜインフラをコードで管理したいのか?〜 / Introduction to IaC in the AI Era
akihisaikeda
6
1.4k
Performance Optimization With LLMs
xleitix
0
240
Crash Auto Pipelines
veronikapj
1
340
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.4k
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
260
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How to train your dragon (web standard)
notwaldorf
96
6.9k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
47k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
520
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Claude Code のすすめ
schroneko
67
230k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Evolving SEO for Evolving Search Engines
ryanjones
0
350
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Transcript
Breno Oliveira @brenoholiveira
[email protected]
B R E N O O
L I V E I R A Tech Leader at Moip ElasticSearch Turbinando sua aplicação PHP
None
+ 86k de contas vendendo
+ 100K de pedidos por dia
None
None
VENDAS AUMENTAM VENDEDOR QUER SABER
None
Ordenação FullText Search Paginação Agregação Filtros
REALTIME
E O SEU SERVER DEPOIS DE VÁRIOS F5 …
None
None
NOSSA VONTADE É DE …
SEU CLIENTA VAI…
PHP + MySQL PHP + postgresql PHP + nosql PHP
+ ????
CASO DE USO
+
502 200 304
+
Aplicação MOIP Base de Dados Master
Single Term SELECT * FROM pedidos p INNER JOIN cliente
ON p.cliente_id = c.id WHERE p.descricao LIKE "%superman%"
multi Term SELECT * FROM pedidos p INNER JOIN cliente
ON p.cliente_id = c.id WHERE p.descricao LIKE "%superman%" OR p.descricao LIKE "%batman%"
ORDER ARRGH!!!! SELECT * FROM pedidos p INNER JOIN cliente
ON p.cliente_id = c.id WHERE p.descricao LIKE "%superman%" OR p.descricao LIKE "%batman%" ORDER BY ??
PROBLEMAS • Difícil manter • Muitos JOINS • Lento
.Primeiro REFACTOR
MICRO SERVIÇO + BANCO denormalizado
APLICAÇÃO MOIP Base de Dados Master REPORTS API Base de
Dados denormalizada
MELHORIAS • Micro serviço • Concorrência no banco de dados
• No more JOINS • Full-Text Search • Melhorias de desempenho
PROBLEMAS • Periodos longos • Filtros • Lentidão
.SEgundo REFACTOR
MICRO SERVIÇO + Banco colunar
APLICAÇÃO MOIP Base de Dados Master REPORTS API
MELHORIAS • Consultas significantemente mais rápidas
PROBLEMAS • BULK INSERTs Too Slow
.terceiro REFACTOR
MICRO SERVIÇO + Elasticseach
APLICAÇÃO MOIP Base de Dados Master REPORTS API Elasticsearch
MELHORIAS • Bulk INSERT • Desempenho • Aggregations • Scalable
• Redundancy
.Atualmente
None
Last Black Friday
None
None
None
.não é banco da dados
.nem nosql I T ' ’ N O T K
E Y- VA L U E S T O R A G E
.Escalável
.Alta resiliencia
.restful api
.orientado a documentos
.full-text search
.free schema
.Eventualmente consistente
.apache lucene
None
.Conceitos básicos Elasticsearch
MySQL Elasticsearch Database Index Table Type Column Field Schema Mapping
Partition Shard
curl -XPUT http://localhost:9200/tips/tip/1 -d '{"tip": "Using Elasticsearch in Production", "tags":
["protip","success"]} ' Endpoint Index Type Document ID Document { "_index": "tips", "_type": "tip", "_id": "1", "_version": 1, "created": true } Response
$ curl http://localhost:9200/tips/tip/1?pretty { "_index": "tips", "_type": "tip", "_id": "1",
"_version": 1, "found": true, "_source": { "tip": "Using Elasticsearch in Production", "tags": [ "protip", "success" ] } }
None
VAGRANT
$ git clone
[email protected]
:brenooliveira/elastic-php-demo.git $ cd elastic-php-demo $ vagrant up
—provision $ vagrant ssh vagrant@default:~/$
vagrant@default:$ curl http://localhost:9200 { "status" : 200, "name" : "Corruptor",
"cluster_name" : "elasticsearch", "version" : { "number" : "1.5.2", "build_hash" : "62ff9868b4c8a0c45860bebb259e21980778ab1c", "build_timestamp" : "2015-04-27T09:21:06Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" }
{ "require": { "elasticsearch/elasticsearch": "~2.0@beta" } } composer.json $ curl
-s http://getcomposer.org/installer | php $ php composer.phar install --no-dev
<?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create() ->build(); $params = array();
$params['index'] = 'tips'; $params['type'] = 'tip'; $params['id'] = '1'; $result = $client->get($params) ?> <pre> <?= print_r($result); ?> </pre> exemplo1.php
Array ( [_index] => tips [_type] => tip [_id] =>
1 [_version] => 1 [found] => 1 [_source] => Array ( [tip] => Using Elasticsearch in Production [tags] => Array ( [0] => protip [1] => success ) ) )
exemplo2.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create() ->build(); $params =
[ 'index' => 'tips', 'type' => 'tip', 'id' => '2', 'body' => [ 'tip' => 'Using Marvel to get metrics from Elasticsearch', 'tags' => ['protip', 'metrics'] ] ]; // Documento indexado em tips/tip/2 $response = $client->index($params); ?> <pre> <?= print_r($response) ?> </pre>
exemplo3.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create() ->build(); for($i =
0; $i < 100; $i++) { $params['body'][] = [ 'index' => [ '_index' => 'jobs', '_type' => 'job', ] ]; $params['body'][] = [ 'title' => 'Job position '. $i, 'email' => 'email-'. $i . '@gmail.com' ]; } $responses = $client->bulk($params); ?>
exemplo4.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create()->build(); $json = '{
"query" : { "match" : { "tags" : "protip" } } }'; $params = [ 'index'=> 'tips', 'type' => 'tip', 'body' => $json ]; $responses = $client->search($params); ?> <pre> <?= print_r($responses) ?> </pre>
exemplo5.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create()->build(); $params = [
'index' => 'tips', 'type' => 'tip', 'id' => '3', 'body' => [ 'tip' => 'Wrong insert', 'tags' => ['missing', 'error', 'no_logs'] ] ]; $response_insert = $client->index($params); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '3' ]; $responde_delete = $client->delete($params); ?>
exemplo6.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create()->build(); $params = [
'index' => 'tips', 'type' => 'tip', 'id' => '4', 'body' => [ 'tip' => 'Loren Ipsum', 'tags' => ['lorem'] ] ]; $response_insert = $client->index($params); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '4', 'body' => [ 'doc' => [ 'text' => 'lipsum generator' ] ] ]; $response_update = $client->update($params); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '4' ]; $response_search = $client->get($params); ?>
exemplo7.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create()->build(); $json = '{
"my-suggestion" : { "text" : "Elastiscearch", "term" : { "field" : "tip" } } }'; $params = [ 'index' => 'tips', 'body' => $json ]; $response = $client->suggest($params); ?>
exemplo8.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create()->build(); $json = '{
"query" : { "more_like_this" : { "like_text" : "In production", "min_term_freq" : 1, "min_doc_freq" : 1 } } }'; $params = [ 'index' => 'tips', 'type' => 'tip', 'body' => $json ]; $response = $client->search($params); ?>
.Vamos falar de arquitetura
.Como devo sincronizar mysql & Elasticsearch
E-commerce app Base de Dados Elasticsearch Cadastrar novo produto
E-commerce app Base de Dados Elasticsearch rabbitmq Publish Message php
worker Consume Message & Sync Cadastrar novo produto
.Lessons learned
Utilize mais mappings
Em produção use alias
None