MySQL, a partir de su versión 3.23.23 permite realizar búsquedas dentro de un campo a partir de una cadena de caracteres con la sentencia "FULL-TEXT".
El método de búsqueda sencillo dentro de una tabla es utilizar LIKE:
SELECT texto FROM articulos WHERE texto LIKE '%$palabra%'
El problema aparece cuando en vez de una sola palabra són varias las que hay que buscar:
Si "$palabra" equivale, por ejemplo, a "HTML PHP", una frase dentro de los textos almacenados que sea "HTML y PHP" no estará entre los resultados debido a que contiene una "y" entre las dos palabras buscadas.
Peró si usamos "Full-text" MySQL se encargará de comparar la cadena que le pasemos con los contenidos de la tabla y devolvera los resultados aproximados.
Limitaciones de "Full-text":
No devuelve resultados si la palabra aparece demasiadas veces en los registros.
Si más del 50% de los registros contienen la palabra buscada no devolverá resultados. Esto es debido a que esta función está pensada para tablas con muchos registros y no tendría sentido devolverlos todos, ya que no seria práctico que en una tabla de 10.000 registros con el 50% de los textos conteniendo la palabra buscada se nos devolviera un resultado de 5.000 registros.
Por esta razón la consulta omitirá palabras demasiado comunes, como preposiciones y artículos (de, con, a, el)...
Requisitos 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.
Lo primero 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
ALTER TABLE articulos ADD FULLTEXT(texto);
Si lo hemos realizado correctamente, MySQL nos devolverá el OK.
Para las consultas 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')
Con lo que le indicamos al MySQL seleccionar los campos "titulo" y "texto" de "artículos", filtrando donde haya coincidencias en el campo "texto" para la variable "$palabras".
MySQL puede devolver wl Score que biene a ser un número que indica el valor de coincidencia en cada registro. Su valor puede ir desde casi cero hasta más de cuatro. Es útil para ordenar los resultados por orden de coincidencia.
La consulta sería:
SELECT titulo,texto, MATCH(texto) AGAINST('$palabras') AS coincidencia
FROM articulos
WHERE MATCH(texto) AGAINST ('$palabras')
ORDER BY coincidencia DESC