Expansión de consulta

La expansión de consulta es un modo de búsqueda full-text que amplía automáticamente la búsqueda para encontrar resultados relacionados que el usuario podría no haber mencionado. MySQL realiza la búsqueda en dos pasadas: primero busca las palabras originales, luego usa las palabras de los resultados más relevantes para hacer una segunda búsqueda más amplia.

Sintaxis

SELECT * FROM tabla
WHERE MATCH(columna) AGAINST('búsqueda' WITH QUERY EXPANSION);
 
-- Equivalente
SELECT * FROM tabla
WHERE MATCH(columna) AGAINST('búsqueda' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION);

Preparación

CREATE FULLTEXT INDEX ft_productos ON productos (nombre, descripcion);

Cómo funciona

La expansión de consulta sigue el algoritmo de "blind query expansion":

  1. Primera pasada: MySQL busca las palabras originales en modo de lenguaje natural
  2. Recopilación: Toma las palabras más relevantes de los primeros resultados
  3. Segunda pasada: Repite la búsqueda incluyendo las palabras recopiladas
  4. Resultado: Devuelve los resultados de la segunda pasada

Ejemplo: búsqueda sin expansión

-- Sin expansión: solo encuentra resultados con "Apple"
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('Apple');
nombreprecio
iPhone 15 Pro1299.99
MacBook Air M31399.00

Ejemplo: búsqueda con expansión

-- Con expansión: encuentra resultados relacionados
SELECT nombre, precio,
    MATCH(nombre, descripcion) AGAINST('Apple' WITH QUERY EXPANSION) AS relevancia
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('Apple' WITH QUERY EXPANSION)
ORDER BY relevancia DESC;
nombrerelevancia
iPhone 15 Pro2.3456
MacBook Air M31.8765
Samsung Galaxy S240.4321
Google Pixel 80.3210
Xiaomi 140.2345
ASUS ROG Zephyrus0.1987
Lenovo ThinkPad X10.1654

En la primera pasada, MySQL encontró "iPhone 15 Pro" y "MacBook Air M3". De sus descripciones, extrajo palabras como "smartphone", "chip", "portátil", "procesador". En la segunda pasada, esas palabras trajeron más resultados relacionados con tecnología.

Caso de uso práctico

La expansión de consulta es útil cuando el usuario busca un término general y quieres mostrar resultados relacionados:

-- El usuario busca "correr"
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('correr' WITH QUERY EXPANSION);

Aunque pocos productos tengan la palabra "correr" exacta, la expansión puede traer productos relacionados con running, zapatillas, deporte, etc.

Precauciones

La expansión de consulta puede generar mucho ruido en los resultados:

AspectoSin expansiónCon expansión
PrecisiónAltaBaja
ResultadosPocos, relevantesMuchos, variados
RuidoBajoAlto
Uso idealBúsquedas exactasExploración, descubrimiento

Recomendaciones:

  • Usa con moderación, especialmente en tablas con datos heterogéneos
  • Combina con LIMIT para controlar la cantidad de resultados
  • Funciona mejor cuando los documentos están relacionados temáticamente
  • No es útil cuando la búsqueda ya es muy específica
-- Limitar resultados para controlar el ruido
SELECT nombre, precio
FROM productos
WHERE MATCH(nombre, descripcion) AGAINST('yoga' WITH QUERY EXPANSION)
LIMIT 5;

Limpieza

DROP INDEX ft_productos ON productos;

En el siguiente artículo veremos el parser ngram, que permite búsquedas full-text en idiomas sin separadores de palabras como chino, japonés y coreano.

Escrito por Eduardo Lázaro