MySQL में लेवेनशेटिन फ़ंक्शन को लागू करने के दो तरीके हैं। पहला एक स्टोर्ड फ़ंक्शन बनाना है जो एक स्टोर्ड ट्रांज़ेक्शन की तरह काम करता है, सिवाय इसके कि इसमें अलग इनपुट और आउटपुट है। यह छोटे डेटासेट के लिए ठीक है, लेकिन कई हजार पंक्तियों के करीब कुछ भी धीमा है।
एक sql फ़ाइल में
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//
स्टोर ऊपर कोड और इसे आयात अपने डेटाबेस में इतनी तरह:
source /tmp/mysql_udf.sql
दूसरी विधि सी/C++ एक उपयोगकर्ता निर्धारित समारोह को लागू करने और लिंक में करने के लिए है एक साझा लाइब्रेरी (* .so फ़ाइल) के रूप में MySQL। यह विधि लाइब्रेरी को कॉल करने के लिए एक स्थिर फ़ंक्शन का भी उपयोग करती है, जिसका अर्थ है कि इस के लिए वास्तविक क्वेरी या पहली विधि समान हो सकती है (दोनों कार्यों में इनपुट प्रदान करना समान है)। आप इस विधि के बारे में यहाँ और अधिक जानकारी प्राप्त कर सकते हैं: कुछ http://samjlevy.com/mysql-levenshtein-and-damerau-levenshtein-udfs/
इन तरीकों में से किसी के साथ, आपकी क्वेरी होगा जैसे:
SELECT term FROM words WHERE levenshtein(term, 'term') < 5;
भी ध्यान रखें कि 'सीमा' मूल्य के संबंध में बदलना चाहिए मूल शब्द लंबाई। प्रतिशत मूल्य के संदर्भ में इसके बारे में सोचना बेहतर है, यानी आपका शब्द = 50%, आधे शब्द '='
ऊपर दिए गए प्रश्न तब तक असफल हो जाएंगे जब तक आप पहले एसक्यूएल डिलीमीटर नहीं बदलते। प्रश्नों से पहले 'DELIMITER @' का उपयोग करें, प्रत्येक क्वेरी दर्ज करने के बाद अपना नया @ डिलीमीटर जोड़ें, फिर अपने डिलीमीटर को वापस 'DELIMITER;' –
के साथ बदलें, क्या यह बड़े डेटा सेट के विरुद्ध चलने के लिए उपयुक्त है? मैं 458546 रिकॉर्ड के खिलाफ LEVENSHTEIN चलाने की कोशिश कर रहा हूं, क्वेरी प्रतिक्रिया नहीं दे रही है। – vishal
जब मैं फ़ंक्शन बनाने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है: # 1064 - आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; लाइन 5 पर '' के पास उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाने वाले मैन्युअल की जांच करें क्या कोई पूरी तरह से काम कर रहे कोड को पास कर सकता है? –