क्या सभी प्रश्नों को शब्दकोश में होना चाहिए?
नहीं, क्योंकि केवल शब्द उपजी (उपयोग किए गए पाठ खोज कॉन्फ़िगरेशन के अनुसार ) के साथ शुरू करने के लिए सूचकांक में हैं। लेकिन अधिक महत्वपूर्ण बात है कि:
नहीं । क्योंकि, उस पूर्ण पाठ खोज के शीर्ष पर भी उपसर्ग मिलान करने में सक्षम है :
यह काम करेगा:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
नोट 3 चीजें:
इस मामले में उपयोग करें to_tsquery()
, नहीं plainto_tsquery()
, क्योंकि ( मैनुअल उद्धृत करते हुए ):
... इसके इनपुट में ऑपरेटरों, भार लेबल, या उपसर्ग-मिलान लेबल plainto_tsquery
को नहीं पहचानेंगेtsquery
का प्रयोग करें 'simple'
उत्पन्न करने के लिए पाठ खोज विन्यास tsquery
के बाद से आपको स्पष्ट रूप से शब्द ले जाना चाहते हैं 'लाभ' के रूप में है और उत्पन्न लागू नहीं।
संलग्न :*
यह एक उपसर्ग खोज बनाने के लिए, यानी साथ 'लाभ' शुरू करने सभी शब्दिम पाते हैं।
महत्वपूर्ण: यह दस्तावेज़ में lexemes (शब्द उपजा) पर एक उपसर्ग खोज है। वाइल्डकार्ड ( content ~* 'avail'
) के बिना एक नियमित अभिव्यक्ति मैच बिल्कुल समान नहीं है! उत्तरार्द्ध वाम-लंगर (लेक्समेस की शुरुआत के लिए) नहीं है और यह भी 'फुआवैल' आदि का पता लगाएगा।
यह स्पष्ट नहीं है कि आप अपनी क्वेरी में उल्लिखित व्यवहार या अतिरिक्त नियमित अभिव्यक्ति के बराबर चाहते हैं। पहले से ही सुझाए गए @Evan कीpg_trgm
तरह ट्रिग्राम इंडेक्स ( ) उसके लिए सही टूल हैं। Dba.SE पर कई संबंधित प्रश्न हैं, एक खोज का प्रयास करें ।
अवलोकन:
डेमो
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
हाल के संबंधित उत्तर ( खोज को अनुकूलित करने के लिए अध्याय अलग-अलग दृष्टिकोण ):
ईमेल?
चूंकि आपने ईमेल का उल्लेख किया है, इसलिए ध्यान रखें कि टेक्स्ट सर्च पार्सर ईमेल की पहचान करता है और उन्हें अलग-अलग शब्दों / लेक्मे में विभाजित नहीं करता है। विचार करें:
SELECT ts_debug('english', 'xangr@some.domain.com')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
मैं विभाजक @
और .
आपके ईमेल में स्थान ( ' '
) को निहित शब्दों को अनुक्रमणित करने के लिए प्रतिस्थापित करूंगा ।
इसके अलावा, जब से आप ईमेल में नामों के साथ काम कर रहे हैं , अंग्रेजी (या कुछ अन्य भाषा) शब्दों के साथ नहीं , मैं 'simple'
पाठ खोज कॉन्फ़िगरेशन का उपयोग करने के लिए उपजी और अन्य भाषा सुविधाओं को अक्षम करूंगा :
इसके ts_vector
साथ कॉलम बनाएँ :
SELECT to_tsvector('simple', translate('joe.xangr@some.domain.com', '@.', ' ')) AS tsv;
:*
प्रलेखित है, और 2) कोto_tsvector('simple'..)
निर्देश के साथ हाथ से निर्माण करने के लिए एक उल्लेख नहीं करना चाहिए कि भविष्य में उस tsv की क्वेरी को 'सरल' विन्यास भी tsquery की आवश्यकता होगी? मुझे लगता है कि आपको एक tsvector / tsquery पर स्टेमिंग को अक्षम करने के प्रभावों को स्पष्ट करना चाहिए।