MySQL levenshtein

Một lần nữa, WordPress đã âm thầm thay đổi mã của tôi và khiến nó không sử dụng được. Và lần này, nó làm quá tốt. tôi không thể sửa nó. Tính năng này [tiêu diệt mã] là tính năng WP duy nhất hoạt động tốt, nhưng tôi phải thừa nhận rằng nó thực sự hoàn hảo

Vì lý do này, vui lòng bỏ qua các ví dụ về mã bên dưới và tải xuống kho lưu trữ này, chứa các Hàm được lưu trữ của tôi, Trường hợp thử nghiệm cho các Hàm của tôi và Hàm được lưu trữ của Arjen Lentz

Tôi đã tìm thấy một hàm Khoảng cách Levenshtein, được triển khai dưới dạng Hàm được lưu trữ SQL cho MySQL và MariaDB, được viết bởi Arjen Lentz. Bài đăng đó cũng chứa một cuộc thảo luận ngắn nhưng thú vị về những ưu điểm và nhược điểm của Hàm được lưu trữ so với UDF

Đối với những người chưa biết, Khoảng cách Levenshtein [hoặc Khoảng cách chỉnh sửa] đọc hai chuỗi và trả về số lần chỉnh sửa nguyên tử tối thiểu phải được thực hiện đối với chuỗi đầu tiên để làm cho nó bằng chuỗi thứ hai [hoặc ngược lại, như bạn . Chỉnh sửa nguyên tử có thể là thêm, xóa hoặc thay thế một ký tự

Ví dụ

String 1: abcde_1
String 2: bcdef_2
Dinstance: 3.
The required atomic edits are: delete a, add f, change 1 to 2.

Tôi đã cố gắng cải thiện chức năng. Chà, những thay đổi của tôi là tầm thường [vì Arjen Lentz là một thiên tài, như bạn có thể thấy bằng cách xem mã OQGRAPH, còn tôi thì không], nhưng tôi muốn chia sẻ chúng, như Lentz đã hỏi trong bài đăng của anh ấy. Tôi cũng đã viết Hàm levenshtein_ratio và bạn có thể tìm thấy nó bên dưới

Levenshtein của tôi

Đây là "ngã ba" của tôi

DROP FUNCTION IF EXISTS `levenshtein`;
CREATE FUNCTION `levenshtein`[`s1` VARCHAR[255] CHARACTER SET utf8, `s2` VARCHAR[255] CHARACTER SET utf8]
    RETURNS TINYINT UNSIGNED
    NO SQL
    DETERMINISTIC
BEGIN
    DECLARE s1_len, s2_len, i, j, c, c_temp TINYINT UNSIGNED;
    -- max strlen=255 for this function
    DECLARE cv0, cv1 VARBINARY[256];
    
    -- if any param is NULL return NULL
    -- [consistent with builtin functions]
    IF [s1 + s2] IS NULL THEN
        RETURN NULL;
    END IF;
    
    SET s1_len = CHAR_LENGTH[s1],
        s2_len = CHAR_LENGTH[s2],
        cv1 = 0x00,
        j = 1,
        i = 1,
        c = 0;
    
    -- if any string is empty,
    -- distance is the length of the other one
    IF [s1 = s2] THEN
        RETURN 0;
    ELSEIF [s1_len = 0] THEN
        RETURN s2_len;
    ELSEIF [s2_len = 0] THEN
        RETURN s1_len;
    END IF;
    
    WHILE [j 

Chủ Đề