Volver a la página principal
sábado 21 septiembre 2024
52

Uso de MATCH() y AGAINST() para búsquedas de texto completo en MySQL

Las bases de datos relacionales, como MySQL, ofrecen potentes mecanismos para realizar búsquedas de texto completo, permitiendo la indexación y consulta eficiente de grandes volúmenes de datos textuales. Dos de las funciones clave para llevar a cabo estas búsquedas son MATCH() y AGAINST(), que permiten encontrar términos relevantes en grandes colecciones de texto con precisión y velocidad. A lo largo de este artículo, exploraremos cómo funcionan estas funciones, sus principales ventajas y cómo utilizarlas de manera eficiente en tus proyectos MySQL.

¿Qué son MATCH() y AGAINST() en MySQL?

MySQL proporciona el soporte de búsqueda de texto completo (Full-Text Search, FTS) a través de índices de texto completo y las funciones MATCH() y AGAINST(). A diferencia de las consultas basadas en comparaciones simples con operadores como LIKE, las búsquedas de texto completo permiten realizar búsquedas más sofisticadas y con mejor rendimiento, especialmente en tablas con grandes volúmenes de datos textuales.

  • MATCH(): Especifica las columnas donde se realizará la búsqueda.
  • AGAINST(): Define los términos de búsqueda y las opciones de búsqueda.

Tipos de búsquedas de texto completo

En MySQL, existen dos tipos principales de búsquedas de texto completo:

1. Búsqueda en modo natural (natural language mode): Esta búsqueda trata de encontrar documentos relevantes para la consulta sin usar operadores booleanos explícitos.

2. Búsqueda en modo booleano (boolean mode): Permite a los usuarios incluir operadores booleanos para controlar la forma en que MySQL debe manejar los términos de búsqueda.

Crear índices de texto completo

Para utilizar MATCH() y AGAINST(), primero necesitas crear un índice de texto completo en la columna o columnas donde deseas realizar la búsqueda. Un índice de texto completo solo es compatible con columnas de tipo CHAR, VARCHAR o TEXT.

Aquí un ejemplo de cómo crear una tabla con un índice de texto completo:

CREATE TABLE articulos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  titulo VARCHAR(255),
  contenido TEXT,
  FULLTEXT (titulo, contenido)
);

El índice de texto completo se ha creado en las columnas titulo y contenido. Esto permitirá realizar búsquedas eficientes utilizando las funciones MATCH() y AGAINST().

Uso de MATCH() y AGAINST()

Una vez que tengas un índice de texto completo, puedes empezar a realizar búsquedas de texto utilizando MATCH() y AGAINST(). A continuación, veremos ejemplos de cómo aplicar estas funciones en los distintos modos de búsqueda.

Búsqueda en modo natural

En este modo, MySQL evalúa la relevancia de cada documento en función de la frecuencia de las palabras en el texto. A continuación, un ejemplo de una consulta en modo natural:

SELECT titulo, contenido
FROM articulos
WHERE MATCH(titulo, contenido) AGAINST('búsqueda de texto completo');

En esta consulta, MATCH(titulo, contenido) especifica las columnas en las que se buscarán los términos, mientras que AGAINST('búsqueda de texto completo') indica los términos de búsqueda.

Búsqueda en modo booleano

El modo booleano te permite controlar más la búsqueda a través de operadores especiales, como + (para indicar que un término es obligatorio) o - (para excluir un término). Este es un ejemplo:

SELECT titulo, contenido
FROM articulos
WHERE MATCH(titulo, contenido) AGAINST('+texto -incompleto' IN BOOLEAN MODE);

Aquí, +texto indica que la palabra "texto" debe estar presente, mientras que -incompleto indica que los resultados que contengan la palabra "incompleto" serán excluidos.

Ordenar por relevancia

Cuando realizas una búsqueda de texto completo, MySQL asigna un valor de relevancia a cada fila en función de la cantidad de coincidencias y otros factores. Puedes ordenar los resultados de acuerdo con este valor de relevancia utilizando la función MATCH() en la cláusula SELECT:

SELECT titulo, contenido, MATCH(titulo, contenido) AGAINST('texto completo') AS relevancia
FROM articulos
ORDER BY relevancia DESC;

En este caso, los resultados se ordenarán de acuerdo con su relevancia, mostrando primero los que más coincidan con los términos de búsqueda.

Ventajas de usar MATCH() y AGAINST()

El uso de MATCH() y AGAINST() presenta diversas ventajas sobre otras formas de realizar búsquedas en MySQL, como el uso de LIKE:

1. Mayor eficiencia: Las búsquedas de texto completo son más rápidas y escalables, especialmente en grandes cantidades de texto. Esto es gracias a los índices de texto completo.

2. Relevancia de los resultados: A diferencia de LIKE, que solo busca coincidencias exactas, las búsquedas de texto completo evalúan la relevancia de cada documento, ofreciendo resultados más útiles.

3. Búsquedas más flexibles: El uso del modo booleano permite realizar búsquedas complejas utilizando operadores lógicos.

Limitaciones de las búsquedas de texto completo en MySQL

Aunque las búsquedas de texto completo en MySQL son potentes, existen algunas limitaciones que debes tener en cuenta:

1. Tipo de tablas: Los índices de texto completo en MySQL solo están disponibles en las tablas que utilizan el motor de almacenamiento InnoDB o MyISAM. A partir de MySQL 5.6, InnoDB soporta índices de texto completo, que anteriormente solo estaban disponibles en MyISAM.

2. Palabras comunes y de longitud mínima: Por defecto, MySQL omite palabras muy comunes, como "el" o "la", y palabras que tienen menos de cuatro caracteres. Esto puede ser ajustado en la configuración del servidor, pero es algo a tener en cuenta.

3. Búsquedas sensibles a mayúsculas: A diferencia de otras bases de datos que ignoran las mayúsculas y minúsculas en las búsquedas de texto completo, MySQL es sensible a estas diferencias a menos que la configuración del collation esté ajustada adecuadamente.

Configuración avanzada de búsquedas de texto completo

MySQL permite configurar diversos aspectos de las búsquedas de texto completo para adaptarlas a las necesidades específicas de tu aplicación. Algunos de los parámetros más comunes incluyen:

  • ft_min_word_len: Define la longitud mínima de las palabras que se indexan. El valor por defecto es 4, pero puedes ajustarlo según tus necesidades.
  • ft_stopword_file: Permite definir un archivo personalizado de palabras comunes que serán ignoradas en las búsquedas. Si quieres desactivar el filtro de palabras comunes, puedes establecer este valor como vacío.

Cambiar la longitud mínima de palabras indexadas

Si deseas ajustar la longitud mínima de las palabras que se pueden indexar, puedes modificar el parámetro ft_min_word_len. Por ejemplo, para reducirlo a 3 caracteres:

SET GLOBAL ft_min_word_len = 3;

Ten en cuenta que, después de realizar este cambio, será necesario reconstruir los índices de texto completo para que el cambio surta efecto.

Conclusión

Las funciones MATCH() y AGAINST() en MySQL ofrecen un enfoque potente y eficiente para realizar búsquedas de texto completo en grandes conjuntos de datos. Al aprovechar los índices de texto completo y los modos de búsqueda natural y booleano, puedes construir aplicaciones que ofrezcan resultados de búsqueda rápidos y relevantes. Aunque existen algunas limitaciones, como el soporte limitado a ciertos motores de almacenamiento y la longitud mínima de las palabras, estas funciones siguen siendo una herramienta invaluable para cualquier desarrollador que trabaje con bases de datos textuales en MySQL.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer