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

OperadorSignificadoEjemplo
+Obligatorio+smartphone
-Excluir-Apple
sin operadorOpcionalportátil
*Wildcard al finalport*
" "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);
nombreprecio
iPhone 15 Pro1299.99
Samsung Galaxy S24899.99
Google Pixel 8699.00
Xiaomi 14599.99
-- DEBE contener "smartphone" Y "Samsung"
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('+smartphone +Samsung' IN BOOLEAN MODE);
nombreprecio
Samsung Galaxy S24899.99

Operador -: excluir palabra

-- Smartphones que NO sean Apple
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('+smartphone -Apple' IN BOOLEAN MODE);
nombreprecio
Samsung Galaxy S24899.99
Google Pixel 8699.00
Xiaomi 14599.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);
nombreprecio
Camiseta técnica running34.99
Zapatillas running pro129.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);
nombreprecio
MacBook Air M31399.00
Lenovo ThinkPad X11549.00
ASUS ROG Zephyrus1899.99

Todos aparecen, pero el ASUS ROG tendría menor relevancia por contener "gaming".

Diferencias con modo natural

CaracterísticaLenguaje naturalBooleano
OperadoresNo
Frases exactasNo
Regla del 50%No
Ordenamiento automáticoPor relevanciaSin orden específico
Requiere índice FULLTEXTNo, pero es recomendado
WildcardNo

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