[2024r3] Búsquedas difusas con SOUNDEX en SQLite

A continuación encontrarás traducido al castellano el artículo escrito por William Yu y publicado originalmente en el Blog Oficial de Xojo.

Si bien se trata de una actualización menor, la última versión de Xojo introduce ahora el acceso a otra función del núcleo de SQLite: SOUNDEX.

¿De qué se trata?

SOUNDEX es una función del núcleo en SQLite encargada de codificar una cadena en una secuencia de 4 bytes, permitiendo la indexación basada en la pronunciación. Si bien los detalles técnicos del algoritmo están disponibles en la Wikipedia, lo fundamental es que SOUNDEX(“Smith”) arrojará una correspondencia con SOUNDEX(“Smythe”), haciendo así que resulte útil en las búsquedas para identificar diferentes formas de “pronunciar” o deletrear un mismo término.

¿Cómo se utiliza?

Para los más curiosos, puedes ver cómo se indexan las palabras simplemente invocando un select sobre un término SOUNDEX:

Var db As New SQLiteDatabase
db.Connect
 
Var rs As RowSet
rs = db.SelectSQL("SELECT SOUNDEX('Smith')")
Var smith As String = rs.ColumnAt(0).StringValue
rs = db.SelectSQL("SELECT SOUNDEX('Smythe')")
Var smythe As String = rs.ColumnAt(0).StringValue

Al ejecutarlo verás que “Smith” y “Smythe” devuelven la misma secuencia SOUNDEX de 4 bytes “S530”. Este es un rápido resumen de cómo se ha generado:

  • Primera letra (S): La primera letra del nombre es la misma, de modo que la “S” del nombre “Smith” o “Smythe” es el primer caracter del código.
  • Números (530): Los caracteres restantes del código representan los sonidos para las siguientes letras del nombre. Cada número se basa en un grupo de consonantes con un sonido similar:
    • 5 = “M” (porque M suena como “M” en “Smith” o “Smythe”)
    • 3 = “T” (porque T suena como “T” en “Smith” o “Smythe”)
    • 0 = Sin correspondencia de sonido o vocal, de modo que actúa como relleno para completar el código de 4 caracteres.

Caso de uso práctico

Ahora que tenemos una mejor comprensión del algoritmo, podemos poner en práctica su uso buscando en nuestra base de datos por aquellos nombres que “suenen” parecido a “Smith”.

db.ExecuteSQL("CREATE TABLE contacts(id INTEGER PRIMARY KEY, name TEXT)")
db.ExecuteSQL("INSERT INTO contacts (name) VALUES ('Smith'), ('Smythe'), ('Simith'), ('John')")
 
rs = db.SelectSQL("SELECT name FROM contacts WHERE SOUNDEX(name) = SOUNDEX('Smith')")
 
// Esperamos encontrar tres nombres: Smith, Smythe, and Simith
Var namesFound As Integer = rs.RowCount

La difusa conclusión

Dado que el algoritmo SOUNDEX está diseñado para la pronunciación con patrones en inglés, es probable que no funcione tan bien para aquellos idiomas con diferentes estructuras de sonidos o bien alfabetos, de modo que los resultados pueden variar en función del idioma. También es importante destacar que esta característica está disponible en todas nuestras plataformas soportadas, excepto Android.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *