MySQL: Full Text Search

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.

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.