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
¿Cómo
se aplica todo esto a UD/DWMX?
Bueno, sólo tenemos que aplicarlo al crear un recordset.
He aquí una imagen de cómo queda la consulta (suponiendo
que el formulario utilice el método "post"):
Y dentro del panel de Data Bindings nos aparecerán los tres
campos: "texto", "titulo" y "coincide".
En un
próximo tutorial, cuando MySQL 4 sea ya más popular,
veremos cómo ésta nueva versión permite además
la ejecución de consultas booleanas.
|