2013-04-08 7 views
16

मैं पोस्टग्रेएसक्यूएल, पूर्ण पाठ खोज और ट्रिग्राम की पूरी अवधारणा के साथ थोड़ा उलझन में हूं। मेरा पूरा पाठ खोज क्वेरी में, मैं tsvectors उपयोग कर रहा हूँ, इसलिए जैसे:पोस्टग्रेएसक्यूएल पूर्ण पाठ खोज और ट्रिग्राम भ्रम

SELECT * FROM articles 
WHERE search_vector @@ plainto_tsquery('english', 'cat, bat, rat'); 

समस्या है, इस विधि गलत वर्तनी के लिए खाते में नहीं है। फिर मैंने Trigram and pg_trgm:

अन्य उदाहरणों के माध्यम से पढ़ना शुरू किया, ऐसा लगता है जैसे ट्रिगर का उपयोग किया जाता है या वैक्टर का उपयोग किया जाता है, लेकिन दोनों कभी नहीं। तो मेरे प्रश्न हैं: क्या वे कभी एक साथ उपयोग किए जाते हैं? यदि हां, तो कैसे? क्या ट्रिग्राम पूर्ण पाठ को प्रतिस्थापित करता है? क्या ट्रिग्राम अधिक सटीक हैं? और प्रदर्शन पर ट्रिग्राम कैसे हैं?

उत्तर

29

वे बहुत अलग उद्देश्यों की सेवा करते हैं।

  • पूर्ण टेक्स्ट खोज का उपयोग उन दस्तावेजों को वापस करने के लिए किया जाता है जो स्टेमड शब्दों की खोज क्वेरी से मेल खाते हैं।
  • ट्रिग्राम आपको दो तारों की तुलना करने और यह निर्धारित करने के लिए एक तरीका देता है कि वे कितने समान दिखते हैं।

पर विचार करें निम्न उदाहरण:

SELECT 'cat' % 'cats'; --true 

ऊपर रिटर्न सच क्योंकि 'cat' (के रूप में pg_trgm सीमा से निर्धारित) काफी 'cats' के समान है।

SELECT 'there is a cat with a dog' % 'cats'; --false 

ऊपर रिटर्न false क्योंकि % इसी तरह दो पूरे तार के बीच, शब्द cats स्ट्रिंग के भीतर के लिए नहीं देख रहा है।

SELECT to_tsvector('there is a cat with a dog') @@ to_tsquery('cats'); --true 

यह true रिटर्न becauase tsvector एक सूची में स्ट्रिंग तब्दील उपजी शब्द और आम शब्दों का एक समूह (शब्द रोक - जैसे 'है' & 'एक') को नजरअंदाज कर दिया की ... तो उपजी संस्करण के लिए खोज की cats का।

ऐसा लगता है कि आप ऑटो-सही पर अपने ts_query पर ट्रिग्राम का उपयोग करना चाहते हैं, लेकिन यह वास्तव में संभव नहीं है (वैसे भी किसी भी कुशल तरीके से नहीं)। वे वास्तव में नहीं जानते हैं एक शब्द गलत है, बस यह एक और शब्द के समान कैसे हो सकता है। वे शब्दों का एक सारणी खोजने के लिए शब्दों का एक टेबल खोजने के लिए इस्तेमाल किए जा सकते हैं, जिससे आप "क्या मतलब है ..." प्रकार की सुविधा को लागू करने की अनुमति दे सकते हैं, लेकिन इस शब्द को एक अलग तालिका को बनाए रखने की आवश्यकता है जिसमें आपके द्वारा उपयोग किए जाने वाले सभी शब्द शामिल हैं search फ़ील्ड।

आप कुछ सामान्य रूप से misspelt शब्दों/वाक्यांशों कि आप मैच के लिए आप Synonym Dictorionaries

+0

को देखने के लिए चाहते हो सकता है मैं '%' और 'के बीच मतभेदों को उजागर करने के लिए उदाहरण के एक जोड़े को जोड़ दिया है पाठ सूचकांक चाहते हैं, तो प्रत्येक एक्सटेंशन से @@ '। यदि आपका उद्देश्य उन दस्तावेजों को ढूंढना है जिनमें अंग्रेजी है (या किसी ज्ञात भाषा के लिए जो आपके पास शब्दकोश है) तो आप पूर्ण-पाठ के बाद हैं। यदि आपका लक्ष्य पूरे क्षेत्र की स्ट्रिंग के खिलाफ पूरे क्षेत्र से मिलान करना है, तो टाइपो के लिए थोड़ा सा लेवेइग के साथ, तो pg_trgm वह है जो आप चाहते हैं। –

+0

स्पष्टीकरण के लिए धन्यवाद! इसने इसे बहुत साफ कर दिया। ठीक है तो ऐसा लगता है कि शब्दकोशों के बारे में अपने ज्ञान का विस्तार करके समस्या हल हो सकती है। –

+1

+1 अच्छा, स्पष्ट उत्तर। –

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