Full Text Search com Solr, 
MySQL Fulltext e PostgreSQL 
Fulltext search 
Por que usar? Quando usar? Qual usar?
Rodrigo Urubatan 
Programador desde 1997 
Autor do livro: Ruby on Rails 
desenvolvimento fácil e rápido 
de aplicações web...
O que é FTS? 
Full Text Search é um recurso utilizado 
quando precisamos buscar texto de forma 
mais eficiente em uma gran...
Quais são as opções disponíveis? 
Alguns bancos de dados como o MySQL, o 
Postgres e o Oracle possuem engines internas 
de...
O que vamos ver hoje?
MySQL 
Extremamente fácil de configurar 
Bastante rápido 
Tem problemas com alguns caracteres, por exemplo não é 
possível...
PostgreSQL 
Quase tão fácil de configurar quanto o MySQL 
Performance semelhante 
Interpretador de consultas mais intelige...
Solr 
Mais difícil de configurar 
Performance espetacular 
Extremamente flexível 
Necessita de código na aplicação para in...
Ok, mas quando vou precisar disto? 
Imagina se tu tem um site de noticias e quer 
que teus usuários pesquisem pelo texto d...
Já pensou em implementar um 
Google? 
Pesquisar por: +“campo bom” & +agricultura
Ok, mas como faço isto?
MySQL 
alter table companies 
add FULLTEXT KEY allfields 
(name,ticker_symbol,exchange_symbol); 
select * from companies 
...
Qual a diferença?
select exchange_symbol, group_concat(name) from companies 
where match(name) against("petrobras") 
group by exchange_symbo...
PostgreSQL 
alter table companies 
add text tsvector; 
CREATE INDEX companies_text ON companies USING gin(text); 
update c...
Qual a diferença?
select exchange_symbol, array_agg(name) from companies 
where text @@ 'petrobras'::tsquery 
group by exchange_symbol; 
18m...
Solr 
Instalar sunspot_rails e sunspot_solr no projeto rails 
Adicionar código para indexar classes: 
class Company < Acti...
res = Company.search do 
fulltext('petrobras') 
end 
13.5ms - com configuração de desenvolvimento (rake 
sunspot:solr:star...
boosting de resultados 
Post.search do 
fulltext 'pizza' do 
boost(2.0) { with(:featured, true) } 
end 
end 
Post.search d...
Resultados Facetados 
search = Post.search do 
fulltext "pizza" 
facet :author_id 
end 
search.facet(:author_id).rows.each...
Exemplos ao vivo?
Qual o melhor?
A resposta é: quais as 
necessidades da sua aplicação?
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Próximos SlideShares
Carregando em…5
×

Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text

722 visualizações

Publicada em

Slides usados na palestra Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text que apresentei hoje pela manha no #TheDevConf #TDCPOA #TDC2014

Publicada em: Tecnologia
0 comentários
4 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
722
No SlideShare
0
A partir de incorporações
0
Número de incorporações
39
Ações
Compartilhamentos
0
Downloads
5
Comentários
0
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text

  1. 1. Full Text Search com Solr, MySQL Fulltext e PostgreSQL Fulltext search Por que usar? Quando usar? Qual usar?
  2. 2. Rodrigo Urubatan Programador desde 1997 Autor do livro: Ruby on Rails desenvolvimento fácil e rápido de aplicações web http://urubatan.com.br http://sobrecodigo.com http://twitter.com/urubatan http://github.com/urubatan
  3. 3. O que é FTS? Full Text Search é um recurso utilizado quando precisamos buscar texto de forma mais eficiente em uma grande massa de dados Engines de FTS permitem uma maior flexibilidade que um “like ‘%valor%’" Normalmente também uma maior performance
  4. 4. Quais são as opções disponíveis? Alguns bancos de dados como o MySQL, o Postgres e o Oracle possuem engines internas de FTS Existem servidores externos também como o Solr, Sphinx entre outros
  5. 5. O que vamos ver hoje?
  6. 6. MySQL Extremamente fácil de configurar Bastante rápido Tem problemas com alguns caracteres, por exemplo não é possível pesquisar por AT&T Não necessita esforço adicional para indexar, funciona com um índice simples O critério de pesquisa precisa ser fixo para uma query (não é possível comparar com o valor de um campo)
  7. 7. PostgreSQL Quase tão fácil de configurar quanto o MySQL Performance semelhante Interpretador de consultas mais inteligente (é possível pesquisar por AT&T, mesmo ele buscando por /AT.T/ ) É necessário uma trigger para atualizar o campo de cache do ::tsvector
  8. 8. Solr Mais difícil de configurar Performance espetacular Extremamente flexível Necessita de código na aplicação para indexar e atualizar indices Pesquisas extremamente rápidas, indexação bastante lenta se comparada com as outras opções
  9. 9. Ok, mas quando vou precisar disto? Imagina se tu tem um site de noticias e quer que teus usuários pesquisem pelo texto das noticias? Ou tu tem uma lista de empresas e os teus clientes podem procurar pelo nome ou pelo código das ações delas?
  10. 10. Já pensou em implementar um Google? Pesquisar por: +“campo bom” & +agricultura
  11. 11. Ok, mas como faço isto?
  12. 12. MySQL alter table companies add FULLTEXT KEY allfields (name,ticker_symbol,exchange_symbol); select * from companies where match(name,ticker_symbol,exchange_symbol) against("petrobras");
  13. 13. Qual a diferença?
  14. 14. select exchange_symbol, group_concat(name) from companies where match(name) against("petrobras") group by exchange_symbol; 3 linhas 0.021s select exchange_symbol, group_concat(name) from companies where name like "%petrobras%" group by exchange_symbol; 3 linhas 4.101s um like levou 195X o tempo do FTS
  15. 15. PostgreSQL alter table companies add text tsvector; CREATE INDEX companies_text ON companies USING gin(text); update companies set text = to_tsvector(concat(name,’ ’, ticker_symbol, ‘ ‘, exchange_symbol); select * from companies where text @@ ‘petrobras’::tsquery;
  16. 16. Qual a diferença?
  17. 17. select exchange_symbol, array_agg(name) from companies where text @@ 'petrobras'::tsquery group by exchange_symbol; 18ms select exchange_symbol, array_agg(name) from companies where name like '%petrobras%' group by exchange_symbol; 2308ms FTS 128X mais rapido que like
  18. 18. Solr Instalar sunspot_rails e sunspot_solr no projeto rails Adicionar código para indexar classes: class Company < ActiveRecord::Base searchable do text :name text :exchange_and_ticker do "#{self.exchange_symbol}:#{self.ticker_symbol}" end end end Company.reindex #senta e espera #versão mais rápida: Company.find_in_batches{|batch| Sunspot.index!(batch)}
  19. 19. res = Company.search do fulltext('petrobras') end 13.5ms - com configuração de desenvolvimento (rake sunspot:solr:start) Company.where("name like ?", “%petrobras%") 4080.5ms Solr 302X mais rápido que like
  20. 20. boosting de resultados Post.search do fulltext 'pizza' do boost(2.0) { with(:featured, true) } end end Post.search do fulltext 'pizza' do fields(:body, :title => 2.0) end end
  21. 21. Resultados Facetados search = Post.search do fulltext "pizza" facet :author_id end search.facet(:author_id).rows.each do |facet| puts "Author #{facet.value} has #{facet.count} pizza posts!" end
  22. 22. Exemplos ao vivo?
  23. 23. Qual o melhor?
  24. 24. A resposta é: quais as necessidades da sua aplicação?

×