Volver a la página principal
lunes 18 noviembre 2024
20

Cómo usar TEXT SEARCH en MySQL para búsquedas de texto

El Full-Text Search (búsqueda de texto completo) en MySQL es una funcionalidad que permite realizar búsquedas avanzadas y rápidas dentro de columnas de texto. Es útil para construir sistemas de búsqueda como los que se utilizan en blogs, sitios de noticias y aplicaciones con grandes volúmenes de texto.

El Full-Text Search de MySQL permite buscar palabras o frases dentro de columnas de texto mediante índices especiales llamados índices FULLTEXT. Esto mejora significativamente el rendimiento de las consultas en comparación con búsquedas convencionales con operadores como LIKE.

Bases de datos compatibles

  • Disponible en los motores de almacenamiento InnoDB y MyISAM.
  • Solo funciona en columnas de tipo CHAR, VARCHAR o TEXT.

Crear un índice FULLTEXT

Antes de realizar una búsqueda de texto, es necesario crear un índice FULLTEXT en las columnas que deseas buscar.

Ejemplo básico

Supongamos que tienes una tabla articulos:

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

Para habilitar la búsqueda, agrega un índice FULLTEXT:

ALTER TABLE articulos ADD FULLTEXT (titulo, contenido);

Realizar búsquedas con MATCH...AGAINST

La búsqueda se realiza usando la función MATCH(columnas) AGAINST('consulta').

Ejemplo básico

Buscar artículos que contengan la palabra "MySQL":

SELECT * 
FROM articulos
WHERE MATCH(titulo, contenido) AGAINST('MySQL');

Modos de búsqueda

MySQL admite varios modos de búsqueda de texto:

Modo Descripción
IN NATURAL LANGUAGE MODE Realiza una búsqueda en lenguaje natural (por defecto).
IN BOOLEAN MODE Permite usar operadores booleanos como +, -, , etc., para búsquedas más específicas.
WITH QUERY EXPANSION Amplía los términos de búsqueda para incluir palabras relacionadas.

Ejemplo con modo booleano

Buscar artículos que contengan "MySQL" pero no "PostgreSQL":

SELECT * 
FROM articulos
WHERE MATCH(titulo, contenido) AGAINST('+MySQL -PostgreSQL' IN BOOLEAN MODE);

Ordenar por relevancia

La función MATCH...AGAINST devuelve una puntuación de relevancia. Puedes usarla para ordenar los resultados:

SELECT *, MATCH(titulo, contenido) AGAINST('MySQL') AS relevancia
FROM articulos
WHERE MATCH(titulo, contenido) AGAINST('MySQL')
ORDER BY relevancia DESC;

1. Rendimiento mejorado: Es mucho más rápido que usar LIKE en búsquedas de texto.

2. Búsquedas complejas: Admite operadores como +, -, y comodines (*).

3. Relevancia: Proporciona un sistema integrado para ordenar resultados según su importancia.

Limitaciones y consideraciones

1. Tamaño mínimo de las palabras: Por defecto, MySQL ignora palabras con menos de 4 caracteres. Esto se puede ajustar configurando el parámetro ft_min_word_len.

2. Palabras comunes: Palabras frecuentes como "the" o "and" pueden ser ignoradas por el índice FULLTEXT.

3. Soporte para múltiples idiomas: Para realizar búsquedas en otros idiomas, debes configurar diccionarios específicos o ajustar el "stopword list".

4. No es case-sensitive: La búsqueda no distingue entre mayúsculas y minúsculas.

Ejemplo práctico

Crear una tabla con datos

CREATE TABLE productos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(255),
    descripcion TEXT
);

INSERT INTO productos (nombre, descripcion) VALUES
('Laptop', 'Una computadora portátil con 16GB de RAM y SSD'),
('Teléfono', 'Un teléfono inteligente con cámara de alta resolución'),
('Tablet', 'Un dispositivo ideal para leer y navegar en la web');

Crear un índice FULLTEXT

ALTER TABLE productos ADD FULLTEXT(nombre, descripcion);

Buscar productos

1. Buscar productos que contengan la palabra "portátil":

SELECT * 
   FROM productos
   WHERE MATCH(nombre, descripcion) AGAINST('portátil');

2. Ordenar por relevancia:

SELECT *, MATCH(nombre, descripcion) AGAINST('teléfono') AS relevancia
   FROM productos
   WHERE MATCH(nombre, descripcion) AGAINST('teléfono')
   ORDER BY relevancia DESC;

Referencias oficiales

Consulta la documentación oficial de MySQL sobre Full-Text Search para más información y casos avanzados.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer