Levenshtein in MySQL und PHP: Ein optimierter Ansatz
Im ursprünglichen Codeausschnitt wird der Levenshtein-Abstand zwischen einem bestimmten Wort und jedem einzelnen Wort berechnet Begriff aus der Datenbank mithilfe der Levenshtein-Funktion in PHP. Dieser Ansatz erfordert jedoch mehrere Datenbankabfragen, was bei großen Datensätzen ineffizient sein kann. Eine effizientere Lösung besteht darin, die Levenshtein-Distanz als Filter innerhalb der Datenbankabfrage selbst zu nutzen.
Um dies zu erreichen, benötigen Sie eine in MySQL implementierte Levenshtein-Funktion. Sie können beispielsweise die folgende benutzerdefinierte Funktion in Betracht ziehen:
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 ;
Sobald die Levenshtein-Funktion in MySQL definiert ist, können Sie Ihre Abfrage wie folgt ändern:
$word = mysql_real_escape_string($word); mysql_qery("SELECT `term` FROM `words` WHERE levenshtein('$word', `term`) BETWEEN 0 AND 4");
Diese Abfrage wird zurückgegeben alle Begriffe aus der Worttabelle, die einen Levenshtein-Abstand zwischen 0 und 4 zum angegebenen Wort haben. Indem Sie mehrere PHP-Schleifen vermeiden und sich auf die integrierte Funktion der Datenbank verlassen, können Sie insbesondere bei großen Datenmengen erhebliche Leistungsverbesserungen erzielen.
Das obige ist der detaillierte Inhalt vonWie kann ich Levenshtein-Abstandsberechnungen zwischen einer PHP-Anwendung und einer MySQL-Datenbank optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!