Neste post eu gostaria de mostrar como usar Sphinx através do plugin Ultrasphinx.
Eu escrevi outro post sobre o básico que você precisa saber sobre Sphinx. Se Sphinx é algo realmente novo pra você, eu recomendo que você leia o post antes de continuar.
Sphinx é um mecanismo de busca full-text. O objetivo princial é prover uma busca boa e rápida com uma série de opções para aumentar a relevância dos resultados.
A distribuição inclui quatro programas: indexer (para criar índices fulltext), search (para consultar índices fulltext a partir da linha de comando), searchd (um daemon para pesquisar índices fulltext a partir de softwares externos - o caso mais comum) e sphinxapi (um conunto de bibliotecas API).
É fácil entender o porquê após dar uma olhada na lista de características do Sphinx. Basicamente, se você quer alta velocidade de indexação e de busca, alta escabilidade, boa relevância, consultas de proximidade do tipo boolean, frase e palavras, suporte a stopwords, Stemming em inglês e russo, então, eu posso lhe dizer, você realmente vai querer experimentar Sphinx.
Faça o download do Sphinx:
http://www.sphinxsearch.com/downloads.html
Obtenha o release mais atual.
Extraia tudo:
$ tar xvzf sphinx-sphinx-0.9.8.tar.gz
$ cd sphinx
Então, configure:
$ ./configure
Apesar da grande variedade de opções para configurar, confie em mim: se você está iniciando, apenas use ./configure sem nenhuma opção. Por padrão, isso configurará o Sphinx para MySQL. Depois você pode experimentar outras opções, mas primeiro será melhor ver como tudo funciona. Para ver todas as opções para configurar, use ./configure –help.
Construa os binários:
$ make
Instale os binários:
$ (sudo) make install
Nós estamos quase lá
Agora, o plugin: Ultrasphinx
Utrasphinx é um configurador Ruby on Rails e um cliente para o mecanismo de busca fulltext do Sphinx. Eu apenas comecei a utilizá-lo. Ainda há muito o que aprender. Estou gostando.
Além do Sphinx, você também precisa do gem chronic:
$ sudo gem install chronic
Agora você está pronto para instalar o plugin:
$ script/plugin install -x svn://rubyforge.org/var/svn/fauna/ultrasphinx/trunk
Ou tão somente faça o download od Ultrasphinx: (yourapp/vendor/plugin/ultrasphinx/):
http://github.com/fauna/ultrasphinx/tree/master
Dentro do diretório do plugin, existe um arquivo dentro de examples chamado default.base. Copie para o diretório config de sua aplicação:
$ cp vendor/plugin/examples/default.base yourapp/config/ultrasphinx/default.base
Digamos que você está trabalhando em um projeto de uma livraria. Assumindo que você tem um modelo chamado Book, use o método is_indexed para configurar o modelo como “buscável”:
Class Book < ActiveRecord::Base
is_indexed :fields => ['title', 'author']
end
Para construir o índice, execute:
$ rake ultrasphinx:configure
$ rake ultrasphinx:index
$ rake ultrasphinx:daemon:start
Ou apenas execute:
$ rake ultrasphinx:bootstrap #(faz a mesma coisa - três em um)
No arquivo books_controller.rb, crie um novo método:
def search
@books = Ultrasphinx::Search.new(:query => params[:query])
@books.run
@books.results
end
Assumindo que você tem uma view chamada search.html.erb, vamos escrever uma nova entrada no arquivo config/routes.rb:
map.search '/books/search/:query', :controller => 'books', :action => 'search'
Agora podemos execurar a busca usando Sphinx através do plugin Ultrasphinx, bastando apenas digitar a url da view com o critério da busca no final. Neste exemplo, nós vamos procurar por “Scott Adams” em nosso índice de livros. Lembre-se: nós indexamos o título e o autor (title e author).
http://localhost:3000/books/search/scott adams
Simples assim.
Por padrão, a busca é insensitiva ao caso e irrelevante quanto a acentos. É claro que você pode adicionar características interessantes à sua busca, como paginação e peso:
def search
@musics = Ultrasphinx::Search.new(
:query => params[:query],
:per_page => 30,
:weights => { 'author' => 2.0} # 1.0 é o valor padrão
)
@books.run
@books.results
end
Se você quer aprender mais sobre Class:Ultrasphinx::Search, visite:
http://blog.evanweaver.com/files/doc/fauna/ultrasphinx/classes/Ultrasphinx/Search.html
É isso. Espero que você goste.
Até mais.
Olá!
Eu gostei bastante do ultrasphinx. Só achei ele verboso demais na hora de usar o método is_indexed.
Como eu tinha relacionamentos bem complexos, tive que descrever várias coisas em sql.
também tive um problema com ele não conseguir ordenar campos decimais, daí acabei alterando o plugin pra ele funcionar.
Mas é bem rápido mesmo, tanto pra indexar como pra procurar.
O único porém é não ser atrelhado ao activerecord. Acho bem chato ter um daemon agendado por cron ou algo do tipo..
abraços,
Olá Pedro. O Ultrasphinx tem me servido com uma solução muito interessante, se você pensar no trabalho de estruturar consultas complexas usando apenas SQL. O Sphinx em si é um projeto que ainda tem muito para evoluir. Quanto ao daemon, penso que esse é o menor dos problemas. Sinto muito falta de uma fuzzy logic, ou mesmo stemming para português. A busca por proximidade ainda é um pouco primária. Também fiz alterações no arquivo de configuração para melhorar a proximidade. Você poderia disponibilizar as alterações que você fez no plugin? Com a contribuição de todos creio que teremos muitas novidades pela frente. Grande abraço.