2010-02-09 8 views
12

यह एक बहुत ही सरल सवाल हो सकता है, इसलिए अग्रिम माफ़ी, लेकिन मैं डेटाबेस उपयोग के लिए बहुत नया हूं।पोस्टग्रेस एकाधिक संबंधित तालिकाओं में पूर्ण पाठ खोज

मैं पोस्टग्रेज़ को एकाधिक जुड़ाव तालिकाओं में अपनी पूर्ण पाठ खोज चलाने की इच्छा रखता हूं। मॉडल मॉडल की तरह कुछ कल्पना करें, संबंधित मॉडल UserProfile और UserInfo के साथ। खोज केवल उपयोगकर्ताओं के लिए होगी, लेकिन इसमें UserProfile और UserInfo से जानकारी शामिल होगी।

मैं खोज के लिए एक जीन इंडेक्स का उपयोग करने की योजना बना रहा हूं। हालांकि, मैं स्पष्ट नहीं हूं कि क्या मुझे तालिका तालिका में समेकित tsvectors को पकड़ने के लिए उपयोगकर्ता तालिका में एक अलग tsvector कॉलम की आवश्यकता होगी, और इसे अद्यतित रखने के लिए ट्रिगर सेट अप करने के लिए। या यदि एक tsvector कॉलम के बिना एक इंडेक्स बनाना संभव है जो किसी भी प्रासंगिक तालिका में किसी भी प्रासंगिक फ़ील्ड में बदलते समय भी खुद को अद्यतित रखेगा। इसके अलावा, यह सब कुछ बनाने के लिए कमांड के सिंटैक्स पर कोई सुझाव भी बहुत सराहना की जाएगी।

उत्तर

8

आपका सबसे अच्छा जवाब शायद प्रत्येक तालिका में एक अलग tsvector कॉलम होना चाहिए (निश्चित रूप से एक सूचकांक के साथ)। यदि आप किसी साझा किए गए सॉवेक्टर तक डेटा एकत्र करते हैं, तो जब भी व्यक्ति अपडेट होते हैं तो उस साझा किए गए किसी भी अपडेट पर बहुत सारे अपडेट बनाए जाएंगे।

आपको प्रति तालिका एक सूचकांक की आवश्यकता होगी। फिर जब आप इसे पूछते हैं, तो जाहिर है कि आपको प्रत्येक क्षेत्र के लिए एक से अधिक WHERE क्लॉज की आवश्यकता होती है। PostgreSQL तब स्वचालित रूप से पता लगाएगा कि इंडेक्स का कौन सा संयोजन आपको सबसे तेज़ परिणाम देने के लिए उपयोग करता है - संभवतः बिटमैप स्कैनिंग का उपयोग कर। यह आपके प्रश्नों को लिखने के लिए थोड़ा और जटिल बना देगा (क्योंकि आपको कई कॉलम मिलान खंडों की आवश्यकता है), लेकिन यह उन मामलों में केवल कुछ क्षेत्रों को पूछने के लिए लचीलापन रखता है जहां आप चाहते हैं।

आप एक सारणी नहीं बना सकते जो एकाधिक तालिकाओं को ट्रैक करता है। ऐसा करने के लिए आपको इसे अद्यतन करने के लिए प्रत्येक तालिका पर अलग tsvector कॉलम और ट्रिगर्स की आवश्यकता है।

+2

क्या आप पढ़ सकते हैं कि कैसे पढ़ा गया प्रश्न काम करेगा? मैं कई तालिकाओं में postgresql पूर्ण-पाठ खोज करने के सर्वोत्तम तरीके पर दस्तावेज़ ढूंढने का प्रयास कर रहा हूं और मुझे बहुत कुछ नहीं मिल रहा है। एक समस्या में मैंने भाग लिया कि अगर मैं उन सभी तालिकाओं पर एक इंडेक्स सेट करता हूं जो मैं पूछताछ कर रहा था, तो पोस्टग्रेस्क्ल एक क्वेरी करते समय सभी इंडेक्स का उपयोग करने में सक्षम नहीं था। पसंद करें: उपयोगकर्ताओं पर शामिल बाएं आदेशों से * चुनें * ... line_items पर शामिल हों ... जहां ts_vector ('english', order.id) @@ ... या ts_vector ('english', users.name) @@। .. –

+1

मैं यह भी देखता हूं कि दो तालिकाओं में खोजी जाने वाली क्वेरी अनुक्रमिक स्कैन करती है ('SELECT COUNT (*) उत्पादों से जहां Itsvector (' simple ', products.name::text) @@ to_tsquery (' simple ',' foo ':: टेक्स्ट);'), जबकि एक टेबल खोजने वाली क्वेरी केवल इंडेक्स का उपयोग करके बिटमैप इंडेक्स स्कैन करती है (उत्पादों से 'चुनें COUNT (*) उत्पादों पर ब्रांडों में शामिल हों .brand_id = brand.id जहां to_tsvector (' simple ' , products.name::text) @@ to_tsquery ('simple', 'foo' :: text) या to_tsvector ('simple', brand.name::text) @@ to_tsquery ('simple', 'foo' :: पाठ); ')। – wvengen

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