Carga de la biblioteca UDF Levenshtein en MySQL con Docker para búsquedas por similitud

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;

Etiquetas: MySQL Docker UDF Levenshtein Similarity Search

Publicado el 6-29 17:52