programing

mysql에 levenshtein 기능을 추가하는 방법은?

telecom 2023. 9. 17. 12:09
반응형

mysql에 levenshtein 기능을 추가하는 방법은?

http://kristiannissen.wordpress.com/2010/07/08/mysql-levenshtein/, 에서 MySQL의 Levenshtein 거리 코드를 받았는데 MySQL에 해당 기능을 추가하는 방법은 무엇입니까?XAMPP를 사용하고 있는데 PHP로 검색하기 위해서 필요합니다.

MySQL 서버에 연결하여 MySQL Workbench에서 간단히 문을 실행했는데, 단순히 작동했습니다. 이제 새로운 기능이 생겼습니다.levenshtein().

예를 들어, 예상대로 작동합니다.

SELECT levenshtein('abcde', 'abced')

2
DELIMITER $$
CREATE FUNCTION levenshtein( s1 VARCHAR(255), s2 VARCHAR(255) ) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; 
DECLARE s1_char CHAR; 
-- max strlen=255 
DECLARE cv0, cv1 VARBINARY(256); 
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0; 
IF s1 = s2 THEN 
  RETURN 0; 
ELSEIF s1_len = 0 THEN 
  RETURN s2_len; 
ELSEIF s2_len = 0 THEN 
  RETURN s1_len; 
ELSE 
  WHILE j <= s2_len DO 
    SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1; 
  END WHILE; 
  WHILE i <= s1_len DO 
    SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1; 
    WHILE j <= s2_len DO 
      SET c = c + 1; 
      IF s1_char = SUBSTRING(s2, j, 1) THEN  
        SET cost = 0; ELSE SET cost = 1; 
      END IF; 
      SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; 
      IF c > c_temp THEN SET c = c_temp; END IF; 
        SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1; 
        IF c > c_temp THEN  
          SET c = c_temp;  
        END IF; 
        SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; 
    END WHILE; 
    SET cv1 = cv0, i = i + 1; 
  END WHILE; 
END IF; 
RETURN c; 
END$$
DELIMITER ;

문제의 웹페이지 링크가 끊어졌습니다.그런데 함수의 생성 코드는 다음과 같습니다.

DELIMITER $$

CREATE FUNCTION levenshtein( s1 varchar(255), s2 varchar(255) ) returns int deterministic 
BEGIN 
  DECLARE s1_len, 
    s2_len, 
    i, 
    j, 
    c, 
    c_temp, 
    cost          int; 
  declare s1_char char; 
  -- max strlen=255 
  declare cv0, 
    cv1 varbinary(256); 
  set s1_len = char_length(s1), 
    s2_len = char_length(s2), 
    cv1 = 0x00, 
    j = 1, 
    i = 1, 
    c = 0; 
  if s1 = s2 THEN 
  RETURN 0; 
elseif s1_len = 0 THEN 
  RETURN s2_len; 
elseif s2_len = 0 THEN 
  RETURN s1_len; 
  else 
  WHILE j <= s2_len do 
  SET cv1 = concat(cv1, unhex(hex(j))), 
    j = j + 1; 
endWHILE;WHILE i <= s1_len do 
SET s1_char = substring(s1, i, 1), 
  c = i, 
  cv0 = unhex(hex(i)), 
  j = 1;WHILE j <= s2_len do 
SET c = c + 1;IF s1_char = Substring(s2, j, 1) then 
SET cost = 0; 
else 
SET cost = 1;ENDIF;SET c_temp = conv(hex(substring(cv1, j, 1)), 16, 10) + cost;IF c > c_temp then
SET c = c_temp;ENDIF;SET c_temp = conv(hex(substring(cv1, j+1, 1)), 16, 10) + 1;IF c > c_temp then
SET c = c_temp;ENDIF;SET cv0 = concat(cv0, unhex(hex(c))), 
  j = j + 1;ENDWHILE;SET cv1 = cv0, 
  i = i + 1;ENDWHILE;ENDIF;RETURN c;
END;

DELIMITER ;

누군가에게 도움이 되었으면 좋겠군요!

  • phphmyadmin 또는 terminal을 통해 mysql 데이터베이스에 로그인합니다.
  • sql을 클릭합니다.

  • 위 링크와 끝 구분 기호 ;의 함수에 구분 기호 $$를 추가합니다.

  • 일단 그것이 성공적으로 컴파일된다면, 당신은 다른 프로시저나 함수, 쿼리 등 당신이 원하는 어디에서나 그 데이터베이스에서 그것을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/13909885/how-to-add-levenshtein-function-in-mysql

반응형