MySQL: Full Text Search

30.abr 2008 Envía un trackback

Cuando pretendes programar una especie de buscador para integrar en una web y te pones a leer las múltiples y distintas formas de hacerlo te das cuenta de que LIKE no es la solución. Y menos aún habiendo funciones Full Text Search.

El supuesto es sencillo, un par de campos determinantes en la búsqueda para que los resultados sean adecuados. Por ejemplo los campos título y contenido de una tabla noticias. El típico:


SELECT *
FROM noticias
WHERE titulo LIKE '%$palabra%'
OR contenido LIKE '%$palabra%';
 
Para evitar este tipo de estropicios lo primero que debemos hacer es crear el índice fulltext search. Ojo, que va a ser un índice múltiple en el que no pueden haber campos del tipo BLOB.
La diferencia entre un BLOB y un TEXT es que el primero es case sensitive (distingue entre mayúsculas y minúsculas) y el segundo no. Podemos cambiar el "collation" utf8_bin por un utf8_general_ci para arreglar este inconveniente.
Generamos el índice de los campos que nos interesan, título y contenido en este caso de la siguiente forma:
ALTER TABLE noticias ADD FULLTEXT(titulo, contenido);
 
Y lo único que hemos de cambiar es la query de búsqueda, que pasará a ser algo tal que así:
SELECT *
FROM noticias
WHERE MATCH(titulo, contenido) AGAINST ('$palabra');
 
Así de simple, y si además queremos usar operadores booleanos -ni más ni menos que como Google- tan solo hemos de agregar un IN BOOLEAN MODE a la consulta:
SELECT *
FROM noticias
WHERE MATCH(titulo, contenido) AGAINST ('+limon -pera', IN BOOLEAN MODE);
 
Y podremos usar operadores como +, -, *, mayor y menor... (lista de operadores).

Un tip muy sencillo de implementar que aumentará el rendimiento de las búsquedas en nuestro sitio.
full text search

Comentarios
Gravatar lonnrot@06.05.2008, 'Re: MySQL: Full Text Search'

Las búsquedas con índices full text search son muy rápidas y efectivas pero no siempre devuelven los resultados correctos si se trata sólo de buscar una palabra. Para búsquedas de una sola palabar es mejor usar like.
Una manera cómoda de usar una opción u otra es hacer:
$cadena_a_buscar='Lorem ipsum';
$numero_de_palabras=str_word_count($cadena_a_buscar);
if ($numero_de_palabras>1) //usar full text search
else //usar like


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]