2013-06-10 4 views
5

मैं बस mysql के full text boolean mode के साथ परीक्षण का एक गुच्छा कर रहा हूं और मेरे परीक्षण से ऐसा लगता है कि आप एकाधिक शब्दों पर ऋण चिह्न का उपयोग नहीं कर सकते हैं?पूर्ण पाठ बूलियन मोड में एकाधिक शब्दों पर ऋण चिह्न का उपयोग

मैं उदाहरण के लिए दो पंक्तियों ..

id,name 
1,2011-12 Fleer Retro auto jordan non 
2,1999 jordan non auto 

है, तो मैं निम्न क्वेरी चलाएँ:

SELECT auction_id,`name`,description FROM auctions WHERE MATCH(`name`) AGAINST('+jordan +auto -non' IN BOOLEAN MODE); 

दोनों पंक्तियों के रूप में उम्मीद नहीं दिखाते। हालांकि अगर मैं यह क्वेरी चलाता हूं:

SELECT auction_id,`name`,description FROM auctions WHERE MATCH(`name`) AGAINST('+jordan +auto -"non auto"' IN BOOLEAN MODE); 

दोनों पंक्तियां नहीं दिखती हैं (समान परिणाम)। 1 पंक्ति नहीं आनी चाहिए?

संपादित करें: मेरे ft_min_word_len2 पर सेट है और मैं अपने रोकने वाले शब्द फाइल निष्क्रिय कर दिया है, तो यह उस के साथ कोई संबंध नहीं है।

फिडल: http://sqlfiddle.com/#!2/d1987/4

हालांकि, बेला का उपयोग करता डिफ़ॉल्ट रोकने वाले शब्द फ़ाइल और इसलिए यह परीक्षण "गैर" शब्द से काम नहीं करता साथ लगता है।

+0

तालिका करने के लिए कुछ और पंक्तियां जोड़ने का प्रयास करें। – Strawberry

+0

@ स्ट्रॉबेरी क्षमा करें, तालिका में 2 से अधिक पंक्तियां हैं ...... वास्तव में कुल में '164' पंक्तियां हैं। – Brett

+0

और आपके द्वारा प्रदान किए गए मानदंडों का लगभग प्रतिशत क्या मिलान करता है? – Strawberry

उत्तर

0

पंक्ति 1 वापस नहीं आने का कारण यह है कि नकारात्मक कार्रवाई (जैसे बाहर) सकारात्मक कार्रवाई (जैसे शामिल) से आगे निकलती है। उदाहरण के लिए सुरक्षा में यह सामान्य अभ्यास है, जहां DENIED अनुमति ALLOW या GRANT अनुमति कार्रवाई से अधिक प्राथमिकता है।

MySQL 12.9.2. Boolean Full-Text Searches से:

नोट: - ऑपरेटर केवल पंक्तियों कि अन्यथा अन्य खोज शब्दों से मिलान कर रहे हैं बाहर करने के लिए कार्य करता है। इस प्रकार, एक बुलियन-मोड खोज जिसमें केवल पहले शब्द होते हैं - एक खाली परिणाम देता है। यह "बाहर रखा शर्तों के किसी भी हों उनके अलावा सभी पंक्तियों।" वापस नहीं करता है

इसलिए किसी भी प्रश्न की तरह:

... AGAINST('+Any_string -"any_string"' IN BOOLEAN MODE) 

कुछ नहीं निकलेगा।

अद्यतन

-"non auto" ब्लॉक, खोज परिणामों में दिखाई क्योंकि non एक stopword है और खोज स्ट्रिंग से बाहर रखा गया है से "ऑटो"। इस शब्द को BOOLEAN MODE में खोज से बाहर करने का एक अन्य कारण यह है कि यह बहुत छोटा है:

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

अद्यतन 2

मैं अपने explaination के लिए ऊपर रहना होगा। यद्यपि ऐसा कुछ नहीं है जो आप उम्मीद करेंगे।यह -"term1 term2" में शून्य चिह्न के साथ डबल कोट्स के रूप में दिखता है () - कोष्ठक, दोगुनी qoutes के रूप में नहीं समझा जाता है।

इस क्वेरी कुछ भी नहीं देता है, हालांकि मैं 2011-12 Fleer Retro auto jordan non और 1999 jordan non auto तरह पंक्तियों देखने की उम्मीद। इसमें स्टॉपवर्ड के साथ कुछ लेना देना नहीं है।

SELECT auction_id,`name` FROM auctions 
WHERE MATCH(`name`) AGAINST('+jordan +auto -"jordan auto"' IN BOOLEAN MODE); 

इसके अलावा वहाँ एक संबंधित बग # 36,384 है: Full-Text required (+) operator bug। यह मेरी परिकल्पना का समर्थन करता है, कि पूर्ण-पाठ खोज अभिव्यक्तियों का विश्लेषण करना अपेक्षित कार्य नहीं कर सकता है।

+0

लेकिन मैंने 'ऑटो 'को अवरुद्ध नहीं किया; मैंने इस शब्द को डबल कोट्स में शामिल किया है, इसलिए इसे केवल 'गैर ऑटो' की पूर्ण अवधि को अवरुद्ध करना चाहिए। – Brett

+0

@ ब्रेट 'गैर 'या तो बहुत छोटा है, एक स्टॉपवर्ड या दोनों है। – Stoleg

+0

मेरा 'ft_min_word_len'' 2' पर सेट है और मैंने अपनी स्टॉप शब्द फ़ाइल अक्षम कर दी है ताकि परिणामों पर कोई प्रभाव न हो। – Brett

0

मैं यह कहना नफरत लेकिन आप LIKE का उपयोग करना होगा।

वाक्यांश खोज की आवश्यकता है केवल यह है कि मैचों वास्तव में होते हैं: नीचे मैं एक प्रश्न है कि पूर्ण-पाठ मोड का उपयोग कर के साथ

SELECT auction_id,`name` FROM auctions WHERE MATCH(`name`) AGAINST('+jordan' IN BOOLEAN 
MODE) AND `name` NOT LIKE('%non auto%') ; 

समस्या के लिए जिस तरह से आप यह चाहते काम करेंगे शामिल किया है MySQL के docs के अनुसार वह यह है कि वाक्यांश के समान शब्द और उसी क्रम में। उदाहरण के लिए, "परीक्षण वाक्यांश" माईएसQL 5.0.3 में "परीक्षण, वाक्यांश" से मेल खाता है, लेकिन इससे पहले नहीं।

यही कारण है कि आप मुसीबत में चला रहे हैं। उम्मीद है की यह मदद करेगा। संपादित करें: क्यों यह इस तरह से वास्तव में बर्ताव करता है के रूप में मैं कोई सुराग नहीं है (चीजें हैं जो ऑटो और गैर जहाँ वे एक दूसरे के सापेक्ष हैं की परवाह किए बिना शामिल छोड़कर), लेकिन यह एक तरह से यह डिफ़ॉल्ट ओवरराइड करने के लिए की बहुत वहाँ की तरह प्रतीत नहीं होता व्यवहार।

+0

हम्मम्म ...... वास्तव में मेरे लिए यह महत्वपूर्ण नहीं है कि मैं 'LIKE' का उपयोग करने के लिए जाऊंगा और गतिशील रूप से करने के लिए दर्द होगा। – Brett

+0

यह दर्द का इतना अधिक नहीं होगा। आप उपयोगकर्ता से, या कोड में कहीं और स्ट्रिंग प्राप्त करते हैं, और इसे समान स्थिति में%% से घिराते हैं, और आप सेट हैं। लेकिन मुझे नहीं पता कि आपको खोज के लिए इनपुट कैसे मिल रहा है, इसलिए शायद यह काम नहीं करेगा। –

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