Maison > base de données > tutoriel mysql > Comment optimiser les calculs de distance Levenshtein entre une application PHP et une base de données MySQL ?

Comment optimiser les calculs de distance Levenshtein entre une application PHP et une base de données MySQL ?

Patricia Arquette
Libérer: 2024-12-05 15:34:10
original
486 Les gens l'ont consulté

How can I optimize Levenshtein distance calculations between a PHP application and a MySQL database?

Levenshtein dans MySQL et PHP : une approche optimisée

Dans l'extrait de code original, la distance de Levenshtein est calculée entre un mot donné et chaque terme de la base de données en utilisant la fonction levenshtein en PHP. Cependant, cette approche implique plusieurs requêtes de base de données, ce qui peut s'avérer inefficace pour les grands ensembles de données. Une solution plus efficace consiste à exploiter la distance de Levenshtein comme filtre au sein de la requête de base de données elle-même.

Pour y parvenir, vous avez besoin d'une fonction Levenshtein implémentée dans MySQL. Par exemple, vous pouvez considérer la fonction personnalisée suivante :

DELIMITER $$
CREATE FUNCTION levenshtein(s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS INT
BEGIN
DECLARE len1 INT DEFAULT LENGTH(s1);
DECLARE len2 INT DEFAULT LENGTH(s2);
DECLARE i, j, cost, d INT DEFAULT 0;

DECLARE sp VARCHAR(255);

IF len1 = 0 THEN
    RETURN len2;
ELSEIF len2 = 0 THEN
    RETURN len1;
ELSE
    SET sp = REPEAT(' ', len1);
    FOR i = 1 TO len1 DO
        SET sp = CONCAT(sp, i);
    END FOR;
    SET sp = CONCAT(sp, CHAR(10));
    FOR j = 1 TO len2 DO
        SET sp = CONCAT(sp, j, CHAR(10));
        SET cost = j;
        FOR i = 1 TO len1 DO
            IF s1 SUBSTRING(i, 1) = s2 SUBSTRING(j, 1) THEN
                SET d = 0;
            ELSE
                SET d = 1;
            END IF;
            SET cost = LEAST(
                cost + 1,
                i + 1 + 1,
                j + d + 1
            );
            SET sp = CONCAT(sp, cost);
        END FOR;
    END FOR;
    SET sp = CONCAT(sp, CHAR(10));
    RETURN SUBSTRING_INDEX(sp, CHAR(10), -1) - len1 - 1;
END IF;
END$$
DELIMITER ;
Copier après la connexion

Une fois la fonction Levenshtein définie dans MySQL, vous pouvez modifier votre requête comme suit :

$word = mysql_real_escape_string($word);
mysql_qery("SELECT `term` FROM `words` WHERE levenshtein('$word', `term`) BETWEEN 0 AND 4");
Copier après la connexion

Cette requête renverra tous les termes de la table des mots qui ont une distance de Levenshtein comprise entre 0 et 4 par rapport au mot spécifié. En évitant plusieurs boucles PHP et en vous appuyant sur la fonction intégrée de la base de données, vous pouvez obtenir des améliorations significatives des performances, en particulier pour les grands ensembles de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal