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":
- Primera pasada: MySQL busca las palabras originales en modo de lenguaje natural
- Recopilación: Toma las palabras más relevantes de los primeros resultados
- Segunda pasada: Repite la búsqueda incluyendo las palabras recopiladas
- 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');| nombre | precio |
|---|---|
| iPhone 15 Pro | 1299.99 |
| MacBook Air M3 | 1399.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;| nombre | relevancia |
|---|---|
| iPhone 15 Pro | 2.3456 |
| MacBook Air M3 | 1.8765 |
| Samsung Galaxy S24 | 0.4321 |
| Google Pixel 8 | 0.3210 |
| Xiaomi 14 | 0.2345 |
| ASUS ROG Zephyrus | 0.1987 |
| Lenovo ThinkPad X1 | 0.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:
| Aspecto | Sin expansión | Con expansión |
|---|---|---|
| Precisión | Alta | Baja |
| Resultados | Pocos, relevantes | Muchos, variados |
| Ruido | Bajo | Alto |
| Uso ideal | Búsquedas exactas | Exploración, descubrimiento |
Recomendaciones:
- Usa con moderación, especialmente en tablas con datos heterogéneos
- Combina con
LIMITpara 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
