2013-03-19 10 views
5

एक क्षेत्र खोज करने के लिए एक अच्छा तरीका हो सकता है क्या अनदेखी, खोज शब्द और क्षेत्र में रिक्त स्थान की अनदेखी खोजें?MySQL - एक क्षेत्र रिक्त स्थान

उदाहरण:

SELECT * 
FROM tablename 
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%' 

वास्तविक दुनिया उदाहरण:

मेरे ग्राहक एक वेबसाइट लंबे ब्लॉक इंजन की बिक्री है। हालांकि, वे अक्सर "बिल्ली 3306 longblock" (बजाय "बिल्ली 3306 में लंबे समय के ब्लॉक" की) के लिए अपनी साइट पर खोज करने वाले लोगों को मिलता है। जब "लांगब्लॉक" की खोज की जाती है तो हमें "लंबे ब्लॉक" इंजनों को दिखाने की आवश्यकता होती है।

नोट: यह शायद इस सवाल के प्रयोजनों के लिए कोई फर्क नहीं पड़ता है, लेकिन इस वेबसाइट पीएचपी 5.3 और phpActiverecord का उपयोग कर बनाया गया है।

उत्तर

2

तुम भी Sphinx विचार कर सकते हैं खोज रेगुलर एक्सप्रेशन के उपयोग अवधि से बाहर रिक्त स्थान पट्टी सकता है या Lucene पूर्ण पाठ के लिए mysql के पूर्ण टेक्स्ट पर खोजें। मैंने उन्हें व्यक्तिगत रूप से उपयोग नहीं किया है, लेकिन मैंने सुना है कि दोनों mysql के पूर्ण टेक्स्ट इंडेक्स में निर्मित हैं।

इन सभी विधियों के साथ ध्यान देने योग्य एक बात यह है कि उन्हें अद्यतन रखने के लिए एक विशेष इंडेक्स की आवश्यकता होती है जो अधिक रखरखाव और सर्वर ओवरहेड जोड़ता है।

स्फिंक्स पर अच्छा लेख: http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

एक नहीं रखरखाव समाधान के लिए कि उत्पाद का नाम या संख्या के लिए अच्छी तरह से करता है सिर्फ रिक्त स्थान से उपयोगकर्ता के खोज शब्दों को विभाजित और आपकी जिज्ञासा का प्रत्येक के लिए की तरह '% अवधि%' जोड़ने के लिए है ।

इसके अतिरिक्त, मैं एक विशेष खोज फ़ील्ड बनाता हूं जो उत्पाद टोकन या उसके टोकन वर्णमाला के साथ संख्या और रिक्त स्थान और प्रतीकों को छीन लिया गया है। जब भी उत्पाद का नाम बदलता है तो आपको इस फ़ील्ड को अपडेट करने की आवश्यकता होती है। फिर मूल क्षेत्र I OR के खिलाफ पूछताछ के अलावा इस नए छीनने वाले क्षेत्र के खिलाफ खोजें। उदाहरण यदि आपके पास 'cat 3306 longblock' जैसे उत्पाद का नाम है तो product_name_search फ़ील्ड बनाएं और '3306catlongblock' रखें।

WHERE (other product name search clauses) OR 
    (product_name_search LIKE '%3306%' AND product_name_search LIKE '%longblock%') 

इस प्रक्रिया freetext के रूप में के रूप में अच्छा नहीं है, लेकिन यह उत्पाद नाम और नंबर के लिए काफी अच्छा है: 3306 long-block की खोज करता है आप रिक्तियों पर अलग करना प्रतीकों और बंटवारे से खोज संसाधित करते हैं।

+0

धन्यवाद, टिम। विशेष खोज क्षेत्र काम कर सकता है।सबसे बड़ा मुद्दा यह है कि जब हम "बिल्ली 3306 लॉन्ग ब्लॉक" नामक होते हैं तो हम "3306 लांगब्लॉक" खोज रहे हैं। खोज शब्द में अंतरिक्ष की कमी पर ध्यान दें। –

+1

आपको खोज '3306 लांगब्लॉक' में विभाजित करने की आवश्यकता होगी ... जैसे '% 3306%' और ... जैसा कि प्रसंस्कृत product_name_search फ़ील्ड –

+0

के विरुद्ध '% longblock%' पसंद है, यह काम किया, धन्यवाद टिम। –

3

मेरा सुझाव है वहाँ कैसे सरल आप इसे बनाना चाहते के आधार पर, दृष्टिकोण की एक संख्या में हैं। मैं व्यक्तिगत रूप से पूर्ण पाठ खोज का प्रयोग करेंगे सिद्धांतों यहाँ http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

बाहर सेट का उपयोग कर लेकिन क्या आप भी यानी

$str=preg_replace('/\s+/', '', $str); 
+0

जवाब के लिए धन्यवाद। रिक्त स्थान खोज शब्द में नहीं हैं। वे उस क्षेत्र में हैं जहां हम खोज रहे हैं। हम "लांगब्लॉक" खोज रहे हैं और फ़ील्ड में "लंबा ब्लॉक" है। –

+0

उस मामले पूर्ण पाठ खोज आप बाहर की मदद करनी चाहिए में .... – diagonalbatman

+0

पकड़ लिया। इसे जांच लेंगे ... धन्यवाद! –

0

मरम्मत कार्य का उपयोग करने का एक तरीका है। उदाहरण:

SELECT * FROM `products` where REPLACE(PartName, ' ', '') = REPLACE('0 1 3000 70 27', ' ', '') 
संबंधित मुद्दे