2009-07-12 18 views
11

मेरे पास टेबल की एक श्रृंखला है जिसमें डेटा है जो मैं पूर्ण पाठ खोज चाहता हूं। मैंने UNION के साथ तालिकाओं को संयोजित करने का प्रयास किया है, लेकिन परिणाम इसकी पूर्णांक अनुक्रमणिका खो देता है इसलिए पूर्ण टेक्स्ट खोज नहीं किया जा सकता है। मुझे नहीं लगता कि डेटा को एक अस्थायी तालिका में डालने का तरीका है। क्या कोई ऐसा है कि मैं इन तालिकाओं को कुशलतापूर्वक खोज सकता हूं? अग्रिम में धन्यवाद!कई टेबलों में MySQL पूर्ण पाठ खोज

अद्यतन:

select * from table a where a.col=myval 
union 
select * from table b where b.col=myval 
.. 

सूचकांक के रूप में वे एक सामान्य चयन के साथ कर रहे हैं उपयोग किया जाता है: की प्रतिलिपि प्राप्त करने के लिए अपनी क्वेरी

SELECT ID, Title, Description, Author, MATCH (Title,Tags,Body) AGAINST ("search terms") AS Relevance 
FROM [combination of tables goes here] 
WHERE MATCH (Title,Tags,Body) AGAINST ("search terms") 
+0

आप अलग अलग तालिकाओं में एक ही बात के लिए देख रहे हैं या आप अलग अलग चीजों के लिए देख रहे हैं? आप कितने टेबल शामिल हैं? –

उत्तर

12

MySQL एकाधिक तालिकाओं में पूर्ण टेक्स्ट (या कोई भी) इंडेक्स नहीं बना सकता है। तो एक सूचकांक का उपयोग कर बाहर है।

एक विकल्प के रूप में, आप कर सकते थे या तो:

  1. पंक्तियों को आपकी आवश्यकताओं से मेल पुनः प्राप्त करने के रूप में उपयुक्त/संघ प्रत्येक मेज पर एक सूचकांक का उपयोग करें, और एक में शामिल हो।

  2. इंडेक्स को लागू करने के लिए एक समग्र तालिका बनाएं।

  3. अपनी खोज अनुक्रमणिका प्रदान करने के लिए लुसेन या सोलर जैसे टूल का उपयोग करें। (सबसे अच्छा विकल्प आप बड़े पैमाने पर किसी भी प्रकार के लिए जा रहे हैं, इस संभावना है)

+0

कम से कम 5.x शाखा में, उस इंडेक्स का उपयोग करने वाले जोड़ों में साइड इफेक्ट होता है कि फुलटेक्स्ट इंडेक्स का उपयोग नहीं किया जा सकता है। प्रश्नों को बल्कि अक्षम बनाता है। :/ – Rytmis

+0

दिलचस्प बात है - अनुमान लगाएं कि यह mysql का एक साइड इफेक्ट केवल प्रति तालिका एक इंडेक्स का उपयोग करने में सक्षम है। पूर्ण टेक्स्ट खोज के संदर्भ में कभी भी इसके बारे में कभी नहीं सोचा। – benlumley

+0

num एक वह है जो मैं करने की कोशिश कर रहा था, लेकिन इंडेक्स यूनियन के बाद गायब हो गया, नंबर दो वह है जो मैं नहीं करना चाहता था। यह समझने के लिए धन्यवाद कि मुझे क्या समझना शुरू हो रहा था – Samuel

1
अपने सेटअप किया जा रहा है कि तुम क्या तीन तालिकाओं (मुझे ठीक कर लें कि संदेश बोर्ड का एक प्रकार है मुझे लगता है प्रतीत होता है के साथ

मैं गलत हूँ):

  1. संदेश तालिका (message_id, शीर्षक, शरीर, विवरण, लेखक)
  2. टैग तालिका (Tag_ID, नाम)
  3. संदेश टैग (message_id, Tag_ID)

यहाँ मैं कैसे करेंगे यह

SELECT Message.Message_ID, Message.Title, Message.Description, Message.Author, 
    IFNULL( 
    MATCH (Name) 
    AGAINST (?) 
    , 
    IFNULL(
     MATCH (Message.Title) 
     AGAINST (?) 
     , 
     MATCH (Message.Body) 
     AGAINST (?) 
    ) 
) AS Relevance 
FROM Message, Tag, Message_Tag 
WHERE Message.Message_ID = Message_Tag.Message_ID AND Message_Tag.Tag_ID = Tag.Tag_ID 
    AND (
    MATCH (Name) 
    AGAINST (?) 
    OR 
    MATCH (Message.Title) 
    AGAINST (?) 
    OR 
    MATCH (Message.Body) 
    AGAINST (?) 
) 
3

प्रासंगिकता स्कोर एक साथ जोड़े है:

SELECT ID, Title, Description, Author, 
MATCH (Title) AGAINST ("search terms") + 
MATCH (Tags) AGAINST ("search terms") + 
MATCH (Body) AGAINST ("search terms") 
AS Relevance 
संबंधित मुद्दे