Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

दो टेबल कॉलम के बीच mysql के साथ तुलना करने वाला पैटर्न

दो प्रश्न - क्या विवरण मानक हैं (विवरण नहीं बदलते हैं) या वे किसी उपयोगकर्ता द्वारा दर्ज किए गए हैं? यदि वे मानक हैं, तो एक पूर्णांक वाला स्तंभ जोड़ें और इस स्तंभ पर तुलना करें।

यदि यह उपयोगकर्ता द्वारा दर्ज किया गया है, तो आपका काम अधिक जटिल है क्योंकि आप कुछ ऐसी खोज कर रहे हैं जो अधिक अस्पष्ट खोज है। मैंने दो स्ट्रिंग्स के बीच समानता को रैंक करने के लिए एक द्वि-ग्राम खोज एल्गोरिदम का उपयोग किया, लेकिन यह सीधे mySQL में नहीं किया जा सकता है।

एक अस्पष्ट खोज के बदले, आप LIKE का उपयोग कर सकते हैं, लेकिन यदि आप खोज शब्द की शुरुआत में '%' डालते हैं तो इसकी दक्षता टेबल स्कैन करने तक ही सीमित है। साथ ही, इसका मतलब है कि आप अपने द्वारा चुने गए सबस्ट्रिंग हिस्से पर एक मैच प्राप्त कर सकते हैं, जिसका अर्थ है कि आपको समय से पहले सबस्ट्रिंग को जानना होगा।

जब मुझे पता चल जाएगा कि आप क्या करने की कोशिश कर रहे हैं, तो मुझे और विस्तार से बताने में खुशी होगी।

EDIT1:ठीक है, आपके विस्तार को देखते हुए, जैसा कि मैंने उल्लेख किया है, आपको एक अस्पष्ट शैली खोज करने की आवश्यकता होगी। मैं एक द्वि-ग्राम विधि का उपयोग करता हूं, जिसमें उपयोगकर्ता द्वारा की गई प्रत्येक प्रविष्टि को लेना और इसे 2 या 3 वर्णों के टुकड़ों में विभाजित करना शामिल है। फिर मैं इनमें से प्रत्येक भाग को किसी अन्य तालिका में संग्रहीत करता हूं जिसमें प्रत्येक प्रविष्टि वास्तविक विवरण पर वापस आती है।

उदाहरण:

विवरण1:"एक तेज़ दौड़ आगे"विवरण2:"एक छोटी दौड़ आगे"

यदि आप प्रत्येक को 2 चार भागों में विभाजित करते हैं - 'A', 'f', 'fa', 'as','st'.....

फिर आप दोनों तारों से मेल खाने वाले 2 चार हिस्सों की संख्या की तुलना कर सकते हैं और "स्कोर" प्राप्त कर सकते हैं जो दोनों के बीच सटीकता या समानता को दर्शाता है।

यह देखते हुए कि मैं नहीं जानता कि आप किस विकास भाषा का उपयोग कर रहे हैं, मैं कार्यान्वयन को छोड़ दूंगा, लेकिन यह कुछ ऐसा है जिसे स्पष्ट रूप से mySQL में करने की आवश्यकता नहीं होगी।

या आलसी विकल्प अमेज़ॅन जैसी क्लाउड खोज सेवा का उपयोग करना होगा जो आपके द्वारा दिए गए शब्दों के आधार पर खोज प्रदान करेगा ... सुनिश्चित नहीं है कि वे आपको लगातार नए विवरण जोड़ने की अनुमति देते हैं, और आपके आवेदन के आधार पर, यह थोड़ा महंगा हो सकता है (IMHO)।

आर

बिग्राम कार्यान्वयन पर एक और SO पोस्ट के लिए - इसे देखें SO bigram / fuzzy search

--- प्रति प्रश्नकर्ता विस्तार अपडेट---

सबसे पहले, मुझे लगता है कि आपने मेरे द्वारा प्रदान किए गए लिंक पर सिद्धांत पढ़ा है..दूसरा, मैं इसे यथासंभव डीबी अज्ञेयवादी के रूप में रखने की कोशिश करूंगा, क्योंकि इसे mySQL की आवश्यकता नहीं है (हालांकि मैं इसका उपयोग करता हूं, और यह इससे अधिक काम करता है ठीक)

ठीक है, इसलिए बिग्राम विधि केवल इन-मेमोरी एरेज़ बनाने/तुलना करने में ठीक काम करती है, यदि संभावित मैच अपेक्षाकृत छोटे हैं, अन्यथा यह टेबल-स्कैन प्रदर्शन से ग्रस्त है जैसे कि बिना इंडेक्स के एक MySQL टेबल। तो, आप अपने लिए अनुक्रमण करने में मदद करने के लिए डेटाबेस की ताकत का उपयोग करने जा रहे हैं।

उपयोगकर्ता को "शर्तें" या टेक्स्ट जिसे आप तुलना करना चाहते हैं उसे रखने के लिए आपको एक टेबल की आवश्यकता है। सबसे सरल रूप दो स्तंभों वाली एक तालिका है, एक एक अद्वितीय ऑटो-इन्क्रीमेंट पूर्णांक है जिसे अनुक्रमित किया जाएगा, हम नीचे hd_id को कॉल करेंगे, दूसरा एक वर्चर (255) है यदि तार बहुत छोटे हैं, या यदि वे कर सकते हैं तो टेक्स्ट करें लंबा हो जाओ - आप इसे जो चाहें नाम दे सकते हैं।

फिर, आपको एक और तालिका बनाने की आवश्यकता होगी जिसमें कम से कम तीन कॉलम हों - एक संदर्भ कॉलम के लिए दूसरी तालिका के ऑटो-इंक्रिमेंटेड कॉलम पर वापस (हम इसे नीचे hd_id कहेंगे), दूसरा एक वर्चर () होगा अधिक से अधिक 5 वर्ण कहें (यह आपके बिग्राम भाग को धारण करेगा) जिसे हम नीचे "बिग्राम" कहेंगे, और तीसरा एक ऑटो-इन्क्रीमेंटिंग कॉलम जिसे नीचे b_id कहा जाता है। यह तालिका प्रत्येक उपयोगकर्ता की प्रविष्टि के लिए सभी बिग्राम रखेगी और समग्र प्रविष्टि से जुड़ी होगी। आप वर्चर कॉलम को अपने आप अनुक्रमित करना चाहेंगे (या पहले एक कंपाउंड इंडेक्स में क्रम में)।

अब, हर बार जब कोई उपयोगकर्ता उस शब्द में प्रवेश करता है जिसे आप खोजना चाहते हैं, तो आपको पहली तालिका में शब्द दर्ज करना होगा, फिर शब्द को बिग्राम में विभाजित करना होगा और संदर्भ का उपयोग करके दूसरी तालिका में प्रत्येक खंड को समग्र शब्द में दर्ज करना होगा। रिश्ते को पूरा करने के लिए पहली तालिका। इस तरह, आप PHP में विच्छेदन कर रहे हैं, लेकिन mySQL या जो भी डेटाबेस आपके लिए इंडेक्स ऑप्टिमाइज़ेशन करते हैं। यह गणना चरण के लिए तालिका 1 में बने बिग्राम की संख्या को संग्रहीत करने के लिए बिग्राम चरण में मदद कर सकता है। नीचे PHP में कुछ कोड दिए गए हैं जो आपको बिग्राम बनाने के बारे में एक विचार प्रदान करते हैं:

// split the string into len-character segments and store seperately in array slots
function get_bigrams($theString,$len)   
{
   $s=strtolower($theString);
   $v=array();
   $slength=strlen($s)-($len-1);     // we stop short of $len-1 so we don't make short chunks as we run out of characters

   for($m=0;$m<$slength;$m++)
   {
      $v[]=substr($s,$m,$len);
   }
   return $v;
}    

स्ट्रिंग्स में रिक्त स्थान के बारे में चिंता न करें - यदि आप अस्पष्ट खोज के बारे में सोचते हैं तो वे वास्तव में सहायक होते हैं।

तो आप बिग्राम प्राप्त करें, उन्हें एक तालिका में दर्ज करें, तालिका 1 के माध्यम से और अनुक्रमित कॉलम में समग्र पाठ से जुड़ा हुआ है ... अब क्या?

अब जब भी आप "माई फेवरेट टर्म टू सर्च" जैसे शब्द की खोज करते हैं - तो आप PHP फ़ंक्शन का उपयोग इसे बिग्राम की एक सरणी में बदलने के लिए कर सकते हैं। फिर आप इसका उपयोग अपने बिग्राम टेबल (2) पर SQL स्टेटमेंट के IN (..) भाग को बनाने के लिए करते हैं। नीचे एक उदाहरण दिया गया है:

select count(b_id) as matches,a.hd_id,description, from table2 a
inner join table1 b on (a.hd_id=b.hd_id)
where bigram in (" . $sqlstr . ")
group by hd_id order by matches desc limit X

मैंने $sqlstr को एक PHP स्ट्रिंग संदर्भ के रूप में छोड़ दिया है - आप इसे स्वयं को बिग्राम फ़ंक्शन से अल्पविराम से अलग सूची के रूप में इंपोड का उपयोग करके या get_bigrams से लौटाए गए सरणी पर जो कुछ भी पसंद करते हैं या यदि आप चाहें तो पैरामीटर के रूप में बना सकते हैं।

यदि सही तरीके से किया जाता है, तो ऊपर दी गई क्वेरी आपके द्वारा चुने गए बिग्राम की लंबाई के आधार पर सबसे निकट से मेल खाने वाले अस्पष्ट खोज शब्द लौटाती है। आपके द्वारा चुनी गई लंबाई की समग्र खोज स्ट्रिंग की आपकी अपेक्षित लंबाई के आधार पर एक सापेक्ष प्रभावकारिता होती है।

अंत में - ऊपर की क्वेरी, बस एक फजी मैच रैंक देती है। आप न केवल मैचों, बल्कि मैचों बनाम समग्र बिग्राम गणना की तुलना करके चारों ओर खेल सकते हैं और बढ़ा सकते हैं जो छोटे तारों की तुलना में डी-पूर्वाग्रह लंबी खोज स्ट्रिंग में मदद करेगा। मैं यहाँ इसलिए रुका हूँ क्योंकि इस समय यह बहुत अधिक विशिष्ट अनुप्रयोग बन जाता है।

आशा है कि यह मदद करेगा!

आर




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL डेटा को पेज से PDF में कैसे बदलें

  2. प्रारंभिक पंक्ति से एकाधिक पंक्तियां कैसे बनाएं

  3. अक्षांश देशांतर के आधार पर mysql से परिणाम प्राप्त करें

  4. MySQL:किसी निश्चित तिथि से पहले नवीनतम तिथि के साथ रिकॉर्ड का चयन कैसे करें

  5. VB.NET MySQL कनेक्शन