Cómo crear tu propio buscador.
Instalación y configuración de SPHINX ( I )
Se va a explicar como se puede hacer un buscador realmente profesional en unos pocos pasos. Hasta ahora no existía ningun recurso en español de SPHINX así que me propuse acabar con esa injusticia.
¿Cómo es un buscador por dentro?
Un buscador web tiene generalmente los siguientes componentes:
- Crawler: componente encargado de la recuperación de lás páginas web que se quieren procesar. Comienza descargando el código HTML de una página, extrae todos sus enlaces y a continuación repite el proceso con cada uno de ellos y asi sucesivamente. Requiere de una gran capacidad de alamacenamiento y uso de ancho de banda. También se les llama arañas web.
- Indexer: es la parte que procesa toda la información recogida por el crawler y genera uno o varios índices.
- Searcher: componente que consulta el índice y recupera la información resultante
Cuando uno piensa en un buscador web, de alguna manera piensa directamente en un buscador de páginas web, pero existe vida mucho más allá de estos. Hay muchos casos (en realidad la gran mayoría) en los que se tiene una gran cantidad de información en una base de datos y se necesita poder realizar búsquedas en ella. Es este el caso de los blogs, de los wikis, de cualquier sitio de comercio electrónico... De hecho, está guía se va a basar en que ya se dispone de una base de datos mediana y no se realiza ningun proceso de crawling.
¿Porqué SPHINX ?
Una vez aclarado que partimos de una base de datos, se podría pensar en hacer el buscador con las herramientas propias del SGBD en concreto. Pero la realidad es otra muy distinta, el rendimiento de las búsquedas de texto completo con las herramientas propias de MySQL deja muchísimo que desear cuando la base de datos crece.
Es en este punto, donde entra SPHINX (SQL Phrase Index ). SPHINX es un indexer/searcher escrito en C/C++ para bases de datos MySQL y PostgreSQL. Sus características más importantes son:
- Velocidad de indización muy alta
- Velocidad de búsqueda muy alta
- Stemmers en inglés y ruso
- Soporte para búsquedas booleanas
- Algoritmo de relevancia de proximidad
- Soporte de listas de palabras vacías
- API de búsqueda en PHP y Phyton
Descarga
La versión 0.9.7-rc2 con la que se ha realizado este artículo se puede descargar de la web oficial del proyecto sphinx.
Aunque este manual se realizó con la version 0.9.7-rc2 se puede instalar sin ningún problema siguiendo los mismos pasos la version 0.9.7 que salió hace muy poquito. Descarga de aqui
Instalación
Requisitos
- MySQL o PostgreSQL.
- Un compilador de c++.
- Un sistema operativo de estos: Linux 2.4.x, 2.6.x,Windows 2000, XP,FreeBSD 4.x, 5.x, 6.x,NetBSD 1.6
- Herramienta estilo make
En esta guía se va a usar un MySQL 4.1 y la familia de compiladores gnu, sobre una Debian GNU/Linux 2.6.8.
Compilación
Se desempaqueta el tarball:
$ tar xvzf sphinx-0.9.7-rc2.tar.gz
$ cd sphinx-0.9.7-rc2
Se compila:
$ ./configure --prefix = /ruta-de-instalacion \
--with-mysql-includes=/usr/include/mysql/ \
--with-mysql-libs=/usr/lib
$ make
$ make install
La ruta de las librerias e includes de mysql diferirá según la forma en la que se haya instalado. El caso arriba expuesto es para un mysql-4.1 instalado como paquete debian.
Configuración
Una vez completada la instalación en la ruta elegida se tienen tres directorios:
- bin: contiene los tres binarios.
- etc : dónde están los ficheros de configuración
- var: aquí están los logs y los índices
Fichero sphinx.conf
Hacemos una copia del fichero que viene como esqueleto de configuración:
$ cp etc/sphinx.conf.dist etc/sphinx.conf
Si vemos este fichero nos daremos cuenta de que tenemos cuatro elementos en él: index, source, indexer y searchd. A continuación se van a explicar las directivas simples que hacen que podamos realizar un primer buscador plenamente funcional. El resto se dejan para quien quiera juguetear un poco más.
indexer
- mem_limit: limite de memoria impuesto al binario que realiza la indización. Tocarlo con cuidado
searchd
- port: puerto en el que estará escuchando el demonio
- log: para los mensajes de actividad del demonio (start,stop..)
- query_log: para las queries que se lanzan al demonio
- pid_file: para guardar el pid del demonio
Los otros dos elementos son los que definen los índices que se quieren crear. El source representa una fuente de datos
source
- sql_host: nombre de la máquina donde se encuentra mysql
- sql_user: usuario de acceso a la base de datos
- sql_pass: contraseña de acceso para el usuario indicado antes
- sql_db: nombre de la base de datos
- sql_port: puerto de mysql (generalmente es 3306)
- sql_query: query de recogida de datos
La directiva sql_query funciona prácticamente como una query SQL normal y corriente con ciertas peculariedades: el primer campo de la sentencia SELECT debe ser la clave primaria (y ojo, esta debe ser un entero único de 32 bits por narices) y a continuación se ponen los campos (de texto) que queremos que se indexen.
Ejemplo de SQL serían:
-
SELECT id,campo_texto1,campo_texto2 FROM tabla;
-
SELECT id,campo_texto1,campo_texto2 FROM tabla WHERE int1=1;
-
SELECT id,campo_texto1,campo_texto2 FROM tabla WHERE int=1 AND fecha < NOW();
No hay problema alguno por usar WHERE ni funciones.
index
- source: nombre del elemento fuente asociado
- path: ruta al fichero índice (tipicamente bajo directorio var/data)
- morphology: tipo de stemming (none, stem_es,stem_ru)
- stopwords: ruta a la lista de palabras vacías
- min_word_len: número de caracteres mínimos de una palabra para ser indizada
El stemming es el proceso por el cual se reduce una palabra a su lexema. De esta manera se consigue que todas las búsquedas que tienen la misma raíz devuelvan el mismo resultado. Es una técnica dependiente de idioma en que esté el contenido a transformar, de manera que se debe estudiar la localización de nuestra información para asociarle un stemmer u otro (o ninguno) . Vienen implementados uno para inglés y otro para ruso.
A continuación un ejemplo completo de configuración.
Marzo 29th, 2007 at 22:31 pm
Hola!
Muy buena la explicación! Viendo la web de sphinx veo que existe Sphinx SE, donde explica como compilar mysql con el parche de sphinx. ¿Qué ventajas aporta este sistema frente el que has explicado? ¿Más rápido? ¿Más features?
Saludos!
Marzo 30th, 2007 at 11:45 am
Hola Ceska,
El sistema SPHINX SE es otra manera diferente de mantener los índices. Se introduce un nuevo motor de almacenamiento para MySQL ( el tipo de tabla SPHINX ), de manera que el índice es guardado ahí.
La ventaja principal de este método es que no dependes de una API sino que solo consultas la base de datos. Los lenguages soportados cada vez son más (php oficial y creo que perl, ruby y phyton contribuidas ) pero el SQL es estándar.
No conozco el rendimiento de este sistema puesto que requiere mysql 5 y no estaba de momento dispuesto a dar ese paso (no sin al menos haber estudiado un poco el tema).
Puede que haga alguna prueba instalando mysql 5 para comprobar un poco como va, pero como de momento sigo con PHP como lenguaje, no creo que me aporte mucho. De hecho prefiero quitar la carga de consulta del índice a la base de datos ya que sería 1 consulta menos por cada búsqueda.
Un saludo
Abril 2nd, 2007 at 20:04 pm
Hola!
Gracias por tu rápida respuesta. Estoy de acuerdo contigo con lo de quitar carga de consulta a la bbdd, pero por lo que me ha parecido ver con Sphinx SE el índice se auto genera al haber una modificación en la bbdd (INSERT/UPDATE/DELETE), sin embargo de la otra forma, deberías regenerarlo manualmente, no?
Estoy intentando probar ambos métodos. Por ahora tengo compilado el MySQL con el search engine incorporado y ahora tengo que compilar el Sphinx. A ver si saco algo en claro y podemos dar más datos!!
Agosto 31st, 2007 at 10:54 am
Hola!
antes de nada enhorabuena por tu tutorial. Yo estoy usando nutch y Lucene, pero creo que Sphinx trabaja mejor para feeds. La historia es que con Nutch se integra el crawler y se genera una base de datos, pero no en mysql, sinó formato data (archivos). En este tutorial se parte de que la bd ya está creada. Mi pregunta es: ¿qué usais para crear la base de datos, es decir, como rastreais la web, cómo se genera esa bd y qué estructura tiene? ¿són solo enlaces?
Muchas gracias.
Septiembre 3rd, 2007 at 19:09 pm
Hasta donde yo se, nutch es un crawler/indexer/searcher muy ligado al proyecto Lucene. No tiene demasiado sentido usar el crawler de nutch con el indexer/searcher de sphinx a no ser que quieras conservar los dos sistemas en paralelo.
La idea de Sphinx parte de cuando uno dispone de la información en una base de datos (mysql o posgresql). Si quieres usar sphinx para indexar rss, escribe un simple crawler tu mismo con un poquito de php o perl.
Puedes encontrar un poco de ayuda con librerias de para construcción de robots.
Un saludo
Septiembre 5th, 2007 at 11:35 am
Muchas gracias por tu respuesta. Me tocará construir el crawler con estas librerías. De todos modos, ¿conoces o sabes de algún proyecto que use algún crawler que inserte en una bd mysql?
Noviembre 18th, 2007 at 5:55 am
Hola,
¿Es posible instalar el software sin el compilador? Resulta que tengo bloqueados los Ssh de mi hosting.
Espero alguna respuesta.
Diciembre 29th, 2007 at 21:34 pm
97874
Diciembre 29th, 2007 at 21:50 pm
mi comentario es q todos creen lo que yo estoy creando.Y PUES QYE NO LO HAGAN POR GUSTO