Búsqueda booleana
El modo booleano de búsqueda full-text permite usar operadores para controlar exactamente qué palabras deben aparecer, cuáles no, y buscar frases exactas. A diferencia del modo de lenguaje natural, no aplica la regla del 50%, no ordena por relevancia automáticamente y puede funcionar sin un índice FULLTEXT aunque será mucho más lento.
Sintaxis
SELECT * FROM tabla
WHERE MATCH(columna) AGAINST('búsqueda con operadores' IN BOOLEAN MODE);Preparación
CREATE FULLTEXT INDEX ft_productos ON productos (nombre, descripcion);
CREATE FULLTEXT INDEX ft_resenas ON resenas (comentario);Operadores booleanos
| Operador | Significado | Ejemplo |
|---|---|---|
| + | Obligatorio | +smartphone |
| - | Excluir | -Apple |
| sin operador | Opcional | portátil |
| * | Wildcard al final | port* |
| " " | Frase exacta | "cámara de 48MP" |
| ~ | Reduce relevancia | ~caro |
> | Aumenta relevancia | >rápido |
< | Reduce relevancia | <lento |
Operador +: palabra obligatoria
-- Resultados que DEBEN contener "smartphone"
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('+smartphone' IN BOOLEAN MODE);| nombre | precio |
|---|---|
| iPhone 15 Pro | 1299.99 |
| Samsung Galaxy S24 | 899.99 |
| Google Pixel 8 | 699.00 |
| Xiaomi 14 | 599.99 |
-- DEBE contener "smartphone" Y "Samsung"
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('+smartphone +Samsung' IN BOOLEAN MODE);| nombre | precio |
|---|---|
| Samsung Galaxy S24 | 899.99 |
Operador -: excluir palabra
-- Smartphones que NO sean Apple
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('+smartphone -Apple' IN BOOLEAN MODE);| nombre | precio |
|---|---|
| Samsung Galaxy S24 | 899.99 |
| Google Pixel 8 | 699.00 |
| Xiaomi 14 | 599.99 |
El iPhone 15 Pro se excluye porque su descripción contiene "Apple".
Operador *: wildcard
El asterisco funciona como un comodín al final de una palabra:
-- Buscar palabras que empiecen con "port"
SELECT nombre
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('port*' IN BOOLEAN MODE);| nombre |
|---|
| MacBook Air M3 |
| Lenovo ThinkPad X1 |
| ASUS ROG Zephyrus |
Encuentra "portátil", "portátiles" y cualquier palabra que empiece con "port".
Comillas: frase exacta
-- Buscar la frase exacta "manga corta"
SELECT nombre
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('"manga corta"' IN BOOLEAN MODE);| nombre |
|---|
| Camiseta algodón básica |
Sin comillas, buscaría "manga" y "corta" por separado. Con comillas, busca la frase exacta.
Combinaciones
-- Debe contener "running", puede contener "zapatillas", no "trail"
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('+running zapatillas -trail' IN BOOLEAN MODE);| nombre | precio |
|---|---|
| Camiseta técnica running | 34.99 |
| Zapatillas running pro | 129.99 |
Las zapatillas trail se excluyen por el operador -.
-- Buscar en reseñas: obligatorio "bueno" o "excelente"
SELECT
p.nombre,
r.puntuacion,
r.comentario
FROM resenas r
JOIN productos p ON r.producto_id = p.id
WHERE MATCH(r.comentario) AGAINST('+bueno +rendimiento' IN BOOLEAN MODE);Operadores de relevancia
-- "cámara" más importante que "batería"
SELECT nombre,
MATCH(nombre, descripcion) AGAINST('>cámara <batería' IN BOOLEAN MODE) AS relevancia
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('>cámara <batería' IN BOOLEAN MODE)
ORDER BY relevancia DESC;Operador ~: reducir contribución
-- Buscar "portátil" pero reducir relevancia si contiene "gaming"
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('+portátil ~gaming' IN BOOLEAN MODE);| nombre | precio |
|---|---|
| MacBook Air M3 | 1399.00 |
| Lenovo ThinkPad X1 | 1549.00 |
| ASUS ROG Zephyrus | 1899.99 |
Todos aparecen, pero el ASUS ROG tendría menor relevancia por contener "gaming".
Diferencias con modo natural
| Característica | Lenguaje natural | Booleano |
|---|---|---|
| Operadores | No | Sí |
| Frases exactas | No | Sí |
| Regla del 50% | Sí | No |
| Ordenamiento automático | Por relevancia | Sin orden específico |
| Requiere índice FULLTEXT | Sí | No, pero es recomendado |
| Wildcard | No | Sí |
Limpieza
DROP INDEX ft_productos ON productos;
DROP INDEX ft_resenas ON resenas;En el siguiente artículo veremos la expansión de consulta, un modo que amplía automáticamente la búsqueda para encontrar resultados relacionados.
Escrito por Eduardo Lázaro
