Quando uma aplicação começa a ficar grande e complexa, fazer buscas nos seus models torna-se uma tarefa complicada. Efetuar as buscas diretamente no banco de dados é um processo lento, ineficiente e que permite pouca ou nenhuma maleabilidade sobre a forma com que a busca é feita. Surge então o ElasticSearch, uma engine de busca utilizada por empresas como Github, Twitter e 4square para indexar e buscar literalmente milhões de documentos em tempo real. Nessa palestra, explicarei quando, como e porque utilizar o ElasticSearch para facilmente indexar e efetuar buscas complexas nos seus models.
8. ElasticSearch
• “Open Source Distributed Real Time Search & Analytics”
• API RESTful para indexar/buscar JSONs (“NoSQL”)
• NÃO é um banco de dados
• Apache Lucene
• Just works (and scales)
• Full text search, aggregations, scripting, etc, etc, etc.
9. Nomes?
MySQL ElasticSearch
Database Index
Table Type
Row Document
Column Field
Schema Mapping
Partition Shard
24. ActiveRecords
“Amazon to Buy Video Site Twitch for More Than $1B”
Post.where(:all, :title => "Amazon to Buy
Video Site Twitch for More Than $1B")
:-)
44. ElasticSearch
query = {!
aggregations: {!
Nome da aggregation
grades_stats: {!
Tipo da aggregation
extended_stats: {!
field: "grade",!
}!
}!
}!
}!
!
search = Grade.search(query)
Nome do field
51. ElasticSearch
query = {!
aggregations: {!
subjects: {!
terms: {!
Nome da aggregation
field: "subject"!
}!
}!
}!
}!
!
search = Grade.search(query)
Nome do field
Tipo da aggregation
71. Infraestrutura do Pagar.me
ElasticSearch ElasticSearch
Router
api.pagar.me
Servidor da API
(Node.js)
MySQL
(transações e dados relacionais)
MySQL
(transações e dados relacionais)
MongoDB
(dados de clientes e não relacionais)
Ambiente de testes
(sandbox dos clientes)
Servidor da API
(Node.js)
Ambiente de produção
72. Expondo o ElasticSearch
• Endpoint do ElasticSearch -> Endpoint acessado pelo
cliente…
• … mas cuidado: dados precisam ser delimitados a
conta do cliente (claro)
• Vantagem: acesso às mesmas features do
ElasticSearch (aggregations, statistics, scores, etc)
• Segurança: desabilitar scripts do ElasticSearch
73. GET /search
• Um único endpoint para todos os GETs
• Todos os dados indexados e prontos para serem
usados (no joins)
• Queries complexas construídas no front-side
(Angular.js)
• Desenvolvimento front-end não dependente do
back-end