Sphinx Search es un genial motor de búsqueda Open Source especialmente útil cuando tenemos muchos datos a los que tenemos que acceder de forma rápida.

Su principal virtud es la de crear unos índices conteniendo la información que nosotros le hayamos configurado, que pueden ser accedidos desde nuestros programas (C, PHP, etc) para recuperar la información mucho más rápido que si lo hiciéramos directamente a una base de datos (normalmente se usa como complemento de éstas, cuando la cantidad de información que tenemos en dicha base de datos es demasiado grande y sus propios índices no son todo lo efectivos que nos gustaría).

A dia de hoy no existen paquetes precompilados para nuestra querida Debian, por lo que vamos a generarlos nosotros a partir de su código fuente. Ya existen paquetes precompilados para las distribuciones de Linux más importantes, los cuales se pueden descargar desde: http://sphinxsearch.com/downloads/release/

Si vamos a utilizar éstos paquetes precompilados, únicamente tendremos que instalarlos con el gestor de paquetes de nuestra distribución (dpkg, rpm o lo que corresponda). Por lo tanto, si lo haceis de ésta forma, podeis saltaros la parte de instalación de éste artículo.

Instalación

En Debian, siempre es preferible generar paquetes .deb en lugar de instalar manualmente el código fuente compilado, ya que así podremos instalarlos y desinstalarlos limpiamente usando apt o dpkg.

Para generar éstos paquetes primero necesitamos el código fuente, y luego generaremos los paquetes con ese código ya compilado. Po lo tanto, descargamos el tar.gz con la última versión del código fuente de la web oficial de descarga del proyecto, que en este momento es la 0.9.8.1. (Actualización: hoy en dia ésta versión está más que desactualizada, por lo que os recomiendo que bajeis la ultima versión estable)

$ cd /tmp
$ wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz

Descomprimimos el archivo en el directorio de fuentes de nuestro sistema (/usr/src)

$ tar xvzf /tmp/sphinx-0.9.8.1.tar.gz
$ cd /usr/src
$ sudo mv /tmp/sphinx-0.9.8.1 /usr/src

Después, preparamos el paquete para la compilación, especificando si queremos SPHINX con soporte para MySQL, PostgreSQL o ambos, e indicando el directorio donde queremos instalarlo (en mi caso, en /opt/sphinx):

$ cd /usr/src/sphinx-0.9.8.1
$ ./configure --with-pgsql --with-mysql --prefix=/opt/sphinx/

Si ésto falla, normalmente será porque no tenemos instalados todos los paquetes necesarios (o sus correspondientes versiones de desarrollo, por lo que dependiendo del error que se muestre, instalaremos las dependencias necesarias). En principio, debería bastar con éstos paquetes para compilar Sphinx con soporte para MySQL y PostgreSQL:

  • build-essential
  • librerias de desarrollo de MySQL (libmysql++-dev)
  • librerías de desarrollo de PostgreSQL (postgresql-dev)

Una vez preparado el paquete para la compilación, lo compilamos:

$ make

Y una vez compilado, en lugar de instalarlo, generamos el paquete .deb con ayuda del programa checkinstall (si no lo tienes, instálalo! apt-get es tu amigo!), simplemente tecleando:

$ checkinstall

Lo cual generará un archivo .deb, que podremos instalar fácilmente con dpkg:

$ sudo dpkg -i sphinx_0.9.8.1-1_i386.deb

Este proceso hará, entre otras cosas, que tengamos 3 binarios de Sphinx instalados en nuestro sistema. Hay algunos mas, pero los que nos interesan son solo estos 3:

  • indexer: Este programa es el que generará los índices de búsqueda de nuestras bases de datos.
  • search: El programa que realizará las búsquedas en los índices generados.
  • searchd: Un demonio que permitirá consultas remotas desde la API o desde otras máquinas

Ahora, crearemos el usuario que ejecutará el programa:

$ sudo adduser --system --home /opt/sphinx --uid 999 --disabled-password --disabled-login sphinx

Después, creamos algunos directorios más para los logs, el pid, etc:

$ sudo mkdir /opt/sphinx/log
$ sudo mkdir /opt/sphinx/run

Descargamos el genial script de init.d de Sphinx, programado por Klaus, para poder iniciar y para el servicio:

$ wget http://www.klaus.gr/pub/sphinx
$ mv sphinx /etc/init.d/
$ chmod 755 /etc/init.d/sphinx

Miramos cuál es nuestro runlevel actual, y hacemos enlaces al script desde el runlevel indicado:

$ /sbin/runlevel | cut -b 3
$ sudo ln -s /etc/init.d/sphinx /etc/rc2.d/S92sphinx
$ sudo chown -R sphinx:root /opt/sphinx

Copiamos el archivo de configuracion de ejemplo de Sphinx, y lo editamos:

$ cd /opt/sphinx/etc
$ cp -p sphinx.conf.dist sphinx.conf

Hay información sobre la configuración en la web oficial de Sphinx, y aquí: http://www.compuglobalhipermega.net/mysql/ejemplo-rfc-sphinx/

Configuración

Una vez que hayamos configurado el archivo /opt/sphinx/etc/sphinx.conf, tenemos que crear los indices de búsqueda. Para eso, hay que ejecutar el programa indexer de esta forma:

$ /opt/sphinx/bin/indexer -config /opt/sphinx/etc/sphinx.conf --all

Cada vez que queramos actualizar el índice, debemos ejecutar de nuevo ese comando. O mejor aún, vamos a modificar el script de /etc/init.d/sphinx para incluir un nuevo comando rebuild-index que nos facilitará el proceso de reconstruccion de los índices.

Para eso, modificamos /etc/init.d/sphinx e incluimos esta linea al principio, más o menos donde se define la variable binpath:

indexerpath=/opt/sphinx/bin/indexer

Y éstas lineas al final (donde corresponda, es facil verlo si observais el archivo):

rebuild-index)
    echo "Rebuilding sphinx search index: indexer"
    $indexerpath $SPHINX --all --rotate
    echo "."
    ;;

Y modificamos la linea:

echo "Usage: /etc/init.d/shpinx {start|stop|restart|force-reload}

Añadiendo rebuild-index, de tal forma que quede así:

echo "Usage: /etc/init.d/shpinx {start|stop|restart|force-reload|rebuild-index}"

De forma que podremos reconstruir/actualizar los indices con el comando:

$ sudo /etc/init.d/sphinx rebuild-index

Y ahora que ya tenemos los indices creados, lanzamos sphinx:

$ sudo /etc/init.d/sphinx start

Y listo... ya tenemos nuestro demonio searchd corriendo...

Instalación de la librería de acceso desde PHP

Para acceder a Sphinx y poder realizar búsquedas en sus índices desde, por ejemplo PHP, necesitamos compilar la extensión de PECL de Sphinx.

Para compilar dicha extensión, necesitamos compilar previamente la librería libsphinxclient, que se encuentra en el subdirectorio api/libsphinxclient del codigo fuente de Sphinx.

Accedemos a dicho directorio, y compilamos la librería:

$ cd /usr/src/sphinx-0.9.8.1/api/libsphinxclient
$ CXXCPP="gcc -E"
$ ./configure --prefix=/opt/sphinx
$ make
$ sudo make install

Ya tenemos la librería lista... ahora, descargamos la librería PECL de Sphinx para PHP. Podemos descargarla desde: http://pecl.php.net/package/sphinx/

$ cd /tmp
$ wget http://pecl.php.net/get/sphinx-1.0.0.tgz
$ cd /usr/src
$ sudo tar xvzf /tmp/sphinx-1.0.0.tgz
$ sudo mv sphinx-1.0.0 sphinx-pecl-1.0.0
$ sudo cd sphinx-pecl-1.0.0

Si no tenemos phpize, lo instalamos:

$ sudo apt-get install php5-dev

Usamos phpize y compilamos la librería:

$ phpize5
$ ./configure --with-sphinx=/opt/sphinx
$ make

Generamos de nuevo el paquete .deb con checkinstall, y lo instalamos con dpkg:

$ checkinstall
$ dpkg -i sphinx-pecl_1.0.0-1_i386.deb

Y por último, añadimos añadir un archivo sphinx.ini en /etc/php5/conf.d/ con estas lineas, para habilitar la librería:

[sphinx]
extension=sphinx.so

Reiniciamos el servidor web, y ya podremos trabajar con Sphinx desde PHP como se explica en http://php.net/sphinx.

Espero que os sirva de ayuda!

Alaaaaaaaaaaaaaaaaaaaaa

Referencias