Como fazer pesquisas (inteligentes) usando Ruby On Rails + ElasticSearch

Para que Serve? Atende a sua necessidade? ūüôā

Muitos tipos de aplicativos precisam de um sistema de busca de resultados como por exemplo o Airbnb para encontrar casas, o Tinder para encontrar um pretendente, o Google para encontrar a página que você busca e etc.

Existem muitas maneiras de fazer esse tipo de busca dentro do Rails e o mais comum de se ver em Apps pequenos s√£o pesquisas direto no banco de dados usando “where” (ou “query sql”). Esse m√©todo funciona, mas tem um baixo desempenho quando voc√™ precisa fazer dezenas (centenas ou milhares) de pesquisas por minuto e ele tamb√©m precisa de muitas adapta√ß√Ķes para remover acentos, aceitar palavras parecidas, etc.

Uma op√ß√£o muito boa para evitar fazer na “m√£o” todo esse tratamento e ainda ter uma performance excelente √© usar o ElasticSearch que √© um servidor de buscas baseado no Apache Lucene. Ele consegue fazer buscas inteligentes encontrando os resultados mesmo que o usu√°rio erre a acentua√ß√£o, escreva palavras separas juntas (como por exemplo “the beatles” sendo escrito “TheBeatles”) e etc.

Ent√£o vamos l√°, vamos ver como integrar ele com o Rails e criar sua busca inteligente.

O que vamos aprender?

Como criar um App usando Ruby On Rails que pode se comunicar com o ElasticSearch e fazer buscas inteligentes para encontrar resultados baseados em keywords digitadas pelo usu√°rio. Mais especificamente, n√≥s vamos criar um App para o usu√°rio digitar palavras chaves e encontrar alguns Seriados que possuam essas palavras digitadas, como por exemplo “Marvel”, “Suspense” e etc.

INGREDIENTES
Objetivos (Passo a Passo)
  1. Criar o projeto e configurar a base para a pesquisa
  2. Criar uma interface gr√°fica para o usu√°rio poder realizar a pesquisa
  3. Incluir a busca no App
Mãos à Obra \o/
Criar o projeto e configurar a base para a pesquisa

Nessa etapa nós vamos criar o projeto, instalar as Gems, criar nosso Model e Controller Series e instalar o ElasticSearch, vamos lá:

  1. Vamos criar o nosso projeto usando a ajuda do Rails Composer que é uma ferramenta que te ajuda a criar o projeto com as principais bibliotecas já instaladas (te permitindo escolher direto no shell quais Gems você deseja), rode:

    *No shell ele vai te questionar sobre quais Gems ou servi√ßos voc√™ quer que venham pr√© instaladas, na primeira op√ß√£o escolha o numero 3 (Custom application (experimental)), nas pr√≥ximas perguntas escolha sempre a op√ß√£o numero 1 at√© que ele te pergunte sobre o¬†Front-end framework, nessa pergunta voc√™ deve escolher a op√ß√£o numero 3 (Bootstrap 3.3) e novamente em todas as outras op√ß√Ķes escolha a op√ß√£o numero 1 ou N.
    (Foi um sufoco tantas op√ß√Ķes, mas pelo menos agora voc√™ conhece o Rails Composer \o/ )
  2. Coloque o elastickick no seu Gemfile:
  3. Vamos rodar o bundle para instalar a gem:
  4. Crie o Model Series com os campos name, description e link (para armazenarmos as series que vamos pesquisar):
  5. Crie agora o Controller Series para podermos fazer a pesquisa
  6. Agora vamos configurar nossas rotas para o Series Index estar no root, no seu routes.rb coloque:
  7. Rode no seu console o comando para criar o banco de dados e rodar as migrations que criamos junto com o Model Series:
  8. Rode o servidor
  9. Veja seu projeto no browser acessando http://localhost:3000/
  10. Agora para finalizar essa etapa, vamos instalar o ElastichSearch no linux (caso você esteja no mac ou windows acesse:  https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html)
    1. Primeiro instale o Java (√Č uma depend√™ncia do ElasticSearch):
    2. Agora baixe o elasticsearch:
    3. Instale o pacote:
    4. Vamos dar o start no ElasticSearch, primeiro rode:

      Caso o resultado seja como a baixo “systemd”:
      captura-de-tela-de-2016-11-05-00-16-01Ent√£o rode:

      Caso o resultado seja “init”, rode

    5. Vamos testar para ver se o Elasticsearch est√° funcionando corretamente:

      captura-de-tela-de-2016-11-04-23-07-39
      *O ElasticSearch pode ser um pouco ‘chato’ de instalar, caso voc√™ n√£o receba um json como resultado, d√™ uma olhada nesse link da documenta√ß√£o oficial de instala√ß√£o:¬†https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html
      Outras configura√ß√Ķes para deixar o ElasticSearch mais seguro e aumentar a performance podem ser encontrados em:¬†https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-16-04

  11. Pronto \o/ vencemos a primeira etapa, agora √© s√≥ alegria ūüôā
Criar uma interface gr√°fica para o usu√°rio poder realizar a pesquisa

Agora nós vamos criar a View para que o nosso usuário posso realizar as pesquisas e também vamos entrar com alguns dados de teste no banco de dados para que nós possamos mostrar nossos resultados iniciais.

  1. Eu criei previamente um modelo de Html bem simples usando Bootstrap para a página de Pesquisa para podermos manter o foco apenas no fluxo da pesquisa, então para simplificar copie o código a baixo no arquivo /app/views/series/index.html.erb:
  2. Agora vamos inserir algumas series no banco de dados, rode no console:
  3. Agora rode todos esses comandos no console do rails:

     

     

     

     

     
  4. Rode o projeto e dê uma olhada no resultado:

    O resultado deve ser o mesmo que abaixo:
    captura-de-tela-de-2016-11-04-22-05-48
  5. Parabéns, passamos mais uma fase \o/ rumo ao sucesso.
Incluir a busca no App

Nesta parte de conclus√£o do tutorial n√≥s vamos finalmente conectar o nosso App ao ElasticSearch e realizar algumas buscas. Primeiro n√≥s precisamos “criar” o banco de dados no ElasticSearch, e a cada nova inclus√£o de dados no nosso banco automaticamente n√≥s vamos alimentar tamb√©m o banco de dados do ElasticSearch.

  1. Para começar vamos adicionar o Elastichkick ao nosso Model Series, em /app/models/series.rb substitua por:
  2. Agora vamos criar o banco no ElasticSearch, rode os seguintes comandos:
    1. Primeiro
    2. E agora para criar o banco associado ao model rode:

      reindex
  3. No nosso controller Series, vamos colocar o comando para pesquisar nos campos name e description a frase que digitarmos no campo de busca, em /app/controllers/series_controller.rb substitua por:
  4. Excelente, agora nós já estamos prontos, rode o servidor:
  5. V√° at√© o console e fa√ßa suas buscas http://localhost:3000, perceba que voc√™ pode colocar acentua√ß√Ķes incorretas ou at√© mesmo separar incorretamente as palavras e mesmo assim ele vai encontrar os resultados corretos.
    Existem muitas op√ß√Ķes para voc√™ configurar suas pesquisas, veja as principais clicando nesse link¬†https://github.com/ankane/searchkick
    captura-de-tela-de-2016-11-04-22-21-52
  6. Parabéns nós conseguimos fazer um sistema de buscas conectando o Rails e o Elastichsearch \o/.
CONCLUSÃO

Usar o ElasticSearch através do Searchkick é bem simples e vai te dar um meio de fazer pesquisas de nível profissional. Então se você precisa deste tipo de função este pode ser o caminho para você.

Como de costume o Código completo da aplicação está no Github, caso você queria clonar o código, clique aqui. Aproveita e me segue lá \o/

Apenas fazendo um merchandising do bem, uma empresa que eu participo √© o NegocieApp.com, um site para enviar propostas comerciais (Mandar or√ßamentos e etc para clientes) onde voc√™ e a sua equipe podem negociar com o cliente pela plataforma e ter um relat√≥rio sobre o numero de sucessos nas negocia√ß√Ķes e etc, √© bem bacana, d√° uma olhada l√° ūüôā
banner-cta

Se voc√™ ficou com d√ļvidas ou tem sugest√Ķes de posts para o Blog comenta a√≠ em baixo ou me adiciona no Facebook clicando aqui.

Muito Obrigado,
Sua presença aqui é uma honra para mim,
Leonardo Scorza :)[:]

novembro 5, 2016
Feito com s2 por OneBitCode
%d blogueiros gostam disto: