2013-07-03 4 views
7

मेरे पास एक खोज क्वेरी है जो डीबी पर पूर्ण टेक्स्ट खोज करता है।कई कॉलम पर MySQL पूर्ण टेक्स्ट खोज: परिणाम भ्रम

$sql = "SELECT 
* 
FROM 
`tbl_auction_listing` AS `al` 
JOIN 
`tbl_user` AS `u` ON `al`.`user_id` = `u`.`user_id` 
LEFT JOIN 
`tbl_gallery_details` AS `gd` ON `al`.`user_id` = `gd`.`user_id` 
LEFT JOIN 
`tbl_self_represented_details` AS `sr` ON `u`.`user_id` = `sr`.`user_id` 
WHERE 
`al`.`status` = '" . ACTIVE . "' 
AND 
`al`.`start_date` < NOW() 
AND 
`al`.`end_date` > NOW() 
AND 
MATCH(`al`.`listing_title`, 
`al`.`description`, 
`al`.`provenance`, 
`al`.`title`, 
`al`.`artist_full_name`, 
`al`.`artist_first_name`, 
`al`.`artist_last_name`, 
`sr`.`artist_name`, 
`gd`.`gallery_name`, 
`u`.`username`) AGAINST('$search_query' IN BOOLEAN MODE)"; 

जब मैं 'कार्डोजो, होरासियो' या 'कार्डोजो' या 'होरासियो' के लिए खोज मैं कोई परिणाम नहीं लेकिन मैं जानता हूँ कि artist_full_name = कार्डोजो, होरासियो साथ DB में 2 रिकॉर्ड के साथ एक कलाकार है मिलता है।

यदि मैं सभी MATCH फ़ील्ड को हटा देता हूं और केवल al है। artist_full_name मुझे 2 परिणाम मिलते हैं। अगर मैं al में जोड़ता हूं। description मुझे 1 परिणाम मिलता है क्योंकि विवरण में 'होरासियो कार्डोजो' मौजूद है।

क्या किसी भी स्थिति (कोई खोज क्वेरी शब्द) किसी भी MATCH फ़ील्ड में मिलने पर खोज को वापस करने का कोई तरीका है? मैंने इन बूलेन मोड को हटाने का प्रयास किया लेकिन उसने एक ही परिणाम उत्पन्न किए।

+0

'इन बूलेन मोड 'के बजाय,' प्राकृतिक भाषा मोड में ' –

+0

' प्राकृतिक भाषा मोड में 'डिफ़ॉल्ट मोड (यानी जब कोई मोड निर्दिष्ट नहीं किया गया है) – RandomSeed

+0

अभी भी खोज करते समय 0 परिणाम उत्पन्न करता है।मैंने जांच की है कि डीबी में सभी फ़ील्ड पूर्ण टेक्स्ट हैं लेकिन अभी भी कुछ भी नहीं है। – puks1978

उत्तर

15

ऐसा प्रतीत होता है कि InnoDB तालिकाएं MATCH() स्थिति में कई पूर्ण टेक्स्ट इंडेक्स पर खोजों की अनुमति नहीं देती हैं।

यहां आपके फ़ील्ड सभी एक ही तालिका से संबंधित नहीं हैं, इसलिए वे विभिन्न अनुक्रमणिका द्वारा कवर किए गए हैं। सूचना यदि आप इस तरह एक मेज था एक ही सीमा लागू होता है:

CREATE TABLE t (
    f1 VARCHAR(20), 
    f2 VARCHAR(20), 
    FULLTEXT(f1), FULLTEXT(f2) 
) ENGINE=InnoDB; 

SELECT * FROM t 
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row 

यह एक प्रतिलिपि प्राप्त खोज केवल पहले की प्रतिलिपि प्राप्त सूचकांक यह मुठभेड़ों पर खोज कर सकते हैं की तरह लग रहा है, लेकिन यह केवल कुछ मैं घटा from this experience है, तो कृपया इसे मंजूरी के लिए मत लें।

SELECT * FROM auction, user, gallery, ... 
WHERE 
    MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR 
    MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR 
    MATCH(user.field1, user.field2, user.field3) AGAINST... 

अगर आप auction और एक पर दो अलग-अलग अनुक्रमित था एक संभव क्वेरी का एक उदाहरण है:

मुनाफे है कि आप इतनी के रूप में प्रति MATCH() खंड एक एकल प्रतिलिपि प्राप्त सूचकांक का उपयोग करने के लिए अपनी खोज विभाजित करना चाहिए है user पर एक। आपको इसे अपनी वास्तविक संरचना में अनुकूलित करने की आवश्यकता है (यदि आपको अधिक मार्गदर्शन की आवश्यकता है तो कृपया अपने टेबल के विवरण पोस्ट करें)।

नोटिस यह केवल इनो डीबी टेबल पर लागू होता है। दिलचस्प बात यह है कि, माईसाम टेबल do not seem to show the same limitation


अद्यतन: यह पता चला है इस a bug in the InnoDB engine था, 5.6.13/5.7.2 में तय की। उपर्युक्त उदाहरण अब "कॉलम सूची से मेल खाने वाले FULLTEXT अनुक्रमणिका को नहीं ढूंढ सकता" के साथ सही तरीके से विफल रहता है। वास्तव में, (f1, f2) पर कोई अनुक्रमणिका नहीं है, लेकिन (f1) पर एक और (f2) पर कोई दूसरा है। As the changelog advises:

MyISAM के विपरीत, InnoDB nonindexed स्तंभों पर बूलियन पूर्ण-पाठ खोज का समर्थन नहीं करता, लेकिन यह प्रतिबंध लागू नहीं किया गया था, क्वेरी, जो गलत परिणाम लौटे में जिसके परिणामस्वरूप।

यह उल्लेखनीय है कि इस तरह के प्रश्न MyISAM के साथ एक सही परिणाम सेट लौटाते हैं, वे they silently ignore existing fulltext indexes के रूप में अपेक्षाकृत धीमी गति से चलते हैं।

+0

मैं उस शब्द के बाद कुछ भी प्राप्त करने के लिए * का उपयोग कर सकता हूं लेकिन क्या शब्दों को प्राप्त करने का कोई तरीका है जहां खोज क्वेरी शब्द के मध्य में शुरू हो सकती है? उदाहरण के लिए: क्वेरी = पीपल रिटर्न परिणाम 'सेब' – puks1978

+0

आप एक खोज स्थिति का उपयोग कर सकते हैं जैसे: '... जहां फ़ील्ड LIKE'% pple'' ('%' वाइल्डकार्ड है) लेकिन ऐसी क्वेरी पूर्ण टेक्स्ट इंडेक्स का उपयोग नहीं कर सकती है (न ही एक नियमित सूचकांक)। "[MySQL सूचकांक का उपयोग नहीं कर सकता अगर कॉलम इंडेक्स का बायां सबसे उपसर्ग नहीं बनाते हैं] (http://dev.mysql.com/doc/refman/5.6/en/mysql-indexes.html)" (यह कथन है प्रारंभ में मल्टी-कॉलम इंडेक्स का वर्णन करना था, लेकिन यह आंशिक अनुक्रमणिका के लिए वास्तव में एक ही विचार है)। – RandomSeed

+0

एकाधिक 'मिलान ... या मैच ...' अनुभागों का उपयोग करने के लिए आपका सुझाव 'कहां' खंड में मायिसम को इंडेक्स का उपयोग करने से रोकने के लिए लगता है। 'संघ' के साथ स्वतंत्र प्रश्न बेहतर काम करता है। ई, जी, 'rsspodcastitems से चुनें * जहां शीर्षक ("सब्जियां") के खिलाफ मैच शीर्षक ("सब्ज़ियां") के खिलाफ मैच शीर्षक (> सब्जियां ") के खिलाफ मिलान करें -> सेट में 16 पंक्तियां (2.46 सेकेंड)' जबकि' rsspodcastitems से चुनें * जहां शीर्षक शीर्षक ("सब्जियां") यूनियन का चयन करें * rsspodcastitems से जहां मिलान उपशीर्षक ("सब्जियां") -> सेट में 16 पंक्तियां (0.02 सेकंड) '। – Jules

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