
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
- Ruby 2.3.1
- Rails 5
- Sqlite3
- Searchkick (Gem)
- ElastichSearch
- Bootstrap
- Rails Composer
Objetivos (Passo a Passo)
- Criar o projeto e configurar a base para a pesquisa
- Criar uma interface gráfica para o usuário poder realizar a pesquisa
- 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á:
- 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:
1rails new search -m https://raw.github.com/RailsApps/rails-composer/master/composer.rb
*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/ ) - Coloque o elastickick no seu Gemfile:
1gem 'searchkick' - Vamos rodar o bundle para instalar a gem:
1bundle - Crie o Model Series com os campos name, description e link (para armazenarmos as series que vamos pesquisar):
1rails g model Series name:string description:text link:string - Crie agora o Controller Series para podermos fazer a pesquisa
1rails g controller Series index - Agora vamos configurar nossas rotas para o Series Index estar no root, no seu routes.rb coloque:
1root to: "series#index" - Rode no seu console o comando para criar o banco de dados e rodar as migrations que criamos junto com o Model Series:
1rake db:create & rake db:migrate - Rode o servidor
1rails s - Veja seu projeto no browser acessando http://localhost:3000/
- 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)
- Primeiro instale o Java (É uma dependência do ElasticSearch):
1sudo apt-get install default-jdk - Agora baixe o elasticsearch:
1wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.0.0.deb - Instale o pacote:
1sudo dpkg -i elasticsearch-5.0.0.deb - Vamos dar o start no ElasticSearch, primeiro rode:
1ps -p 1
Caso o resultado seja como a baixo “systemd”:
Então rode:
1sudo systemctl start elasticsearch.service
Caso o resultado seja “init”, rode1sudo -i service elasticsearch start - Vamos testar para ver se o Elasticsearch está funcionando corretamente:
1curl -X GET 'http://localhost:9200'
*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
- Primeiro instale o Java (É uma dependência do ElasticSearch):
- 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.
- 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:
1234567891011121314151617181920<div class="container"><form role="form" action="/"><h2 class="">Encontrando Séries</h2><input type="text" class="form-control" placeholder="Ex: Marvel" name="keywords"><br><button class="btn btn-primary btn-block" type="submit">Procurar</button><br></form><section class="series"><% if @series.present? %><% @series.each do |serie| %><div class="col-md-12"><h1><%= serie.name %></h1><p><%= serie.description %></p><p><a href="<%= serie.link %>">Veja mais clicando aqui</a></p></div><% end %><% end %></selection></div> - Agora vamos inserir algumas series no banco de dados, rode no console:
1rails c - Agora rode todos esses comandos no console do rails:
1Series.create name: 'The Black List', description: 'Raymond Reddington, um dos criminosos mais procurados pelo FBI, entrega-se às autoridades. Promete entregar diversos criminosos e terroristas desde que trate somente com Elizabeth Keen, uma funcionária novata do FBI. Aparentemente não há ligação entre eles e ele também não revela o motivo dessa preferência', link: 'https://pt.wikipedia.org/wiki/The_Blacklist'
1Series.create name: 'The Big Bang Theory', description: 'The Big Bang Theory (Big Bang: A Teoria (título no Brasil) ou A Teoria do Big Bang (título em Portugal)), frequentemente abreviada como "TBBT", é uma série de televisão norte-americana de comédia de situação criada por Chuck Lorre e Bill Prady, que estreou no canal CBS em 22 de setembro de 2007', link: 'https://pt.wikipedia.org/wiki/The_Big_Bang_Theory'
1Series.create name: 'Orphan Black', description: 'Orphan Black é uma série de televisão canadense de ficção científica, criada por Graeme Manson e John Fawcett, estrelada por Tatiana Maslany como várias pessoas idênticas que são clones. A série centra-se em Sarah Manning, uma mulher que assume a identidade de outro clone, Elizabeth Childs, depois de testemunhar o suicídio da mesma. A série levanta questões sobre as implicações morais e éticas da clonagem humana e seus efeitos sobre questões de identidade pessoal', link: 'https://pt.wikipedia.org/wiki/Orphan_Black'
1Series.create name: 'Luke Cage', description: 'Luke Cage, anteriormente conhecido como Poderoso (no original Powerman), é um super-herói de histórias em quadrinhos da Marvel Comics. Nascido nas ruas do Harlem, ex-membro de gangue, foi preso por um crime que não cometeu. Voluntário em uma experiência científica, foi vítima de sabotagem de um carcereiro. Acabou ganhando superforça e pele invulnerável. Fora da cadeia, passou a trabalhar por dinheiro, geralmente como guarda-costas, e participou de aventuras ao lado de vários outros heróis, principalmente Demolidor e Punho de Ferro. A série foi cancelada no final dos anos 1980 e ele passou a ser usado apenas como coadjuvante em HQs de outros personagens. No ano 2001, estreou nova série, agora pelo selo Marvel MAX. Também foi personagem regular da série The Pulse que, assim como Alias, foi estrelada por sua atual esposa, Jessica Jones', link: 'https://pt.wikipedia.org/wiki/Luke_Cage'
1Series.create name: 'Agent Carter', description: 'Marvels Agent Carter ou simplesmente Agent Carter, foi uma série de televisão americana criada por Christopher Markus e Stephen McFeely, transmitida pela ABC. A série se passa depois dos eventos vistos em Capitão América: O Primeiro Vingador, acompanhando Peggy Carter conforme ela lida com o desaparecimento de Steve Rogers e o novo emprego na RCE (Reserva Científica e Estratégica)', link: 'https://pt.wikipedia.org/wiki/Agent_Carter'
- Rode o projeto e dê uma olhada no resultado:
1rails s
O resultado deve ser o mesmo que abaixo:
most visited free dating site in usa - 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.
- Para começar vamos adicionar o Elastichkick ao nosso Model Series, em /app/models/series.rb substitua por:
123class Series < ApplicationRecordsearchkickend - Agora vamos criar o banco no ElasticSearch, rode os seguintes comandos:
- Primeiro
1rails c - E agora para criar o banco associado ao model rode:
1Series.reindex
the best muslim dating sites
- Primeiro
- 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:
123456789class SeriesController < ApplicationControllerdef index# Verifica se o usuário entrou com keywordsif params[:keywords].present?# Diz ao elastickick para pesquisar as keyrwords nos campos name e description@series = Series.search params[:keywords], fields: [:name, :description]endendend - Excelente, agora nós já estamos prontos, rode o servidor:
1rails s - 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
- Parabéns nós conseguimos fazer um sistema de buscas conectando o Rails e o Elastichsearch \o/.

Não perca nenhum conteúdo
Receba nosso resumo semanal com os novos posts, cursos, talks e vagas 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á 🙂
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 🙂
Primeira vez no OneBitCode? Curtiu esse conteúdo?
O OneBitCode tem muito mais para você!
O OneBitCode traz conteúdos de qualidade, e em português, sobre programação com foco em Ruby on Rails e também JavaScript.
Além disso, aqui sempre levamos à você conteúdos valiosos sobre a carreira de programação, dicas sobre currículos, portfólios, perfil profissional, soft skills, enfim, tudo o que você precisa saber para continuar evoluindo como Programador(a)!
Fique por dentro de todos os conteúdos o/
Nossas redes sociais:
📹 • https://youtube.com/Onebitcode [Live todas as terças-feiras às 19h)
💻 • https://linkedin.com/company/onebitcode
🙂 • https://facebook.com/onebitcode
📱 • https://instagram.com/one_bit_code
🐦 • https://twitter.com/onebitcode
Nossos cursos:
🥇 • Programador Full Stack Javascript em 8 Semanas
💎 • Curso Completo de Ruby
⚙ • Minicurso: API Rails 5 Completo
🐞 • Minicurso de Testes para Ruby on Rails com RSpec
Espero que curta nossos conteúdos e sempre que precisar de ajuda, fala com a gente!
Estamos aqui para você 🙂
Bem-vindo à família OneBitCode o/