Mar 72010

Como instalar Sphinx en Mac OSX para Ruby on Rails y aprender a usarlo

En ocasiones nos encotramos con tablas muy grandes en las que realizar búsquedas complejas que se basan en más parámetros que un simple id. Con el método de indexación que nos proporciona Rails no obtendremos la rapidez que deseamos en las búsquedas. Para estos casos aconsejo utilzar Sphinx, un motor de búsqueda que hará que consultas en tablas de miles o incluso millones de filas sean increíblemente rápidas.

Así pues, voy a explicar como instalar Sphinx en Mac OS X y con PostgreSQL. Lo primero de todo será compilar unas dependencias necesarias:

~% mkdir src
~% cd src
~% curl -O http://ftp.gnu.org/gnu/libiconv/libiconv-1.13.tar.gz
~% tar xzf libiconv-1.13.tar.gz
~% cd libiconv-1.13
~% ./configure --prefix=/usr/local
~% make
~% sudo make install
~% cd ..

A continuación hacemos lo mismo con la otra librería necesaria:

~% curl -O ftp://ftp.eenet.ee/pub/FreeBSD/distfiles/expat-2.0.1.tar.gz
~% tar xzf expat-2.0.1.tar.gz
~% cd expat-2.0.1
~% ./configure --prefix=/usr/local
~% make
~% sudo make install
~% cd ..

Lo siguiente es instalar ya Sphinx:

~% curl -O http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
~% tar xzf sphinx-0.9.8.1.tar.gz
~% cd sphinx-0.9.8.1
~% export LDFLAGS="-L/usr/lib" 
~% ./configure --prefix=/usr/local --with-pgsql --with-mysql
~% make
~% sudo make install

Ahora deberíamos instalar el plugin de Rails que nos permite comunicarnos con Sphinx:

git clone \
  git://github.com/freelancing-god/thinking-sphinx.git \
  vendor/plugins/thinking_sphinx

Si todo ha ido correctamente, ya podemos empezar a usar Sphinx. Por ejemplo, consideremos que queremos indexar la tabla del modelo Article. Tendríamos que tener algo parecido a esto:

class Article
    define_index do
      #Fields, that use :conditions
      indexes :title, :sortable => true
      indexes :frontpage_behaviour

      #Attributes, that use :with 
      has author_id
    end
end

En Sphinx es necesario distinguir entre los fieds y los attributes. Los fields son aquellos campos donde buscaremos texto. Los attributes son aquellos campos que usaremos para filtrar u ordenar.
Lo siguiente que debemos hacer es indexar dichos contenidos:

rake ts:index

A continuación podemos arrancar Sphinx:

rake ts:start

Con lo cual ya lo tendríamos funcionando. Para cualquier tipo de búsqueda con Sphinx seguiremos siempre el siguiente patrón:

@articles = Article.search params[:text],
   :conditions => {:frontpage_behaviour => params[: frontpage_behaviour},
   :with => {:author_id => params[:author_id]

Hay que tener en cuenta que cualquier contenido nuevo creado hará que sea neceseario volver a indexarlo. Como remedio inmediato podemos usar los índices delta, especiales para indexar pequeñas cantidades de datos que se acaban de crear. Para usarlos, deberemos crear la siguiente migración:

def self.up
  add_column :articles, :delta, :boolean, :default => true,
    :null => false
end

Además, deberemos añadir al modelo lo siguiente:

class Article
define_index do
    set_property :delta => true
    ...
  end
end

Cualquier cambio en el modelo que use Sphinx que no sea puramente CRUD sobre las filas de las tablas, requieren un rebuild por parte de Sphinx.

rake ts:rebuild

Realmente hay muchas más cosas que se pueden usar con Sphinx, esto es tan sólo la superficie.

Tags: Sphinx, Mac OSX

Comentarios

No hay comentarios todavía para este post

Nuevo comentario