Busquedas con Full-text y MySQL (WebTaller)
Fuente: WebTaller
MySQL posee la funcionalidad Full-text, que permite búsquedas más racionales dentro de una base de datos. Este tutorial te enseñará qué necesitas, qué tienes que modificar en tu Base de Datos y cómo ejecutar la consulta para poder crear en tu web un sencillo motor de búsqueda (y mucho más eficaz que usando LIKE).
Una (casi) desconocida de las funcionalidades de MySQL, a partir de su versión 3.23.23 es "Full-text" , que permite realizar búsquedas dentro de un campo a partir de una cadena de caracteres.
Habitualmente, un método de búsqueda sencillo dentro de una tabla pasaba por utilizar LIKE:
SELECT texto FROM articulos WHERE texto LIKE '%$palabra%'
El problema aparecía cuando en vez de una sola palabra eran varias las que había que buscar: Si "$palabra" equivalía, por ejemplo, a "dreamweaver ultradev", una frase dentro de los textos almacenados que fuera "dreamweaver y ultradev" no devolvería resultados (por culpa de la "y").
Para esto sirve Full-text: MySQL se encargará de comparar la cadena que le pasemos con los contenidos de la BD y devolver resultados aproximados. Suena bonito, pero tiene algunas limitaciones (justificadas):
No devolverá resultados si la palabra aparece demasiadas veces en los registros: si todos nuestros registros (o más del 50%, para ser más exactos) tienen la palabra "dreamweaver", no devolverá resultados.¿Por qué?. esta función está pensada para tablas con muchos registros y no tendría sentido devolverlos todos: ¿es interesante devolver 5.000 resultados a una búsqueda?.
Por la razón anterior, la consulta omitirá palabras demasiado comunes, como preposiciones y artículos (de, con, a, el)...
¿Qué necesitamos para utilizar Full-text?
Lo primero, que MySQL sea de una versión superior a la 3.23.23.
Que el campo de la tabla en que vamos a buscar sea del tipo TEXT
Con estos 2 requisitos, lo primero que necesitaremos será indicarle a MySQL que queremos modificar el campo para que acepte esta función. En nuestro ejemplo vamos a utilizar una sencilla tabla, llamada "artículos", que tiene estos campos.
id_articulo
titulo
texto
Podemos utilizar cualquiera de los IDE's disponibles para MySQL (MySQLFront ó PHPMyAdmin son válidos), para pasarle a la BD esta sentencia SQL:
ALTER TABLE articulos ADD FULLTEXT(texto);
Si lo hemos realizado correctamente, MySQL nos devolverá el OK.
Con la tabla preparada, llega la hora de aprender cómo se pasan las consultas, ya que no basta con SELECT: deberemos utilizar además MATCH(campo) AGAINST(cadena). En nuestro ejemplo:
SELECT titulo,texto FROM articulos WHERE MATCH(texto) AGAINST ('$palabras')
Traducido: seleccionar los campos "titulo" y "texto" de "artículos", filtrando donde haya coincidencias en el campo "texto" para la variable "$palabras".
¿No parece difícil, no?, pues aún hay más: MySQL nos puede devolver un número que indica el valor de coincidencia en cada registro (llamado habitualmente "SCORE" en muchos sitios). No es un valor en porcentaje, y puede varíar desde casi 0 (cero) hasta más de 4 según los cálculos realizados por MySQL). Es útil para ordenar los resultados por orden de coincidencia. Utilizarlo es un poco más complicado, pero no mucho: sólo tendremos que utilizar 2 veces MATCH... AGAINST. La consulta sería:
SELECT titulo,texto, MATCH(texto) AGAINST('$palabras') AS coincidencia
FROM articulos
WHERE MATCH(texto) AGAINST ('$palabras')
ORDER BY coincidencia DESC

















Comentarios recientes
hace 23 semanas 4 días
hace 34 semanas 2 días
hace 3 años 44 semanas
hace 3 años 43 semanas
hace 3 años 43 semanas
hace 3 años 37 semanas