कई स्तंभों के साथ पूर्ण पाठ खोज को स्थगित करता है, अनुक्रमणिका में क्यों नहीं होता है और रनटाइम पर नहीं होता है?


11

मैं पिछले कुछ दिनों में पोस्टग्रेज में पूर्ण पाठ खोज पर आया हूं, और कई कॉलमों में खोज करते समय मैं अनुक्रमण के बारे में थोड़ा भ्रमित हूं।

पोस्टगर्म्स डॉक्स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और फिर अनुक्रमण करना बहुत अधिक मूल्य देगा, हालांकि मैं सुधार के लिए खुला हूं। मैं शायद उन्हें अलग से अनुक्रमित करने के साथ बस छड़ी करूंगा। इसके अलावा, यदि यह कुछ निराला था, जो किसी तरह आपको समाप्‍त करने की आवश्‍यकता थी, तो मुझे लगता है कि आप केवल क्वेरी तदर्थ चला सकते हैं।
swasheck

आप अपने अनुमान में सही हैं। मैं आपको आत्म-उत्तर देने के लिए प्रोत्साहित करूंगा यदि कोई और नहीं करता है, तो यहां पर जोपारी शैली।
jcolebrand

जवाबों:


4

नहीं, आपको अलग इंडेक्स की आवश्यकता नहीं है। वजन सुविधा का उपयोग करें। वे सिर्फ एक लेबल हैं जिसके खिलाफ आप क्वेरी कर सकते हैं। आपके पास (AD) से क्वेरी करने के लिए अधिकतम चार लेबल हो सकते हैं।

--search any "field" for quick:
select 'quick:1A brown:2B quick:3C'::tsvector @@ 'quick'::tsquery; --true

--search B "field" for quick:
select 'quick:1A brown:2B quick:3C'::tsvector @@ 'quick:B'::tsquery; --false

--search B or C "fields" for quick:
select 'quick:1A brown:2B quick:3C'::tsvector @@ 'quick:BC'::tsquery; --true

आप tsvectors को संक्षिप्त करना चाह सकते हैं, ताकि आप अलग से उन पर भार लागू कर सकें और फिर उन्हें एक साथ रख सकें:

select
  setweight( name_column::tsvector, 'A') || setweight( phone_column::tsvector, 'B');

3

वास्तव में विकल्प यह होगा कि OR का उपयोग कहां किया जाए , और AND के साथ नहीं ।

यदि आपके पास tsvector (बॉडी + शीर्षक) पर सूचकांक है, और आप इसे खोज रहे हैं, तो खोजे गए शब्द शीर्षक में या शरीर में हो सकते हैं ।

इसके अलावा - परीक्षण करते समय, सुनिश्चित करें कि आपके पास तालिका में उचित संख्या में पंक्तियाँ हैं।

सबसे सरल मामला जो अच्छा अंतर दिखाना चाहिए: दो शब्द खोजें - उनमें से एक जो शीर्षक में होने की बहुत संभावना है। और दूसरा - जो शरीर में होने की बहुत संभावना है। लेकिन सुनिश्चित करें कि दोनों मानदंडों से मेल खाने वाली पंक्तियों में बहुत कुछ नहीं है। उदाहरण के लिए - आपके शरीर में 30% शब्द "डिपेज़" हो सकते हैं। आपके पास शीर्षक में "mysql" होने की ~ 30% संभावना है। लेकिन एक ही पंक्ति में किसी भी फ़ील्ड में "डिपेज़ और मायस्कल" होने की संभावना बहुत कम है। और फिर ऐसे इंडेक्स के साथ प्रदर्शन की जांच करें।


हा, अच्छा स्पॉट, ओआरएस बनाम और मैं सवाल को अपडेट करूंगा। मैंने इसे 1Million पंक्तियों के साथ किया - परेशान करने के लिए किसी और के इंतजार में परेशान नहीं किया जा सकता :) :)
latentflip

1
डिप्स द्वारा छोड़ने के लिए धन्यवाद - हम इन दिनों काफी कुछ पोस्टग्रेज प्रश्न कर रहे हैं, इसलिए मुझे आशा है कि आप चारों ओर
चिपकेंगे

@ जेक: मुझे यकीन नहीं है - मुझे स्टैकटेक्चेंज साइटें कम और कम उपयोग करने योग्य लगीं। मैं आमतौर पर आरएसएस प्राप्त करने की कोशिश करता हूं, लेकिन स्टैटेक्सचेंज साइटों पर आरएसएस बहुत बेकार है - पुराने प्रश्नों के संस्करण से इतना प्रदूषण।

मैंने आपके लिए यहाँ एक आरएसएस फ़ीड बनाया है - क्या आप इसे आजमाना चाहते हैं? मैं सामान को छान में प्रयास आप में आप और अधिक साइट में :-) शामिल रही करने का मौका हासिल करने के लिए रुचि होने की संभावना नहीं है डाल करने के लिए खुश हूँ
जैक topanswers.xyz कोशिश कहते हैं

जैक :) मैं काटता हूँ - सदस्यता ली है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.