Design & UX

17 jun, 2015

Seu site tão rápido quanto o Google usando ElasticSearch

Publicidade

Muitos sites são referências na área em que atuam devido à relevância do conteúdo. Mas não basta oferecer informação/produto/serviço de qualidade, é preciso fazer com que o usuário encontre o que ele tanto procura. Sabe por quê? Porque quando ele não acha o que precisa, desiste e abandona o site.

E agora, o que devemos fazer? Uma solução é utilizar um mecanismo de FullTextSearch do MySQL que, aparentemente, irá resolver o problema por um tempo. Mas digamos que o CEO de sua loja virtual resolva fazer uma megaliquidação, no Black Friday (por exemplo) e, para turbinar os acessos e vender ainda mais, promove uma megacampanha no Google e no Facebook. De repente, o fluxo de pessoas procurando desesperadamente por promoções no site aumenta 10 vezes. É aí que começa a complicar para você que resolveu utilizar o FullTextSearch.

Será que você estava de fato preparado para enfrentar essa situação? Acho que você não vai querer surpresas e descobrir da pior maneira que não estava pronto para todo esse fluxo. É justamente nesse ponto que o ElasticSearch irá te ajudar.

O ElasticSearch

O ElasticSearch é um mecanismo de busca open source construído em cima do Apache Lucene, poderoso motor de busca full-text. Esse recurso conta com uma amigável RESTFul API, dados em tempo real, alta disponibilidade, documentos de orientação, entre outras características.

Empresas como GitHub, Twitter, Google, Ebay, FourSquare, Bloomberg, The Guardian, Globo.com, Yelp e Moip já usam o ElasticSearch em produção para buscar e agregar em tempo real.

Colocando o ElasticSearch para funcionar

A instalação do mecanismo é bem simples. Basta fazer download da última versão, descompactar e rodar bin/elasticsearch. Ou acessar bin/elasticsearch.bat e em fazer uma requisição $ curl -XGET http://localhost:9200/.

Alguns conceitos antes de começar

Para facilitar a compreensão de alguns conceitos e termos, elaboramos uma tabela comparativa do ElasticSerarch com um banco de relacional (MySQL):

MySQL ElasticSearch
Database Index
Table Type
Row Document
Column Field
Schema Mapping
Partition Shard

Outro conceito muito importante é entender como ele armazena os seus documentos. Quem já utilizou um banco de dados NoSQL, como MongoDB, não terá problema em compreender. Esse mecanismo utiliza a estrutura de JSON, suportada pela a maioria das linguagens de programação.

Criando os primeiros registros

Para melhor acompanhamento dos passos seguintes, você pode utilizar um cliente REST de sua preferência. Neste exemplo, vamos utilizar um curl para simplicidade.

Modelo para inserir dados no ElasticSearch:

$ curl -X PUT http://localhost:9200/produtos/biclicletas/1 -d '{
   "modelo": "speed",
   "nome": "Specialized Tarmac",
   "marchas": 14,
   "cor": "azul",
   "tags": [
       "bike",
       "speed",
       "specialized",
       "tarmac",
       "14 marchas"
   ],
   "valor": 1500000
}'

O que fizemos foi o seguinte: no Index produtos no Type bicicletas, adicionamos uma bicicleta, e o id dela é 1. Caso você não forneça um Id para o documento do ElasticSearch, ele irá gerar um id para você.

Você terá a seguinte resposta do ElasticSearch:

{
   "_index": "produtos",
   "_type": "bicicletas",
   "_id": "1",
   "_version": 1,
   "created": true,
   "_source": {
       "modelo": "speed",
       "nome": "Specialized Tarmac",
       "marchas": 14,
       "cor": "azul",
       "tags": [
           "bike",
           "speed",
           "specialized",
           "tarmac",
           "14 marchas"
       ],
       "valor": 1500000
   }
}

Se você desejar buscar o registro acima, basta executar a seguinte requisição:

$ curl -XGET http://localhost:9200/produtos/biclicletas/1

Existem duas maneiras de realizar buscas no ElasticSearch. A mais simples é apenas utilizando query strings na URL da requisição. Utilizamos essa forma geralmente para pesquisas mais simples e rápidas.

A outra maneira, para queries mais complexas, é enviando um JSON com a Query DSL. Em geral, utilizamos essa opção quando queremos resultados mais refinados ou fazer agregações entre outras features do Elasticsearch.

Agora, vamos supor que você queira buscar por bicicletas azuis, utilizando Query String:

$ curl -XGET http://localhost:9200/produtos/biclicletas/_search/?q=cor:azul

Na query acima, enviamos o Field cor com a cor desejada – no caso, azul. Assim, a query seguinte irá procurar por todas as bicicletas que tenham a cor azul. O ElasticSearch irá retorna o seguinte resultado:

{
   "took": 3,
   "timed_out": false,
   "_shards": {
       "total": 5,
       "successful": 5,
       "failed": 0
   },
   "hits": {
       "total": 1,
       "max_score": 0.30685282,
       "hits": [
           {
               "_index": "produtos",
               "_type": "bicicletas",
               "_id": "1",
               "_score": 0.30685282,
               "_source": {
                   "modelo": "speed",
                   "nome": "Specialized Tarmac",
                   "marchas": 14,
                   "cor": "azul",
                   "tags": [
                       "bike",
                       "speed",
                       "specialized",
                       "tarmac",
                       "14 marchas"
                   ],
                   "valor": 1500000
               }
           }
       ]
   }
}

Para realizar a mesma busca utilizando Query DSL:

$ curl -X GET http://localhost:9200/produtos/bicicletas/ -d '{
   "query": {
       "match": {
           "cor": "azul"
       }
   }
}'

Conclusão

Esta foi apenas uma introdução ao ElasticSearch, que ainda inclui features como geolocation, sugestão e analytics. Outro ponto interessante é que o ElasticSearch possui diversas libs para facilitar sua utilização em sua linguagem de programação favorita. Vale a pena visitar o site deles e conferir!

***

Texto publicado originalmente na Revista iMasters.