के लिए यह लेख देखें आप हो सकता है implement Levenshtein distance in a MySQL stored function कैसे।
भावी पीढ़ी के लिए, लेखक का सुझाव यह करने के लिए है:
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;
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
वह भी एक LEVENSHTEIN_RATIO सहायक विधि है जो अलग अलग/कुल पात्रों के अनुपात है, बजाय एक सीधे संपादित दूरी का मूल्यांकन करेंगे आपूर्ति करती है। उदाहरण के लिए, यदि यह 60% है, तो स्रोत शब्द में वर्णों के तीन-पांचवें गंतव्य शब्द से अलग हैं।
CREATE FUNCTION LEVENSHTEIN_RATIO (s1 VARCHAR(255), s2 VARCHAR(255))
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, max_len INT;
SET s1_len = LENGTH(s1), s2_len = LENGTH(s2);
IF s1_len > s2_len THEN SET max_len = s1_len; ELSE SET max_len = s2_len; END IF;
RETURN ROUND((1 - LEVENSHTEIN(s1, s2)/max_len) * 100);
END
पोस्टरिटी के लिए भी, यह जेसन रस्ट द्वारा कोड है जो आर्नोल्ड फ़्रिबल द्वारा कोड पर आधारित है, जो बदले में आंशिक रूप से जोसेफ गामा से काम पर आधारित था। – webbiedave
डी ओह। किसी तरह मैंने सोचा कि मैं लेखक का उल्लेख करता हूं, लेकिन जाहिर है मैंने नहीं किया। अंतराल भरने के लिए धन्यवाद, @webbiedave। –
यूडीएफ के लिए धन्यवाद, यह बहुत उपयोगी है। लेकिन अगर मैं एक क्वेरी चलाता हूं जैसे "चयन * तालिका से जहां LEVENSHTEIN ('कीवर्ड', फ़ील्ड) <3 (या तो)" ~ 300k पंक्ति तालिका पर है, तो यह (स्पष्ट रूप से) पूर्ण होने में आयु लेता है। मैंने पंक्तियों की खोज को कम करने की कोशिश की (CHAR_LENGTH ('कीवर्ड') - 1 और CHAR_LENGTH ('कीवर्ड') + 1 के बीच WHERE CHAR_LENGTH ('फ़ील्ड') का उपयोग करके) लेकिन यह 35 सेकंड में परिणाम देता है :) क्या आप (या अन्य) इस सवाल को तेज करने के लिए एक विचार है? – Hazar