¿Qué es mejor Like o FullText?

 

Todo el mundo conoce las búsquedas Like y la gran variedad y juego que nos brindan pudiendo escoger si la búsqueda se hace sobre el texto completo o si tiene en cuenta si la palabra comienza o acaba por el término buscado. Pero el problema se presenta todavía más grabe cuando nuestra aplicación ya dispone de un número elevado de registros, digamos más de 500, entonces los resultados devueltos por el buscador pueden ser muy elevados y totalmente irrelevantes.

Para combatir este problema en MySQL se crearon un tipo de índices llamados FullText, estos índices nos permiten hacer búsquedas mucho más afinadas que las prestadas por Like, ya que ellos mismos devuelven un valor en forma de porcentaje indicándonos el grado de semejanza que tiene el término buscado con los registros encontrados en la base de datos.

Un ejemplo práctico:

Imaginemos que tenemos la siguiente estructura:

CREATE TABLE `coches` (
idprod INT(11) NOT NULL AUTO_INCREMENT,
nombre VARCHAR(120),
descripcion VARCHAR(255),
PRIMARY KEY (idprod),
UNIQUE KEY idprod (idprod),
);

Si un usuario hace una búsqueda en nuestra base de datos por ejemplo con la palabra "Audi", la función le devolvería los siguientes resultados:

SQL="Select idprod, nombre From coches Where nombre Like '%Audi%';"

**********************************************
idprod | nombre
**********************************************
1 | Audi A3 TDI
2 | Audi A3 TDI

3 | Audi 100 CV
4 | Equipo de Audio 100Wats
5 | Los coches cada vez tienen más audiencia
**********************************************

Como se puede observar, la consulta no es todo lo exacta que deseamos ya que está devolviendo registros que no tienen nada que ver con la consulta original del usuario. Y no nos paremos a pensar si el usuario pone en su búsqueda "Audi barato", nos llegaría a mostrar coches con la palabra "barato" en su nombre aunque no fuesen de la casa Audi.

FullText es la solución

Desde la versión 3.23.23 de MySQL existe un tipo de índice llamado FullText, para poder implementarlo primero deberemos de añadirlo a nuestra tabla, hay que tener en cuenta que este tipo de índices tan solo se pueden utilizar en tablas MyIsam, crearemos el índice de la siguiente manera:

ALTER TABLE coches ADD FULLTEXT (nombre, descripcion);

Ahora llega el momento de realizar la consulta que extraerá los registros de la tabla:

SQL="Select nombre, descripcion From coches Where Match(nombre, descripcion) AGAINST ('criterio');"

Esta consulta nos devolverá exactamente lo que queremos ver, realmente no sé que criterios obedece este tipo de índice para extraer los coincidencias más exactas, pero el caso es que funciona y muy bien.
De igual manera, este tipo de búsqueda tiene unas características peculiares:

  1. Límite del 50%
    Esto significa que si la consulta realizada nos devuelve más del 50% de los registros disponibles en la tabla, esta no se mostrará, evitando así enseñar al usuario un millar de coincidencias que no tendrían ninguna relevancia.
  2. Palabras con menos de 3 caracteres
    El uso de este tipo de búsqueda es tan solo para palabras que contengan más de 3 caracteres, por lo tanto el resto (como de, el, la, etc) serán omitidas de manera automática.
  3. Case-Insensitive
    O lo que es lo mismo, no distingue entre mayúsculas y minúsculas, así si el usuario busca "coche", "Coche" o "cocHe" siempre devolverá los mismos resultados.

Esperamos que podáis aplicar este tipo de búsquedas en vuestros proyectos, para que hagáis alguna prueba, el foro de nuestra Web está programado con esta técnica. Puedes verlo aquí: http://hosting.solingest.com/foro-hosting.asp