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_sphinxSi 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:indexA continuación podemos arrancar Sphinx:
rake ts:startCon 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:rebuildRealmente hay muchas más cosas que se pueden usar con Sphinx, esto es tan sólo la superficie.
Subscríbete