2009-12-16 14 views
5

मैं एक छोटे PHP/MySQL अनुप्रयोग के लिए अस्पष्ट खोज को लागू करने के लिए देख रहा हूं। विशेष रूप से, मेरे पास लगभग 2400 रिकॉर्ड्स वाला डेटाबेस है (रिकॉर्ड प्रति वर्ष 600 की दर से जोड़ा गया है, इसलिए यह छोटा डेटाबेस है)। ब्याज के तीन क्षेत्र सड़क का पता, अंतिम नाम और तारीख हैं। मैं उन क्षेत्रों में से किसी एक द्वारा खोज करने में सक्षम होना चाहता हूं, और अनिवार्य रूप से वर्तनी/चरित्र त्रुटियों के लिए सहनशीलता है। यानी, "123 मुख्य सड़क" का एक पता "123 मुख्य सेंट", "123 मुख्य सेंट", "123 मियान सेंट", "123 मैन सेंट", "132 मुख्य सेंट" आदि से मेल खाना चाहिए और इसी तरह नाम के लिए भी और तारीख।PHP/MySQL छोटे पैमाने पर अस्पष्ट खोज

मुख्य मुद्दों मैं अन्य इसी तरह के प्रश्नों के उत्तर देते हैं:

  • यह हर संभव गलत वर्तनी के लिए समानार्थी शब्द को परिभाषित करना असंभव है, दिनांक और नाम के लिए ऐसा करने भूल जाते हैं।
  • लुसीन इत्यादि इतने सीमित खोज डेटा सेट के लिए बहुत भारी वजन लगता है (इसे अधिकतम 5,000 रिकॉर्ड, रिकॉर्ड प्रति 3 फ़ील्ड) कहते हैं।
  • सिर्फ वाइल्डकार्ड के साथ कुछ करना संभव वर्तनी त्रुटियों के साथ तार्किक प्रतीत नहीं होता है।

कोई सुझाव? मुझे पता है कि MySQL के साथ मूल रूप से करना संभव नहीं है, लेकिन चूंकि डेटा सेट इतना सीमित है, इसलिए मैं इसे अपेक्षाकृत सरल रखना चाहता हूं ... शायद एक PHP क्लास जो सभी से रिकॉर्ड्स के रिकॉर्ड प्राप्त करता है डीबी, कुछ प्रकार की तुलना एल्गोरिदम का उपयोग करता है, और इसी तरह के रिकॉर्ड की आईडी देता है?

धन्यवाद, जेसन

उत्तर

7

रैज़ी का जवाब (या Damerau–Levenshtein का उपयोग करके) खोज कुंजी पर उनके निकटता के अनुसार उम्मीदवारों की एक सूची में रैंकिंग करता है। (सावधानी बरतें: यदि कुंजी "12 मुख्य सेंट" है तो "13 मेन सेंट" में "12 मोइन सेंट" के समान टाइपिंग दूरी है लेकिन आप इसे कम रैंक करना चाहते हैं या यहां तक ​​कि इसे बाहर भी कर सकते हैं, 11 और 22 मुख्य सेंट के साथ इत्यादि)

लेकिन आप रैंक करने के लिए एक प्रबंधित आकार के उम्मीदवारों की एक सूची का चयन कैसे करते हैं?

एक तरीका यह है कि आपके द्वारा खोजे जाने वाले तारों में प्रत्येक शब्द के लिए मेटाफ़ोन मान (या मान, डबल-मेटाफोन का उपयोग करके) गणना करें। मूल स्ट्रिंग वाली पंक्ति की आईडी के साथ इन सभी मेटाफ़ोन को किसी अन्य तालिका में सहेजें। फिर आप इन मेटाफोन मूल्यों को जल्दी से LIKE 'कुंजी%' के साथ खोज सकते हैं जहां कुंजी खोज टेक्स्ट से किसी शब्द का मेटाफ़ोन है।

this thread पर सुझाए गए उत्तर को देखें। यह काफी साफ है और डीबी के लिए अच्छी तरह से काम करना चाहिए जो कि बहुत बड़ा नहीं है।

3

यदि यह एक बहुत छोटे से डेटाबेस है, तो आप सकता है लोड एक बार और अपनी खोज के लिए Jaro-Winkler की तरह एक एल्गोरिथ्म का उपयोग पर सभी डेटा। उनके पास PHP में कार्यान्वयन है, जिसे आप here पा सकते हैं।

इम्हो यह वास्तव में अच्छी तरह से काम करता है। एक उदाहरण कार्यान्वयन here पर एक नज़र डालें। मुझे पता है कि वह खोज एक ही एल्गोरिदम का उपयोग करती है, और यह 'निंटडेनो' बहुत अच्छी तरह से मिल सकती है। यह आपके लिए परिणाम भी बताता है, जिसके परिणामस्वरूप आपकी क्वेरी से सबसे अच्छा मिलान होता है।

संबंधित मुद्दे