समान शब्दों के लिए MySQL डेटाबेस खोजने का कोई तरीका है (मतलब समान शब्द नहीं है)। उदाहरण के लिए: उपयोगकर्ता "abcd" शब्द के लिए डेटाबेस में खोज करता है और डेटाबेस में "abd" शब्द होता है, इसलिए खोज इंजन या प्रोग्राम उपयोगकर्ता से पूछें "क्या आपका मतलब है [abd]?" जैसा कि अधिकांश खोज इंजन में है वेब? कृपया ध्यान दें कि खोज शब्द मौजूदा शब्द का एक हिस्सा (उपयोग कर सकते हैं नहीं "की तरह")क्या समान शब्दों के लिए SQL डेटाबेस खोजने का कोई तरीका है (मतलब समान शब्द नहीं है)?
उत्तर
Damerau-Levenshtein distance एल्गोरिदम देखें। यह दो तारों के बीच "दूरी" की गणना करता है और यह निर्धारित करता है कि एक स्ट्रिंग को दूसरे में बदलने के लिए कितने कदम उठाए जाते हैं। दो तारों के करीब कम कदम हैं।
This आलेख एल्गोरिदम को एक MySQL संग्रहीत फ़ंक्शन के रूप में लागू करता है।
एल्गोरिदम LIKE या SOUNDEX से बहुत बेहतर है।
मेरा मानना है कि Google एल्गोरिदम की बजाय भीड़ के स्रोत का उपयोग करता है। यानी यदि उपयोगकर्ता एबीसीडी में टाइप करता है, तो बैक बटन पर क्लिक करता है और फिर तुरंत एबीडी की खोज करता है तो यह दो खोज शब्दों के बीच एक रिश्ता स्थापित करता है क्योंकि उपयोगकर्ता परिणाम से खुश नहीं था। एक बार जब आपके पास बहुत बड़ी समुदाय खोज हो तो पैटर्न दिखाई देता है।
कैसे दूर वे कर रहे हैं पर निर्भर करता है नहीं है, आप soundex शायद इस पर गौर कर सकता है ..
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex
महान लिंक आपको बहुत बहुत – EgyEast
एक और तकनीक trigrams पर इंडेक्स बनाने के लिए है।
के बाद डेव बार्कर के जवाब में लिंक मर चुका है, यहाँ an archived version of the website से कोड है:
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
ध्यान दें करने के लिए:
इनपुट तार की अधिकतम लंबाई 255 वर्ण है। मुझे यकीन है कि यदि आवश्यक हो तो आप अधिक समर्थन के लिए फ़ंक्शन को संपादित कर सकते हैं।
मैंने इसे utf8_bin कॉलम पर अंतरराष्ट्रीय वर्णों के साथ परीक्षण किया है और यह काम करना प्रतीत होता है, लेकिन मैंने उस क्षमता का परीक्षण नहीं किया है।
मैंने इसे केवल MySQL 5.0+ पर परीक्षण किया है। कोई विचार नहीं कि यह उससे कम संस्करणों पर कैसे काम करेगा।
और एक बोनस मैं भी एक सहायक समारोह है कि अलग अलग के अनुपात (एक प्रतिशत के रूप में) रिटर्न बनाया के रूप में: एक ही वर्ण जो (यहां से विचार) सिर्फ एक सीधी संपादित दूरी की तुलना में अधिक सहायक हो सकता है।
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
- 1. बड़ी तालिका से समान मूल्य खोजने के लिए इष्टतम तरीका
- 2. सोलर फ़ज़ी समान शब्दों के लिए खोजें
- 3. क्या सिल्वरलाइट jQuery के समान 'समान' है?
- 4. क्या राज्यमाचिन और स्टेटकार्ट का मतलब समान है?
- 5. एक हैश कैसे बनाएं जो समान इनपुट के समान है?
- 6. क्या कोई मेवेन लक्ष्य है जो 'dist' के समान है?
- 7. स्ट्रिंग्स का पता लगाने के लिए नियमित रूप से आवश्यकता है जो समान हैं लेकिन समान नहीं हैं
- 8. LinqToSQL Linq के समान है?
- 9. क्या जीएमटी यूटीसी के समान है?
- 10. क्या आईआईएस वेबसाइटों को तैनात करने का कोई समाधान है जो कैपिस्ट्रानो के समान है?
- 11. कोड के लिए टेम्पलेट जो समान है लेकिन समान नहीं है?
- 12. क्या div में शब्द-लपेटने वाले शब्दों का कोई तरीका है?
- 13. Postgresql: 2 समान डेटाबेस
- 14. विरासत डेटाबेस शब्द का क्या अर्थ है?
- 15. सबसे समान तार खोजने के लिए php में सबसे अच्छा तरीका है?
- 16. 00.0 के समान नहीं है 0.0?
- 17. इनपुट के लिए सबसे समान स्ट्रिंग खोजने का सबसे तेज़ तरीका?
- 18. क्या कोई जावा कंसोल/संपादक GroovyConsole के समान है?
- 19. क्या जीडब्ल्यूटी में जावास्क्रिप्ट की चेतावनी के समान कुछ बनाने का कोई तरीका है?
- 20. के-मतलब: प्रत्येक निष्पादन के लिए समान क्लस्टर
- 21. क्या जीएनयू रीडलाइन के समान कोई नेट लाइब्रेरी है?
- 22. यार्ड आरडीओसी के समान नहीं है?
- 23. यूआईएसविच, मैक के लिए कुछ समान है?
- 24. क्या SQLite में कोई आरक्षित शब्द है?
- 25. क्या ड्रूल्स jrules के समान है?
- 26. डीपी डुबकी के समान है?
- 27. एक ही समय में एकाधिक डेटाबेस पर समान .sql स्क्रिप्ट चलाने का सरल तरीका?
- 28. क्रियालेख 3 में एक मैच के लिए शब्दों की एक लंबी सूची खोजने के लिए सबसे तेज़ तरीका क्या है?
- 29. क्या डीबीकॉन्टेक्स्ट डेटाकॉन्टेक्स्ट के समान है?
- 30. खोजने सब किसी सरणी के तत्वों लम्बाई समान होती है कि क्या की स्काला तरीका क्या है?
धन्यवाद, कृपया मुझे बहुत मदद मिली धन्यवाद – EgyEast