Busquedas con LIKE
Es muy común, sobre todo en aplicaciones web que funcionen contra una base de datos, realizar una función de búsqueda de texto. Lo primero que se nos puede pasar por la cabeza para implementarlo es utilizar el operador LIKE de SQL. Por ejemplo si tenemos una tabla articulos con una columna titulo y otra columna contenido podríamos hacer lo siguiente:
SELECT * FROM articulos WHERE titulo LIKE '%palabra%' OR contenido LIKE '%palabra%'
Pero esta aproximación tiene inconvenientes además de un rendimiento pésimo. El principal inconveniente es que el motor de bases de datos tiene que hacer un escaneo completo de la base de datos, fila por fila, buscando las subcadenas. La búsqueda de subcadenas ya es de por sí un proceso pobre en rendimiento y el escaneo completo de la tabla hace absolutamente inviable utilizar esta técnica con un conjunto de datos no trivial.
Por otro lado construir la consulta puede resultar bastante tedioso si queremos buscar diferentes términos en diferentes columnas. Y por último otro inconveniente muy importante es que no es sencillo ordenar los resultados por relevancia; esto es, obtener las filas ordenadas según el número de ocurrencias de los términos. Es más relevante un resultado que contenga cinco veces un término que estamos buscando, que un resultado que sólo contenga el término dos veces.
Búsquedas con FULL TEXT
Para realizar búsquedas de texto eficientes MySQL cuenta con un tipo de índice especial: el índice
FULLTEXT. La sintaxis para crear un índice FULLTEXT en una tabla existente es la siguiente:
ALTER TABLE articulos ADD FULLTEXT(titulo, contenido);
Una vez que creamos el índice, MySQL llevará cuenta de los términos incluidos en las columnas indicadas y podremos hacer búsquedas de forma rápida y con los resultados ordenados por relevancia.
Hay que tener en cuenta que las columnas deben ser de tipo CHAR, VARCHAR o TEXT.
Operadores MATCH AGAINST
Para utilizar un índice FULLTEXT usaremos los operadores MATCH ... AGAINST. Por ejemplo:
SELECT * FROM articulos
WHERE MATCH(titulo, contenido) AGAINST ('terminos de busqueda') LIMIT 0,10
Los resultados de la busqueda se ordenaran por relevancia automáticamente