La función LIKE en MySQL realiza búsquedas basadas en inclusión de texto. Para evaluar similitudes entre cadenas, se requiere una comparación de proximidad, como identificar que "Universidad de Pekín" y "Pekín" comparten un alto grado de similitud. Esto permite recuperar registros con valores relacionados, aunque la puntuación de coincidencia no sea perfecta.
Para implementar esta funcionalidad, se debe integrar una función definida por el usuario (UDF) desarrollada por la comunidad, que calcula la distancia de Levanshtein y métricas derivadas.
Obtención y compilación del código fuente
El repositorio con el código fuente de la UDF está disponible en GitHub:
https://github.com/juanmirocks/Levenshtein-MySQL-UDF
En un entorno Linux, se puede generar el archivo compartido con el siguiente comando:
gcc -shared -o lib_levenshtein.so -fPIC udf_levenshtein.c $(mysql_config --cflags --libs)
Integración en un contenedor Docker de MySQL
Método manual
Este enfoque aplica a un contneedor en ejecución. La función persiste en reinicios, pero se pierde si el contenedor es eliminado y reconstruido.
Primero, copie el archivo compilado dentro del directorio de plugins de MySQL en el contenedor:
docker cp ./lib_levenshtein.so mysql_container:/usr/lib/mysql/plugin
Luego, registre las funciones usando un cliente SQL:
CREATE FUNCTION levenshtein RETURNS INTEGER SONAME 'lib_levenshtein.so';
CREATE FUNCTION levenshtein_k RETURNS INTEGER SONAME 'lib_levenshtein.so';
CREATE FUNCTION levenshtein_ratio RETURNS REAL SONAME 'lib_levenshtein.so';
CREATE FUNCTION levenshtein_k_ratio RETURNS REAL SONAME 'lib_levenshtein.so';
Verifique el funcionamiento con consultas de prueba:
SELECT levenshtein_ratio('Este es un texto de ejemplo', 'ejemplo') AS puntuacion;
SELECT levenshtein_ratio('Este es un texto de ejemplo', 'texto de ejemplo') AS puntuacion;
Configuración automatizada
Este método garantiza que la UDF se cargue automáticamente cada vez que se cree un nuevo contenedor.
Extraiga los plugins predeterminados de MySQL a una carpeta local:
docker cp temporal_mysql:/usr/lib/mysql/plugin ./mysql_plugins
docker rm temporal_mysql
Cree un script SQL con los comandos de creación de funciones (por ejemplo, setup_udfs.sql):
CREATE FUNCTION levenshtein RETURNS INTEGER SONAME 'lib_levenshtein.so';
CREATE FUNCTION levenshtein_k RETURNS INTEGER SONAME 'lib_levenshtein.so';
CREATE FUNCTION levenshtein_ratio RETURNS REAL SONAME 'lib_levenshtein.so';
CREATE FUNCTION levenshtein_k_ratio RETURNS REAL SONAME 'lib_levenshtein.so';
Defina el servicio de MySQL en un archivo docker-compose.yml:
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: contrasenia_segura
MYSQL_DATABASE: base_pruebas
ports:
- "3307:3306"
volumes:
- ./mysql_plugins:/usr/lib/mysql/plugin
- ./setup_udfs.sql:/docker-entrypoint-initdb.d/udfs.sql
- db_data:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
volumes:
db_data:
Al iniciar con docker-compose up, el script se ejecutará durante la inicialización de la base de datos.
Eliminación de las funciones
Para desinstalar las funciones cargadas, ejecute:
DROP FUNCTION IF EXISTS levenshtein;
DROP FUNCTION IF EXISTS levenshtein_k;
DROP FUNCTION IF EXISTS levenshtein_ratio;
DROP FUNCTION IF EXISTS levenshtein_k_ratio;