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 << i.multiplos} ).first end def self.mdc(*valor) compara( valor.inject([]){|h, i| h << i.divisores } ).last end def self.nmr_primos numeros_primos = [] (2..501).each{|i| numeros_primos << (2..i).detect{|j| j%j ==0 && i%j==0} } 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 indetermi

Naturalismo (1870-1900)

Naturalismo é uma escola literaria, vertente do realismo também definido como o realismo extremo. Procura explicar cientificamente (com negação do sentimento e da metafísica) a conduta e o modo de ser dos seres por meio dos fatores externos e da natureza biológica e sociológica. "Os seres são como produtos, como consequência de forças preexistente que limitam a sua responsabilidade e os tornam, nos casos extremos, verdadeiros joguetes das condições. [...] o efeito das taras, das doenças, dos vícios, na formação/desvio do caráter juntando-lhes os efeitos complementares da formação familiar, da educação, do nível cultural." Antonio Candido e José Aderaldo Castello "O Romantismo era a apoteose do sentimento; - o Realismo é a anatomia do caráter. É a crítica do homem. É a arte que nos pinta a nossos próprios olhos - para condenar o que houve de mau na nossa sociedade." Eça de Queirós Teorias: Zoomofismo Determinismo do meio Evolucionismo Eugenia Naturalismo

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