Una búsqueda que perdona las erratas: cómo funciona de verdad la tolerancia a los errores de escritura
El problema, enunciado con precisión
Un cliente que busca «zapatilas» quiere decir casi con seguridad «zapatillas». Un cuadro de búsqueda que no devuelve ningún resultado para esa consulta no es estricto por una buena razón: falla en lo único para lo que existe, encontrar lo que la persona quería decir, y no solo lo que ha escrito. La tolerancia a las erratas es el nombre genérico de los mecanismos que cierran esa brecha. Parece una sola función. En realidad son al menos dos mecanismos distintos, con costes distintos y formas distintas de fallar, y confundirlos es donde se equivocan la mayoría de las implementaciones ingenuas.
El ladrillo básico: la distancia de edición
Casi todos los mecanismos de tolerancia a las erratas, sea cual sea el motor, se apoyan en la misma idea de fondo: la distancia de edición entre dos cadenas, casi siempre la distancia de Levenshtein, que cuenta el número mínimo de inserciones, supresiones o sustituciones de un solo carácter necesarias para transformar una cadena en la otra. «Camiza» está a una sustitución de «camisa». «Camsia» en lugar de «camisa», con dos letras contiguas intercambiadas, está a una trasposición: dos ediciones según la definición clásica de Levenshtein, una sola en la variante de Damerau-Levenshtein, que cuenta la inversión como una única edición. La cifra, por sí sola, no decide nada; lo que importa es lo que el sistema hace con ella.
El detalle que hay que resolver desde el principio: una distancia de una o dos ediciones es generosa para una palabra larga y peligrosa para una corta. Dos ediciones sobre una palabra de diez letras apenas la cambian. Dos ediciones sobre una palabra de tres letras pueden convertirla en una palabra completamente distinta: «mar» y «mal» están a una edición una de otra, pero también «mar» y «par», igual que «mar» y «mas». Un sistema de tolerancia que aplique el mismo umbral de distancia sea cual sea la longitud de la palabra acabará «corrigiendo» alegremente palabras cortas y distintas unas en otras. La corrección honesta es un umbral proporcional a la longitud: ninguna corrección en las palabras muy cortas, una edición permitida a partir de unas pocas letras, dos ediciones solo cuando la palabra es lo bastante larga como para seguir siendo reconocible tras dos cambios.
Dos mecanismos distintos, a menudo confundidos en una sola función
«Tolerancia a las erratas» designa normalmente una de dos cosas realmente distintas, y la que ofrece un sistema cambia lo que puede y no puede hacer.
1. La coincidencia fuzzy en el momento de la consulta
Elasticsearch, OpenSearch y los motores similares pueden ejecutar una consulta fuzzy (o usar el parámetro fuzziness de una consulta match) que compara el término buscado con los términos indexados usando la distancia de edición en el momento de la consulta, sin necesidad de saber de antemano qué erratas existen. Funciona porque el motor ya dispone de un índice invertido de todos los términos presentes en el catálogo; una consulta fuzzy equivale, a grandes rasgos, a «encontrar los términos indexados a N ediciones como máximo de este y ordenar los resultados según su cercanía». No requiere ninguna etapa de mantenimiento aparte y se degrada con suavidad: una consulta ligeramente equivocada sigue poniendo en cabeza los términos indexados más próximos. Su coste real aparece en un campo de alta cardinalidad o con un vocabulario muy grande, donde calcular la distancia de edición sobre un gran conjunto de términos candidatos pesa más que una búsqueda de término exacto; por eso la coincidencia fuzzy suele aplicarse de forma selectiva (el campo principal de texto libre, no cada campo de palabras clave) en lugar de en todas partes por defecto.
2. La corrección por diccionario, aplicada solo cuando hace falta
Un sistema sin un motor de búsqueda capaz de puntuar de forma nativa las coincidencias fuzzy, por ejemplo una simple búsqueda basada en SQL, tiene que construir el mecanismo por su cuenta: un diccionario de términos válidos, construido a partir de los nombres de productos y marcas del catálogo, con el que se compara un término de búsqueda que no ha dado nada para encontrar la palabra real más cercana. El diccionario se indexa habitualmente por trigramas de caracteres (fragmentos de tres letras) en lugar de compararse letra por letra con cada palabra, tanto porque un índice de trigramas reduce la lista de candidatos a las palabras plausiblemente próximas antes de calcular la distancia de edición exacta sobre un conjunto mucho menor, como porque no requiere ningún motor externo.
El detalle que hace económico este enfoque en la práctica, en lugar de convertirlo en una trampa de rendimiento, es el momento en que se ejecuta la búsqueda en el diccionario. Si cada búsqueda pagara el coste de una consulta al diccionario, la tolerancia a las erratas ralentizaría todas las consultas, incluidas las bien escritas que ya encontraban resultados. La consulta solo tiene motivo para ejecutarse una vez que la búsqueda exacta ha vuelto vacía: una consulta correcta nunca la toca, y solo el caso sin resultados paga el sobrecoste. Medidas sobre un catálogo real, una consulta bien escrita y una consulta con errata que activa la consulta al diccionario tardaron lo mismo, poco, en los dos casos (ambas entre 0,16 y 0,19 segundos en esta instalación concreta): la vía del diccionario solo añade un coste a las búsquedas que, de otro modo, no habrían devuelto nada en absoluto.
El diccionario también requiere un mantenimiento que una consulta fuzzy no necesita: debe aprender las palabras nuevas a medida que crece el catálogo y olvidar las de los productos que ya no existen; de lo contrario se queda obsoleto poco a poco y empieza a sugerir correcciones hacia productos abandonados. Un diccionario que se reconstruye según un calendario (por ejemplo cada semana, más un complemento bajo demanda la primera vez que una búsqueda sin resultados necesita una palabra que todavía no conoce) se mantiene alineado con el catálogo sin reconstruirse en cada consulta.
Dónde se rompe la versión fácil
- Un umbral de distancia de edición fijo para palabras de cualquier longitud, como se ha visto más arriba: una corrección generosa en las palabras cortas convierte palabras distintas unas en otras.
- Corregir una consulta que ya tiene resultados. Si una búsqueda que ya ha encontrado productos se «corrige» además hacia otro término más popular, el cliente puede verse alejado de lo que realmente escribió y enviado hacia lo que el motor considera cercano y popular. La corrección tiene su lugar después de una verdadera búsqueda sin resultados, no como una reescritura permanente de cada consulta en segundo plano.
- Una corrección que se activa discretamente cuando no debería. En una página de búsqueda con facetas, una selección de filtros puede dar legítimamente cero resultados (un cliente ha elegido una combinación de talla y color que nadie tiene en stock). Eso no es un problema de ortografía, y una capa de tolerancia incapaz de distinguirlo intentará «corregir» un término perfectamente escrito porque han sido los filtros, y no la palabra, los que han vaciado la página.
- Confiar en la coincidencia fuzzy para asegurar también unas facetas correctas. Lograr que una consulta con errata encuentre productos pese a todo es un problema distinto de contar correctamente cuántos productos corresponden a cada valor de filtro. Un motor tolerante que encuentra resultados para «zapatilas» calculará sin dudar los recuentos de facetas para esa misma coincidencia fuzzy; si un elemento posterior (una lista de autocompletado de «búsquedas populares», por ejemplo) supone que «al menos un producto encontrado» significa «era un término real, bien escrito», republicará con gusto las erratas de la tienda ante cada visitante. Precisamente porque el motor tolerante hace bien su trabajo, ese error resulta fácil de cometer en otra parte del mismo sistema.
- El silencio en lugar de la transparencia. Una búsqueda que sustituye discretamente el término escrito por otro, sin indicar que ha habido una sustitución, deja al cliente preguntándose por qué los resultados no se corresponden del todo con lo que buscó. Una línea visible y honesta, «Ningún resultado para X. Estos son los resultados para Y», cuesta una frase y evita por completo esa confusión.
Una breve lista de comprobación
- Adapte la distancia de edición permitida a la longitud de la palabra; no aplique el mismo umbral a una palabra de tres letras y a una de doce.
- Corrija solo después de una verdadera búsqueda sin resultados, nunca mediante una reescritura silenciosa de una consulta que ya había encontrado algo.
- Distinga «la palabra estaba mal escrita» de «los filtros han vaciado la página»: las dos situaciones exigen un tratamiento distinto, y confundirlas provoca un intento de corrección donde no tenía lugar.
- Si mantiene su propio diccionario en lugar de apoyarse en la puntuación fuzzy integrada de un motor, téngalo al día: reconstrúyalo según un calendario y deje que aprenda del catálogo a medida que cambia; si no, empezará a sugerir palabras que ya no existen.
- Diga al cliente cuándo ha habido una sustitución. No deje que una coincidencia fuzzy «lograda» oculte que lo que escribió y lo que obtuvo no son la misma palabra.
En resumen
La tolerancia a las erratas no es un interruptor de encendido y apagado: es la elección entre dos mecanismos distintos, la coincidencia fuzzy nativa del motor en el momento de la consulta o un diccionario mantenido y consultado solo ante una verdadera búsqueda sin resultados, cada uno con su propio coste y su propia manera de equivocarse en silencio. Los dos errores que hay que vigilar son corregir palabras que no estaban mal escritas en absoluto y confiar en una coincidencia fuzzy para responder a preguntas para las que no fue concebida, como un recuento exacto de facetas. Nosotros lo resolvemos en cll_essearch, nuestro módulo de búsqueda y navegación por facetas para PrestaShop, tanto con la coincidencia fuzzy nativa de Elasticsearch como con nuestro propio diccionario de trigramas para las tiendas que usan el motor nativo de la base de datos, si desea ver esa distinción aplicada a una tienda online real.
Búsqueda Elasticsearch y Navegación por FacetasBúsqueda ultrarrápida y tolerante a errores de tecleo con navegación por facetas moderna en panel modal, con e…99,99 €Ver producto