Levenshtein dalam MySQL dan PHP: Pendekatan Dioptimumkan
Dalam coretan kod asal, jarak Levenshtein dikira antara perkataan tertentu dan setiap perkataan istilah daripada pangkalan data menggunakan fungsi levenshtein dalam PHP. Walau bagaimanapun, pendekatan ini melibatkan berbilang pertanyaan pangkalan data, yang boleh menjadi tidak cekap untuk set data yang besar. Penyelesaian yang lebih cekap ialah memanfaatkan jarak Levenshtein sebagai penapis dalam pertanyaan pangkalan data itu sendiri.
Untuk mencapai ini, anda memerlukan fungsi Levenshtein yang dilaksanakan dalam MySQL. Sebagai contoh, anda boleh mempertimbangkan fungsi tersuai berikut:
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 ;
Setelah fungsi Levenshtein ditakrifkan dalam MySQL, anda boleh mengubah suai pertanyaan anda seperti berikut:
$word = mysql_real_escape_string($word); mysql_qery("SELECT `term` FROM `words` WHERE levenshtein('$word', `term`) BETWEEN 0 AND 4");
Pertanyaan ini akan kembali semua istilah daripada jadual perkataan yang mempunyai jarak Levenshtein antara 0 dan 4 kepada perkataan yang ditentukan. Dengan mengelakkan berbilang gelung PHP dan bergantung pada fungsi terbina dalam pangkalan data, anda boleh mencapai peningkatan prestasi yang ketara, terutamanya untuk set data yang besar.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengoptimumkan pengiraan jarak Levenshtein antara aplikasi PHP dan pangkalan data MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!