2012-04-06 11 views
6

बूलियन मोड में पूर्ण टेक्स्ट खोज का उपयोग करने के लिए खोज स्थापित करने का प्रयास करते समय मुझे थोड़ा उलझन में आ रहा है।MySQL पूर्ण टेक्स्ट खोज बूलियन मोड भ्रम

$query = "SELECT *, 

     MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score 

     FROM results 

     WHERE MATCH(title) AGAINST('$q' IN BOOLEAN MODE) 

     ORDER BY score DESC"; 

जब मैं +divorce+refinance के लिए एक खोज चलाने के लिए, लौटे परिणाम हैं:: यहाँ क्वेरी मैं उपयोग कर रहा हूँ है

1) Divorce: Paying Off Spouse = Rate/Term Refinance 
2) Divorce - What to Look Out For Regarding Divorced Borrowers 

मैं सही सोच कर कि दूसरा परिणाम प्रदर्शित होने नहीं किया जाना चाहिए में हूँ, क्योंकि इसमें दोनों शब्द नहीं हैं? यदि नहीं, तो मैं उस कार्यक्षमता को कैसे बना सकता हूं?

उत्तर

9

शायद मुझे गलती हो रही है, लेकिन यदि आप इस स्ट्रिंग को +divorce+refinance खोजते हैं तो आपको एक अजीब परिणाम मिलता है। यदि आप दोनों शब्दों को खोजना चाहते हैं, तो आपको +divorce +refinance (बीच के बीच के स्थान के साथ) खोजना चाहिए।

मैं इसे परीक्षण किया है और यह केवल एक पंक्ति रिटर्न:

Divorce: Paying Off Spouse = Rate/Term Refinance 
4

आपकी समस्या से संबंधित है प्राथमिकता के आधार पर बूलियन क्वेरी बना सकते हैं और पूछताछ वह है की इस प्रकार के लिए बूलियन खोज की गहराई में जाने के लिए और करने के लिए अब कैसे करना है बूलियन खोज किया जाता है। सरल शब्दों में मुझे आपको समझाएं कि परिणाम का दूसरा नंबर परिणाम क्यों दिखाया गया है।

एक बार सबसे पहले समझना चाहिए कि प्रोग्रामिंग में बूलियन का क्या अर्थ है? इसका मतलब है कि या तो शर्त सही है या गलत है, ई 0 से 1.

अब मुझे बूलियन खोज के लिए समझाया गया है? आपने दो शब्द दिए हैं। चलो बूलियन मोड में पंक्ति से पंक्ति को खोजते हैं। सर्च इंजन अब पंक्ति से पंक्ति को खोजता है और खोजता है, जहां कभी भी पहला शब्द मिलता है, यह रिकॉर्ड को सच बनाता है और पंक्तियों को 1 के रूप में स्कोर देता है जिसमें पहला शब्द मिलता है और पंक्ति में पाए गए शब्दों की संख्या भी तैयार करता है।

अब यह अगला शब्द चलाता है और वही प्रक्रिया रिकॉर्ड रिकॉर्ड देता है और जहां भी शब्द मिलता है वहां रिकॉर्ड्स की एक सूची बनाता है और पंक्ति में पाए गए शब्दों की संख्या भी तैयार करता है।

अब परिणाम की दो पंक्तियां उपलब्ध हैं और वे एकत्रित हैं और शब्दों और पंक्ति की अधिकतम संख्या वाले शब्दों को प्राथमिकता दी गई है, मुख्य समस्या निहित है।

उदाहरण

पहले >>> कुल नं। >> दूसरा >> कुल संख्या। >>> अंतिम >> पंक्ति
वर्ड >>> परिणाम >> वर्ड >>>> शब्दों का>>> परिणाम >> कोई >> उत्तर


1 >>>>>>>> 2 >>>>>>>> 1 >>>>>>>>> 1 >>>>>>>> 1.33 >>>> 1 >>> 1.33
0 >>>>>>>> 0> >>>>>>> 2 >>>>>>>>> 2 >>>>>>>> 1.25 >>>> 2 >>> 1.25
0 >>>>>>>> 0 >> >>>>>> 1 >>>>>>>>> 0 >>>>>>>> 1.25 >>>> 3 >>> 1

दो परिणामों की सूची क्लब है जब सच जोड़ा झूठ के साथ परिणाम सही है, जैसे कि आप 1 + 0 = 1 जोड़ते हैं और परिणाम शोल हैं डी 1 से अधिक मूल्य के साथ। इसलिए, शब्दों में प्रासंगिकता को स्कोर करते समय यह हमेशा पाया जाता है कि खोज इंजन उन परिणामों को दिखाता है जहां इसे कोई शब्द मिला।

स्कोरिंग प्रासंगिकता प्रश्न दो प्रकारों में किए जाते हैं या तो एक के बराबर स्कोर को अनदेखा करते हैं और केवल रिकॉर्ड्स पर गणना करते हैं जो स्कोर 1 से अधिक है। दूसरा ऐसा प्रश्न बनाना है कि यह रिकॉर्ड के बराबर कभी नहीं दिखाता एक। आपके मामले में के रूप में आप इतना नीचे बातें भी दो शब्दों के लिए सही परिणाम प्राप्त करने के कर सकते हैं:

SELECT *, ((1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE)))) AS score FROM results WHERE (MATCH(title, text) AGAINST ('+term +term2' IN BOOLEAN MODE)) HAVING relevance > 0 ORDER BY relevance DESC; 

मुझे पता है कि शब्द होने का उपयोग कर क्वेरी थोड़ा धीमा कर लेकिन कोई अन्य समाधान उपलब्ध है। उम्मीद है कि यह आपकी क्वेरी हल करता है।

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