Pular para o conteúdo principal

Search engine in Ruby on Rails




Quem não gosta de facilidades no hora de navegar na internet. Uma dessas facilidades pode ser chamada de simple text-full search engine. Em resumo são aqueles campos que aceitam qualquer coisa do usuário e devolve uma lista de possíveis registros procurados. 
Uma vantagem é que se o filtro de busca costuma ser cheio de critérios é só indexar no campo full-text e está resolvido... resolvido para o programador e para o usuário que irá digitar o que sabe no campo (ou seja não existe campo não nulo neste filtro). 


Existem vários exemplos desse campo: Google tem um campo bem grande na sua página inicial; mercado livre; submarino... tem um monte desses sites com essa solução.
O problema na minha empresa não era tão diferente. A gente trabalha num projeto baseado em CRM (Rails and DB2) e os contatos inseridos no banco possuem várias informações, ou seja a tela de pesquisa de um contato específico é possível por várias informações (nome, data de nascimento, e-mail, endereco, cidade, etc...), todas essas informações juntas ou avulsas. Ou seja, se eu fosse fazer um filtro para isso precisaria de um monte de javascript, pois para cada tipo de informação seria apresentado um campo... para data de nascimento um campo data, para código do contato um campo para inserir o codigo e assim por diante. Depois ainda precisaria filtra na controller, na action qual é o tipo da pesquisa se é por cidade, por nome, por data de nasc, por codigo e etc. É um inferno!
O text-full search resolve tudo isso e se pensarmos um pouco ainda adiciona algumas vantagens, uma dela é que eu posso fazer um levantamento facilmente, por exemplo: eu preciso dos aniversariantes do mês ou os aniversariantes do mês que moram em são paulo ou entao os e-mails dos moradores do bairro do Bom Retiro.


É uma soluçao muito legal para os sistemas. Para quem quiser saber mais sobre a tecnologia que utilizamos: Xapian. Existem outras mais: ferret, solr... tem outras é que eu não estou lembrando agora mas se vocês colocarem no google vão achar outras mais. O único problema é que para cada tecnologia você vai ter algumas restrição ou algo que não te deixe contente. Por exemplo tem uma dessas soluções que funciona apenas para alguns bancos de dados, outro exemplo é não conseguir indexar os novos registros inseridos em tempo de execução, ou então não conseguir associar informações de outras tabelas ou não conseguir fazer busca com range (ex. os aniversariantes do dia 1/1/2009 a 1/3/3009).  
Vai de cada um a escolha, vai depender muito do ambiente que se encontram.
É isso... Se alguem tiver alguma dúvida sobre como implementar o xapian para os seus projetos por favor me mande um e-mail Altherlex Alves.
Abraço e até mais.

Comentários

  1. Pow, bacana mesmo! a emplementação que voce fez no sistema da sua empresa ficou bem legal.

    abraço.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Números Primos + MMC + MDC + Ruby

Segue abaixo um exemplo de implementação de gerador de Números Primos + MMC ( Mínimo Múltiplo Comum ) + MDC ( Máximo Divisor Comum ) em ruby. É um resultado de uma prova de lógica que um amigo meu teve que fazer em java. Colaborações prestimosas de Cirillo Ferreira. require 'Mathn' class Numeric def multiplos(ate = 500) (1..ate).to_a.map{|v| self*v} end def divisores(ate = 500) (1..ate).to_a.map{|v| v if (self%v == 0)}.compact end end module Math def self.mmc(*valor) compara( valor.inject([]){|h, i| h end def self.mdc(*valor) compara( valor.inject([]){|h, i| h end def self.nmr_primos numeros_primos = [] (2..501).each{|i| numeros_primos numeros_primos.uniq! end private def self.compara(arr) arr.inject(arr[0]){|ac, i| ac & i} end end Math::mmc(3,5,8) => 120 Math::mmc(3,5,8,9) => 360 Os métodos mmc e mdc são métodos que aceitam parâmetros indeterminado graças a uma coisa, da linguagem ruby, chamada operador splat, que é aquele asterisco na assinatura do método. ...

Rails: Rotas

Fala rapazeada... Hoje algumas notas sobre rotas: 1º- Diferença entre member e collection: map.resources :notas, :member => { :baixar => :get } map.resources :notas, :collection => { :baixar => :get } A rota para collection será: "/notas/baixar". E para member será necessário informar um id, assim: "/notas/2/baixar" 2º - Herança: Da mesma forma que é preciso informar na model quando uma tabela depende da outra, assim: class Pessoa < ActiveRecord::Base;end class Telefone < ActiveRecord::Base; belongs_to Pessoa; end É necessário fazer suas relações nas rotas, assim: map.resources :pessoas do |pessoa| pessoa.resources :telefones end Ficando assim: --------------------------------------------------------------------------------------------------------------------------------------------- | Método | Rota | Chamada | -------------------------------------------------------------------------------...

Rails3 + Ruby1.9 + Dalli (memcache-client)

Após a revolução  cientifico-tecnológico, vivemos agora a terceira revolução industrial, a revolução feita a partir da informação. Dai a importância dos computadores, do meio técnico (a infraestrutura), e por conseguinte - e reservando suas proporções, a ferramenta mencached -- Gem memcache-client não implementa Rails3 app mais. É necessário, agora, usar a poética gem: Dalli . Caso sua aplicação use muita sessão (como a minha). Com certeza terá um problema com a nova gem do memcached. O serializer do Dalli é o Marshal. (Você pode alterar para o qual você quiser: yajl-ruby , ...).  Loading .... Leia também: bashar3a (in English) Revolução Técnico-ciêntifico-informacional Prof. Milton Santos Salvador Dali Surrealismo