MySQL 和PHP 中的Levenshtein:一種最佳化方法
在原始程式碼片段中,計算給定單字與每個單字之所以間的Levenshtein 距離使用PHP 中的levenshtein 函數從資料庫中提取術語。然而,這種方法涉及多個資料庫查詢,這對於大型資料集可能效率低下。更有效的解決方案是利用 Levenshtein 距離作為資料庫查詢本身的篩選器。
要實現此目的,您需要在 MySQL 中實作 Levenshtein 函數。例如,您可以考慮以下自訂函數:
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 ;
在MySQL 中定義Levenshtein 函數後,您可以如下修改查詢:
$word = mysql_real_escape_string($word); mysql_qery("SELECT `term` FROM `words` WHERE levenshtein('$word', `term`) BETWEEN 0 AND 4");
此查詢將傳回單字表中與指定單字的編輯距離在0 到4 之間的所有術語。透過避免多個 PHP 循環並依賴資料庫的內建函數,您可以實現顯著的效能提升,尤其是對於大型資料集。
以上是如何最佳化 PHP 應用程式和 MySQL 資料庫之間的 Levenshtein 距離計算?的詳細內容。更多資訊請關注PHP中文網其他相關文章!