SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
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 
http://urubatan.com.br 
http://sobrecodigo.com 
http://twitter.com/urubatan 
http://github.com/urubatan
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
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
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 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)
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
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
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?
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 
where match(name,ticker_symbol,exchange_symbol) 
against("petrobras");
Qual a diferença?
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
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;
Qual a diferença?
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
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)}
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
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
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
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

Weitere ähnliche Inhalte

Ähnlich wie Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text

TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e ElasticsearchTDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearchtdc-globalcode
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...Aryel Tupinambá
 
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...Tchelinux
 
Workshop do Bem: O mundo das APIs
Workshop do Bem: O mundo das APIsWorkshop do Bem: O mundo das APIs
Workshop do Bem: O mundo das APIsHeider Lopes
 
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMASO MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMASHeider Lopes
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIMario Guedes
 
Big Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoBig Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoRicardo Longa
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos formsMoacir Filho
 
Express2012simples 130312140529-phpapp01
Express2012simples 130312140529-phpapp01Express2012simples 130312140529-phpapp01
Express2012simples 130312140529-phpapp01Osny Pereira Filho
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSPledsifes
 
02 - Fundamentos de Servlets
02 - Fundamentos de Servlets02 - Fundamentos de Servlets
02 - Fundamentos de ServletsMarcio Marinho
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixAndré Déo
 
Desenvolvimento de uma API RESTful com Java EE
Desenvolvimento de uma API RESTful com Java EEDesenvolvimento de uma API RESTful com Java EE
Desenvolvimento de uma API RESTful com Java EELuan Felipe Knebel
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 

Ähnlich wie Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text (20)

TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e ElasticsearchTDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
 
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
 
Workshop do Bem: O mundo das APIs
Workshop do Bem: O mundo das APIsWorkshop do Bem: O mundo das APIs
Workshop do Bem: O mundo das APIs
 
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMASO MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
 
Big Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoBig Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenho
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Sap – stablility and abstract principle
Sap – stablility and abstract principleSap – stablility and abstract principle
Sap – stablility and abstract principle
 
TechEd_OFC305
TechEd_OFC305TechEd_OFC305
TechEd_OFC305
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos forms
 
Express2012simples 130312140529-phpapp01
Express2012simples 130312140529-phpapp01Express2012simples 130312140529-phpapp01
Express2012simples 130312140529-phpapp01
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSP
 
Learning to Rank
Learning to RankLearning to Rank
Learning to Rank
 
02 - Fundamentos de Servlets
02 - Fundamentos de Servlets02 - Fundamentos de Servlets
02 - Fundamentos de Servlets
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com Zabbix
 
Desenvolvimento de uma API RESTful com Java EE
Desenvolvimento de uma API RESTful com Java EEDesenvolvimento de uma API RESTful com Java EE
Desenvolvimento de uma API RESTful com Java EE
 
Palestra
PalestraPalestra
Palestra
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 

Mehr von Rodrigo Urubatan

Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby is it possible? is it fast? should we use it?Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby is it possible? is it fast? should we use it?Rodrigo Urubatan
 
Data science in ruby, is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?Data science in ruby, is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?Rodrigo Urubatan
 
2018 the conf put git to work - increase the quality of your rails project...
2018 the conf   put git to work -  increase the quality of your rails project...2018 the conf   put git to work -  increase the quality of your rails project...
2018 the conf put git to work - increase the quality of your rails project...Rodrigo Urubatan
 
2018 RubyHACK: put git to work - increase the quality of your rails project...
2018 RubyHACK:  put git to work -  increase the quality of your rails project...2018 RubyHACK:  put git to work -  increase the quality of your rails project...
2018 RubyHACK: put git to work - increase the quality of your rails project...Rodrigo Urubatan
 
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...Rodrigo Urubatan
 
Your first game with unity3d framework
Your first game with unity3d frameworkYour first game with unity3d framework
Your first game with unity3d frameworkRodrigo Urubatan
 
Tdc Floripa 2017 - 8 falácias da programação distribuída
Tdc Floripa 2017 -  8 falácias da programação distribuídaTdc Floripa 2017 -  8 falácias da programação distribuída
Tdc Floripa 2017 - 8 falácias da programação distribuídaRodrigo Urubatan
 
Rubyconf2016 - Solving communication problems in distributed teams with BDD
Rubyconf2016 - Solving communication problems in distributed teams with BDDRubyconf2016 - Solving communication problems in distributed teams with BDD
Rubyconf2016 - Solving communication problems in distributed teams with BDDRodrigo Urubatan
 
resolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bddresolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bddRodrigo Urubatan
 
vantagens e desvantagens de trabalhar remoto
vantagens e desvantagens de trabalhar remotovantagens e desvantagens de trabalhar remoto
vantagens e desvantagens de trabalhar remotoRodrigo Urubatan
 
Using BDD to Solve communication problems
Using BDD to Solve communication problemsUsing BDD to Solve communication problems
Using BDD to Solve communication problemsRodrigo Urubatan
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JSRodrigo Urubatan
 
Ruby para programadores java
Ruby para programadores javaRuby para programadores java
Ruby para programadores javaRodrigo Urubatan
 
Treinamento html5, css e java script apresentado na HP
Treinamento html5, css e java script apresentado na HPTreinamento html5, css e java script apresentado na HP
Treinamento html5, css e java script apresentado na HPRodrigo Urubatan
 
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
Ruby on rails  impressione a você mesmo, seu chefe e seu clienteRuby on rails  impressione a você mesmo, seu chefe e seu cliente
Ruby on rails impressione a você mesmo, seu chefe e seu clienteRodrigo Urubatan
 
Aplicações Hibridas com Phonegap e HTML5
Aplicações Hibridas com Phonegap e HTML5Aplicações Hibridas com Phonegap e HTML5
Aplicações Hibridas com Phonegap e HTML5Rodrigo Urubatan
 

Mehr von Rodrigo Urubatan (20)

Ruby code smells
Ruby code smellsRuby code smells
Ruby code smells
 
Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby is it possible? is it fast? should we use it?Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby is it possible? is it fast? should we use it?
 
Data science in ruby, is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?Data science in ruby, is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?
 
2018 the conf put git to work - increase the quality of your rails project...
2018 the conf   put git to work -  increase the quality of your rails project...2018 the conf   put git to work -  increase the quality of your rails project...
2018 the conf put git to work - increase the quality of your rails project...
 
2018 RubyHACK: put git to work - increase the quality of your rails project...
2018 RubyHACK:  put git to work -  increase the quality of your rails project...2018 RubyHACK:  put git to work -  increase the quality of your rails project...
2018 RubyHACK: put git to work - increase the quality of your rails project...
 
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
 
Your first game with unity3d framework
Your first game with unity3d frameworkYour first game with unity3d framework
Your first game with unity3d framework
 
Tdc Floripa 2017 - 8 falácias da programação distribuída
Tdc Floripa 2017 -  8 falácias da programação distribuídaTdc Floripa 2017 -  8 falácias da programação distribuída
Tdc Floripa 2017 - 8 falácias da programação distribuída
 
Rubyconf2016 - Solving communication problems in distributed teams with BDD
Rubyconf2016 - Solving communication problems in distributed teams with BDDRubyconf2016 - Solving communication problems in distributed teams with BDD
Rubyconf2016 - Solving communication problems in distributed teams with BDD
 
resolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bddresolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bdd
 
vantagens e desvantagens de trabalhar remoto
vantagens e desvantagens de trabalhar remotovantagens e desvantagens de trabalhar remoto
vantagens e desvantagens de trabalhar remoto
 
Using BDD to Solve communication problems
Using BDD to Solve communication problemsUsing BDD to Solve communication problems
Using BDD to Solve communication problems
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
 
Ruby para programadores java
Ruby para programadores javaRuby para programadores java
Ruby para programadores java
 
Treinamento html5, css e java script apresentado na HP
Treinamento html5, css e java script apresentado na HPTreinamento html5, css e java script apresentado na HP
Treinamento html5, css e java script apresentado na HP
 
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
Ruby on rails  impressione a você mesmo, seu chefe e seu clienteRuby on rails  impressione a você mesmo, seu chefe e seu cliente
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
 
Mini curso rails 3
Mini curso rails 3Mini curso rails 3
Mini curso rails 3
 
Aplicações Hibridas com Phonegap e HTML5
Aplicações Hibridas com Phonegap e HTML5Aplicações Hibridas com Phonegap e HTML5
Aplicações Hibridas com Phonegap e HTML5
 

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

  • 1. Full Text Search com Solr, MySQL Fulltext e PostgreSQL Fulltext search Por que usar? Quando usar? Qual usar?
  • 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. 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. 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. O que vamos ver hoje?
  • 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. 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. 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. 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. Já pensou em implementar um Google? Pesquisar por: +“campo bom” & +agricultura
  • 11. Ok, mas como faço isto?
  • 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");
  • 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. 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;
  • 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. 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. 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. 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. 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
  • 24. A resposta é: quais as necessidades da sua aplicação?