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 ;
Levenshtein 함수가 MySQL에 정의되면 쿼리를 다음과 같이 수정할 수 있습니다.
$word = mysql_real_escape_string($word); mysql_qery("SELECT `term` FROM `words` WHERE levenshtein('$word', `term`) BETWEEN 0 AND 4");
이 쿼리는 다음을 반환합니다. 지정된 단어에 대해 0에서 4 사이의 Levenshtein 거리를 갖는 단어 테이블의 모든 용어. 여러 PHP 루프를 피하고 데이터베이스의 내장 기능을 사용하면 특히 대규모 데이터 세트의 경우 상당한 성능 향상을 얻을 수 있습니다.
위 내용은 PHP 애플리케이션과 MySQL 데이터베이스 간의 Levenshtein 거리 계산을 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!