2011-09-08 12 views
6

कोई पूर्ण पाठ, MySQL विशेषज्ञ वहां से बाहर हैं?MySQL जुड़ता है और पूर्ण पाठ खोज

मैं एक सवाल कल कैसे एक बहुत मिलती है की, एक सा lazily, मैं वास्तव में एक प्रयास किया था के साथ पूर्ण पाठ खोज का उपयोग करने पर किसी भी सुझाव के लिए पूछ लिखा था।

तब से, मैं एक यह अपने आप माहिर, मेरे पूर्ण-पाठ क्षेत्रों के खिलाफ कुछ सफल परीक्षण प्रश्नों के निर्माण, पर एक अच्छा प्रयास किया है। यदि मैं किसी भी जॉइन का उपयोग नहीं करता हूं, और प्रत्येक फ़ील्ड को व्यक्तिगत रूप से पूछता हूं, तो पूर्ण-पाठ फ़ंक्शंस पूरी तरह से काम करता है और प्रासंगिकता/बुलियन महान प्रदर्शन के साथ भी बहुत अच्छा काम करता है ... लेकिन ... जैसे ही मैं पूर्ण क्वेरी चलाने के लिए अपनी जॉइन जोड़ता हूं , यह हमेशा के लिए चलता है।

किसी को भी मेरी क्वेरी में कुछ भी है कि ऐसा करने के लिए कारण हो सकता है स्पॉट जा सकता, क्योंकि एक शौकिया के रूप में, मैं वास्तव में नहीं देख सकते हैं!

SELECT 

photos.photoID, 
photos.headline, 
photos.dateCreated, 
MATCH (people.people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Rel1 

FROM photos 

LEFT JOIN (photoPeople INNER JOIN people ON photoPeople.peopleID = people.PeopleID) 
ON photos.photoID = photoPeople.photoID AND MATCH (people.people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 

WHERE 

photos.photoStatus = 'Live' 

GROUP BY 

photos.photoID 

ORDER BY Rel1 

यह मेरा सफल, व्यक्तिगत, प्रश्नों में से एक है:

SELECT 

photoID, 
headline, 
dateCreated, 
MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Relevance 

FROM photos 

WHERE 

photoStatus = 'Live' 

AND 

MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 

ORDER BY Relevance 

यह DB स्कीमा है:

photos (tbl) 
photoID    INT(11)   Primary  Auto-Increment 
headline   Long-Text 
caption    Long-Text/FULLTEXT 
dateCreated   DateTime 

people (tbl) 
peopleID   INT(11)   Primary  Auto-Increment 
people    VarChar(255)/FULLTEXT 

photoPeople (tbl) 
photoID    INT(11) 
peopleID   INT(11) 

keywords (tbl) 
keywordID   INT(11)   Primary  Auto-Increment 
keyword    VarChar(255)/FULLTEXT 

photoKeyword (tbl) 
photoID    INT(11) 
keywordID   INT(11) 

photoContributor (tbl) 
photoID    INT(11) 
contributorRef  VarChar(100)/FULLTEXT 

और ये मेरे प्रिंट व्याख्या बाहर है:

 
id select_type   table    type  possible_keys  key  key_len  ref  rows 
1 SIMPLE    photos    ALL   NULL    NULL  NULL  NULL  89830 
1 SIMPLE    photoContributor ALL   NULL    NULL  NULL  NULL  149635 
1 SIMPLE    photoPeople   ALL   NULL    NULL  NULL  NULL  110606 
1 SIMPLE    people    eq_ref  PRIMARY    PRIMARY  4  1 
1 SIMPLE    photoKeyword  ALL   NULL    NULL  NULL  NULL  699102 
1 SIMPLE    keywords   eq_ref  PRIMARY    PRIMARY  4  1 

मेरी वेबसाइट आगंतुक को सक्षम होना चाहिए के लिए खोजें: "ब्रैड पिट एंजेलीना जोली डोरचेस्टर होटल धूप का चश्मा @ एमजी" - इसे 'लोगों। लोगों' तालिका से और "फोटो कैप्शन 'तालिका से" ब्रैड पिट "और" एंजेलीना जोली "मिलना चाहिए। इसे 'photos.caption' तालिका से "Dorchester Hotel", 'keyword.keyword' तालिका से "धूप का चश्मा" भी मिलना चाहिए और आखिरकार, इसे 'photoContributor.contributorRef' तालिका में "@MG" मिलना चाहिए।

इस पर कोई मदद कृतज्ञता प्राप्त की जाएगी ...

+0

'चयन व्याख्या जोड़ें ...' अपने प्रश्न – sanmai

+0

के संदर्भ के लिए, यदि आप वास्तव में के लिए कहा बुनियादी जानकारी बदले बिना, एक सवाल पर विस्तार कर रहे हैं, तो आप सिर्फ मूल संपादित करना चाहिए, न कि नए सिरे से शुरू। – Orbling

+0

आपको उन तालिकाओं के लिए स्कीमा पेस्ट करने की आवश्यकता है ('तालिका बनाएं' क्वेरी का परिणाम ठीक होना चाहिए)। इसके अलावा, स्पष्ट होने के लिए, ऐसा लगता है कि आप MyISAM की पूर्ण टेक्स्ट इंडेक्सिंग का उपयोग कर रहे हैं? – TehShrike

उत्तर

3

मैं छोटे प्रश्नों को अलग उपयोग करते हुए और एक संयुक्त परिणाम सेट बनाने के लिए यूनिअन उपयोग करने का सुझाव।

यहां एक समान कार्य के साथ एक और सवाल है। Mysql Full text search across more than one table

अद्यतन

SELECT "Photos" AS TableName, photoID AS ID, MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Relevance 
FROM photos 
UNION ALL 
SELECT "People" AS TableName, peopleID AS ID, MATCH (people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 
FROM people 
UNION ALL 
SELECT "Keyword" AS TableName, keywordID AS ID, MATCH (keyword) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 
FROM keyword 

मैं वास्तव में नहीं जानता कि कौन-सा डेटा है, लेकिन ऐसा लगता है जैसे कुछ का उत्पादन होगा:

तालिका नाम | आईडी | प्रासंगिकता

तस्वीरें | 1 | 1

तस्वीरें | 2 | 0

लोग | 1 | 1

कीवर्ड | 10 | 1

आप अतिरिक्त आवश्यकताओं को जोड़ सकते हैं जहां आपकी आवश्यकताओं के अनुरूप है लेकिन यह मूल विचार है।

+0

लेकिन यूनियन एक ही कॉलम के साथ परिणामों में शामिल नहीं होता है। मेरे द्वारा पूछे जाने वाले सभी टेबल में अलग-अलग कॉलम हैं ... – TheCarver

+0

संघ के लिए आवश्यक है कि कॉलम का एक ही डेटा प्रकार समान नाम न हो। – Jrod

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे यकीन नहीं है कि कैसे इस प्रकार की खोज में इसे लागू करने के लिए मेरे पास – TheCarver

0

मैं सुझाव देता हूं कि MySQL का उपयोग न करें और इसके बजाय वास्तविक एफटीएस समाधान का उपयोग करें, जैसे ल्यूसीन, जिसे अक्सर MySQL के साथ जोड़ा जाता है जो MySQL में FTS चाहते हैं। https://stackoverflow.com/questions/553055/best-full-text-search-for-mysql

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