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 ;
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");
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!