Tema SQL
MATCH() … AGAINST() (MySQL / MariaDB)
Búsqueda full-text sobre columnas indexadas con FULLTEXT (InnoDB/MyISAM). Sintaxis distinta a to_tsvector de PostgreSQL; requiere índice FULLTEXT y modo booleano o natural language.
Descripción
MATCH(col1, col2) AGAINST( texto_busqueda IN BOOLEAN MODE o IN NATURAL LANGUAGE MODE) evalúa relevancia y filtra filas. En modo booleano puedes usar +palabra, -excluir, *prefijo. El índice FULLTEXT debe cubrir las mismas columnas que MATCH. stopword y longitud mínima de palabra afectan resultados (ft_min_word_len, etc.). No sustituye a LIKE en prefijos cortos sin índice adecuado. En PostgreSQL el modelo es tsvector/tsquery; en SQL Server CONTAINS.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
MATCH (columnas_fulltext) AGAINST (consulta [modo])
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Índice
- CREATE FULLTEXT INDEX o FULLTEXT KEY en las columnas correctas.
- Modos
- NATURAL LANGUAGE frente a BOOLEAN para sintaxis de operadores.
- PostgreSQL
- to_tsvector / to_tsquery y GIN; otra semántica.
Ejemplos
Ejemplo 1
SELECT id, titulo, MATCH(titulo, cuerpo) AGAINST('mysql fulltext' IN NATURAL LANGUAGE MODE) AS rel
FROM articulos
WHERE MATCH(titulo, cuerpo) AGAINST('mysql fulltext' IN NATURAL LANGUAGE MODE)
ORDER BY rel DESC;
Ejemplo 2
SELECT id FROM articulos
WHERE MATCH(titulo) AGAINST('+mysql -oracle' IN BOOLEAN MODE);
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.