Posted on 10-10-2008
Filed Under (português, ruby on rails, search engine) by David William

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.

Primeiro, uma rápida explanação sobre Sphinx:

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).

Por que usar Sphinx?

É 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.

Tour rápido:

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.

Características do Ultrasphinx:

  • Busca e “rankeia” múltiplos modelos
  • Suporta delta index
  • Faz o highlight do excerpt
  • Estilo de construção da consulta semelhante ao do Google
  • Checa a ortografia
  • Modelagem em campos texto, dara e numéricos
  • Alias, mesclagem e pesos para campos
  • Geodistância
  • Inclui belongs_to e has_many
  • drop-in compatível com will_paginate
  • drop-in compatível com Interlock
  • Ambientes múltiplos de deployment
  • Rake tests compreensíveis

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)

Agora, é hora de ver alguma ação

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.

    Read More   

Comments

Pedro Pimentel on 16 October, 2008 at 9:36 am #

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,


David William on 24 October, 2008 at 1:08 pm #

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.


Post a Comment
Name:
Email:
Website:
Comments: