मैं पिछले कुछ दिनों में पोस्टग्रेज में पूर्ण पाठ खोज पर आया हूं, और कई कॉलमों में खोज करते समय मैं अनुक्रमण के बारे में थोड़ा भ्रमित हूं।
पोस्टगर्म्स डॉक्सts_vector
को संक्षिप्त कॉलम पर एक इंडेक्स बनाने के बारे में बात करते हैं, जैसे:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
जो मैं ऐसा खोज सकता हूं:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
हालाँकि, अगर मैं कभी-कभी केवल शीर्षक, कभी-कभी सिर्फ शरीर और कभी-कभी दोनों को खोजना चाहता था, तो मुझे 3 अलग-अलग अनुक्रमितों की आवश्यकता होगी। और अगर मैंने तीसरे कॉलम में जोड़ा, तो संभवतः 6 इंडेक्स हो सकते हैं, और इसी तरह।
एक विकल्प जो मैंने डॉक्स में नहीं देखा है, बस दो कॉलमों को अलग-अलग अनुक्रमित करना है, और फिर बस एक सामान्य WHERE...OR
क्वेरी का उपयोग करें :
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
~ 1million पंक्तियों पर दो बेंचमार्किंग से लगता है कि मूल रूप से प्रदर्शन में कोई अंतर नहीं है।
तो मेरा सवाल है:
मैं व्यक्तिगत रूप से केवल अनुक्रमण स्तंभों के बजाय इस तरह अनुक्रमित क्यों करना चाहूंगा? दोनों के फायदे / नुकसान क्या हैं?
मेरा सबसे अच्छा अनुमान है कि अगर मुझे पहले से पता था कि मैं कभी भी दोनों कॉलम (कभी भी एक समय पर नहीं) खोजना चाहूंगा तो मुझे केवल एक इंडेक्स की आवश्यकता होगी जो कि कम मेमोरी का उपयोग करें।
title
प्रवेश करनाbody
और फिर अनुक्रमण करना बहुत अधिक मूल्य देगा, हालांकि मैं सुधार के लिए खुला हूं। मैं शायद उन्हें अलग से अनुक्रमित करने के साथ बस छड़ी करूंगा। इसके अलावा, यदि यह कुछ निराला था, जो किसी तरह आपको समाप्त करने की आवश्यकता थी, तो मुझे लगता है कि आप केवल क्वेरी तदर्थ चला सकते हैं।