- solo cuentan las 8 mejores palabras
- basta con uno de varios términos
- con un solo término: puede perder productos
- cuentan todas las palabras coincidentes
- deben coincidir todos los términos
- con un solo término: suele encontrar bastante más
En los foros de Shopware se repiten una y otra vez las mismas preguntas: ¿Por qué la búsqueda devuelve productos que ni siquiera contienen el término buscado? ¿Por qué una sola «e» decide si un producto aparece o no? ¿Y por qué la búsqueda Y encuentra más que la búsqueda O? Las respuestas están en el código fuente. Lo hemos analizado a fondo y aquí explicamos qué ocurre: sin necesidad de saber programar, pero con el detalle suficiente para que entienda el comportamiento de su tienda.
Esto se aplica a la búsqueda estándar de Shopware 6 (basada en MySQL, sin Elasticsearch/OpenSearch). Hemos leído el código de la versión 6.7.13.0 (la lógica no cambia hasta la 6.7.14.1) y hemos probado todos los ejemplos de abajo en una tienda con Shopware 6.7.14.1.
Los ejemplos están en alemán a propósito: el problema de las palabras compuestas afecta sobre todo al alemán, y las tiendas alemanas son el público principal de Shopware.
Paso 1: Al indexar se crea un diccionario
Shopware no recorre los textos de sus productos en cada búsqueda. En su lugar, al indexar construye un diccionario de palabras clave a partir de todos los campos marcados como buscables en Settings → Search (Ajustes → Búsqueda). Los textos se dividen en palabras4:
- todo se pasa a minúsculas,
- se separa por espacios y signos de puntuación,
- los guiones, guiones bajos, puntos, «+» y «@» se conservan («Montage-Feinstrickhandschuhe» sigue siendo una sola palabra),
- las palabras compuestas no se dividen. Para Shopware, «Arbeitshandschuhe» es una única palabra.
Cada palabra se guarda dos veces: una tal cual y otra al revés («arbeitshandschuhe» y «ehuhcsdnahstiebra»). El paso 3 muestra por qué.
Paso 2: El término de búsqueda se convierte en patrones
Cuando un cliente escribe «stuhl», Shopware no busca solo esa palabra exacta. Genera varios patrones de búsqueda con comodines, en los que algunas letras pueden faltar o ser cualquiera. Para «stuhl» son, entre otros1:
| Patrón | Significa | Encuentra, por ejemplo |
|---|---|---|
s__hl… | s, dos caracteres cualesquiera, hl, luego cualquier cosa | stahl, stuhl |
stu… | empieza por «stu» | stuhl, stufe, stuck |
stu_l… | stu, un carácter cualquiera, l | stuhl |
Esta es la forma de tolerancia a errores de Shopware, y explica por qué «Stuhl» también encuentra «Stahl». No es una búsqueda difusa (fuzzy) «de verdad», pero tampoco es tolerancia cero. La misma tolerancia actúa también al final de la palabra: en nuestra tienda de prueba, la búsqueda de «stuhl» devolvió también productos con la palabra inglesa «Steel» en el nombre, porque «steel» termina como «stuhl», solo que con dos letras cambiadas («st», dos caracteres cualesquiera, «l»).
Dos casos especiales:
- Las palabras con cifras (p. ej. «m12») se buscan sin comodines, pero en cualquier posición de la palabra: «m12» también encuentra «din-m12» y «m12x40».
- Las palabras muy cortas (hasta 2 caracteres) solo se buscan como principio de palabra.
Paso 3: Principio o final, nunca el medio
Los patrones se comparan dos veces con el diccionario: con las palabras normales y con las guardadas al revés2. Los patrones normales encuentran palabras que empiezan así. Los comparados al revés encuentran palabras que terminan así.
Lo que nunca se encuentra: un término que solo aparece en medio de una palabra más larga. Justo ese era el caso de un hilo muy comentado del foro:
| Búsqueda | Nombre del producto «Arbeitshandschuhe» (guantes de trabajo) | Por qué |
|---|---|---|
| «handschuhe» (guantes) | ✅ encontrado | «arbeitshandschuhe» termina en «handschuhe» |
| «handschuh» (guante) | ❌ no encontrado | no está ni al principio ni al final |
| «arbeit» (trabajo) | ✅ encontrado | «arbeitshandschuhe» empieza por «arbeit» |
| «strick» (punto) en «Montage-Feinstrickhandschuhe» | ❌ no encontrado | está en el medio |
En alemán, con sus muchas palabras compuestas (Holzschrauben, Bürostuhl, Edelstahlspüle: tornillos para madera, silla de oficina, fregadero de acero inoxidable), esta es la causa más frecuente de «El producto existe, ¿por qué la búsqueda no lo encuentra?».
Paso 4: Solo cuentan las 8 mejores palabras
A menudo muchas palabras del diccionario encajan con los patrones. Shopware las puntúa entonces, sobre todo según lo parecidas que sean al término buscado (distancia de Levenshtein: ¿cuántas letras hay que cambiar?). «stahl» está a una sola letra de «stuhl» y por eso obtiene una buena puntuación.
Importante: para la búsqueda O, Shopware utiliza después solo las 8 palabras mejor puntuadas1. Si muchas palabras tienen la misma puntuación, algo habitual con las palabras compuestas, en la práctica es el orden alfabético el que decide cuáles son esas 8. Los productos que solo encajarían a través de la novena o décima palabra se quedan fuera.
Búsqueda Y frente a búsqueda O: lo contrario de lo que se espera
En Settings → Search (Ajustes → Búsqueda) puede elegir si, con varios términos, deben aparecer todos (Y) o basta con uno (O). Lo esperable sería que O siempre encontrara más. En realidad, los dos modos también se diferencian en cuántas palabras coincidentes tienen en cuenta3:
| Búsqueda O | Búsqueda Y | |
|---|---|---|
| Palabras consideradas | solo las 8 mejores en total | todas las coincidentes, por término |
| Varios términos | basta con uno | deben coincidir todos |
| Efecto con un solo término | puede perder productos | suele encontrar bastante más |
Un comerciante contó en el foro que al buscar «mull» (gasa) la búsqueda O encontró 34 artículos y la búsqueda Y, 846. Exactamente este efecto.
Consejo práctico: si sus clientes suelen escribir una sola palabra y tiene muchos nombres de producto compuestos, pruebe la búsqueda Y.
Por qué aparecen productos que no contienen la palabra
- Campos invisibles: la palabra está en un campo buscable que la tienda no muestra, como etiquetas (tags), términos de búsqueda adicionales, nombres de categoría, propiedades o el fabricante.
- Coincidencias por comodín: un patrón como
stu…encaja con una palabra totalmente distinta en uno de esos campos. - Índice desactualizado: el diccionario se escribe al indexar. Tras cambiar productos o la configuración de búsqueda, vuelva a generar el índice de búsqueda.
Qué palabra encontró un producto lo puede ver en la búsqueda en vivo (Live search) en Settings → Search (Ajustes → Búsqueda), junto con los puntos de ranking.
Qué cambió en la 6.7.14 y qué no
- 6.7.14.0: las notas de la versión mencionan una mejor puntuación cuando el término de búsqueda completo aparece como frase en el producto. Esto se aplica solo a la búsqueda con Elasticsearch/OpenSearch, no a la búsqueda estándar5.
- Puntuación de variantes: hasta ahora se sumaban los puntos de todas las variantes de un producto, de modo que los productos con muchas variantes siempre quedaban arriba. Esto está corregido (pull request #19139)6 y, según Shopware, llegará con una de las próximas versiones. Cambia el orden, no qué productos se encuentran.
Así que la lógica de principio/final, el límite de 8 palabras y el comportamiento Y/O se mantienen.
Qué puede configurar
Sin programación, en Settings → Search (Ajustes → Búsqueda):
- Campos buscables y puntos de ranking: revise qué campos se buscan. Los campos invisibles con muchas palabras (descripciones largas, etiquetas) suelen causar coincidencias inesperadas.
- Búsqueda Y/O: pruebe ambas con sus términos de búsqueda más frecuentes.
- Longitud mínima del término: con 3, términos como «xl» se ignoran.
- Términos excluidos: palabras de relleno que solo generan ruido.
- Términos de búsqueda adicionales por producto: añada partes importantes de las palabras, p. ej. «handschuh» en «Arbeitshandschuhe». Es la palanca más eficaz contra el problema de las palabras compuestas, pero en catálogos grandes supone mucho mantenimiento.
- Vuelva a generar el índice de búsqueda después de cada cambio.
Con desarrollo: la lógica de patrones puede adaptarse mediante decoración de servicios (service decoration). Es una intervención en el flujo del núcleo que hay que revisar en cada actualización.
Cuando la búsqueda estándar llega a sus límites
Para catálogos pequeños con nombres de producto claros, la búsqueda estándar con un buen mantenimiento suele ser suficiente. Se complica con muchas palabras compuestas, términos técnicos, referencias de artículo y variantes. Entonces hay tres caminos:
- Conectar Elasticsearch/OpenSearch y configurar uno mismo el análisis (p. ej. descomposición de palabras, n-gramas). Es potente, pero requiere conocimientos y operación.
- Mantener términos de búsqueda de forma sistemática, p. ej. mediante importación. Ayuda, pero escala mal.
- Usar una búsqueda especializada.
Esto último es lo que hacemos con Eywora: las palabras compuestas alemanas se dividen con ayuda de un diccionario y se reducen a su raíz, de modo que «handschuh» también encuentra «Arbeitshandschuhe». A eso se suman la búsqueda semántica para consultas en el lenguaje del cliente y un tratamiento propio de las referencias de artículo. Cuándo compensa el cambio y cuándo no lo hemos explicado con honestidad en Búsqueda estándar frente a búsqueda con IA. Por qué las búsquedas sin resultados salen tan caras lo contamos en El problema de las búsquedas sin resultados.
Fuentes
- Patrones y puntuación: ProductSearchTermInterpreter.php (Shopware 6.7.13.0) – https://github.com/shopware/shopware/blob/v6.7.13.0/src/Core/Content/Product/SearchKeyword/ProductSearchTermInterpreter.php ↩
- Consulta sobre palabras normales y al revés: KeywordLoader.php (Shopware 6.7.13.0) – https://github.com/shopware/shopware/blob/v6.7.13.0/src/Core/Content/Product/SearchKeyword/KeywordLoader.php ↩
- Filtro Y/O: ProductSearchBuilder.php (Shopware 6.7.13.0) – https://github.com/shopware/shopware/blob/v6.7.13.0/src/Core/Content/Product/SearchKeyword/ProductSearchBuilder.php ↩
- División en palabras: Tokenizer.php (Shopware 6.7.13.0) – https://github.com/shopware/shopware/blob/v6.7.13.0/src/Core/Framework/DataAbstractionLayer/Search/Term/Tokenizer.php ↩
- Notas de la versión 6.7.14.0, sección «Whole-phrase product-search matches rank higher» – https://github.com/shopware/shopware/blob/v6.7.14.0/RELEASE_INFO-6.7.md ↩
- Puntuación de variantes: Pull request #19139 – https://github.com/shopware/shopware/pull/19139 ↩




