Índices FULLTEXT en MySQL: Qué son y cómo usarlos
Cuando trabajamos con bases de datos y necesitamos realizar búsquedas de texto eficientes (como en buscadores o filtros inteligentes), los índices FULLTEXT de MySQL son una herramienta poderosa que permite encontrar coincidencias por relevancia, más allá de un simple LIKE. Veamos los Índices FULLTEXT en MySql.
¿Qué es un índice FULLTEXT?
Un índice FULLTEXT permite hacer búsquedas de texto completas (full-text search) en campos como VARCHAR, TEXT o CHAR. Este tipo de índice analiza el contenido de los campos y permite buscar palabras o frases considerando relevancia, palabras clave, y opciones como búsqueda natural o booleana.
Requisitos
- Tipo de motor: InnoDB (MySQL ≥ 5.6) o MyISAM
- Campos válidos: CHAR, VARCHAR, TEXT
- Los índices se pueden aplicar a uno o varios campos combinados.
Cómo crear un índice FULLTEXT
Crear la tabla:
CREATE TABLE articulos (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(255),
contenido TEXT,
FULLTEXT(titulo, contenido)
);
Agregar a una tabla existente:
ALTER TABLE articulos ADD FULLTEXT(titulo, contenido);
Cómo buscar usando FULLTEXT
Veamos un ejemplo sencillo
SELECT * FROM articulos
WHERE MATCH(titulo, contenido) AGAINST ('texto buscar');
Esto devuelve las filas donde titulo o contenido contienen palabras relacionadas con mysql o índices, ordenadas por relevancia (por defecto).
Modos de búsqueda
NATURAL LANGUAGE MODE (modo por defecto)
AGAINST ('texto buscar')
BOOLEAN MODE
AGAINST ('+texto -buscar' IN BOOLEAN MODE)
Con opciones como:
+palabra: obligatoria
-palabra: excluida
*: comodín al final de una palabra
«: frase exacta
Relevancia y orden
Cuando haces MATCH(…) AGAINST(…), MySQL devuelve un valor numérico indicando qué tan relevante es la coincidencia.
Puedes usarlo para ordenar resultados:
SELECT *, MATCH(titulo, contenido) AGAINST('mysql') AS relevancia
FROM articulos
WHERE MATCH(titulo, contenido) AGAINST('mysql')
ORDER BY relevancia DESC;
Limitaciones
Porque las tiene:
- Las palabras muy comunes (stopwords) no se indexan.
- Las palabras muy cortas (menos de 4 caracteres por defecto) no se consideran.
- No funciona con caracteres especiales ni acentos si no está configurado adecuadamente.
- El idioma de la búsqueda afecta los resultados (puede personalizarse).
Ejemplo sencillo
Aquí tenéis un pequeño ejemplo sencillo
CREATE TABLE productos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
descripcion TEXT,
FULLTEXT(nombre, descripcion)
);
INSERT INTO productos (nombre, descripcion) VALUES
('Camiseta roja', 'Camiseta de algodón color rojo brillante'),
('Pantalón vaquero', 'Vaquero azul de corte clásico'),
('Zapatillas deportivas', 'Zapatillas para correr y hacer deporte');
SELECT *, MATCH(nombre, descripcion) AGAINST('camiseta roja') AS relevancia
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('camiseta roja')
ORDER BY relevancia DESC;
Espero que os sea de utilidad el artículo
Más información