GIN अनुक्रमित TSVECTOR कॉलम से आंशिक मिलान प्राप्त करें


13

मैं इसे क्वेरी द्वारा परिणाम प्राप्त करना चाहूंगा:

SELECT * FROM (
  SELECT id, subject
  FROM mailboxes
  WHERE tsv @@ plainto_tsquery('avail')
) AS t1 ORDER by id DESC;

यह काम करता है और tsvयुक्त पंक्तियों को वापस करता है Available। लेकिन अगर मैं उपयोग करता हूं avai(गिरा lable) तो यह कुछ भी नहीं पा सकता है।

क्या सभी प्रश्नों को शब्दकोश में होना चाहिए? क्या हम इस तरह के पत्रों को केवल क्वेरी नहीं कर सकते हैं? मेरे पास एक डेटाबेस है जिसमें ई-मेल बॉडी (कंटेंट) है और मैं इसे हर पल तेजी से बढ़ाना चाहूंगा। वर्तमान में मैं उपयोग कर रहा हूं

... WHERE content ~* 'letters`

जवाबों:


22

क्या सभी प्रश्नों को शब्दकोश में होना चाहिए?

नहीं, क्योंकि केवल शब्द उपजी (उपयोग किए गए पाठ खोज कॉन्फ़िगरेशन के अनुसार ) के साथ शुरू करने के लिए सूचकांक में हैं। लेकिन अधिक महत्वपूर्ण बात है कि:

नहीं । क्योंकि, उस पूर्ण पाठ खोज के शीर्ष पर भी उपसर्ग मिलान करने में सक्षम है :

यह काम करेगा:

SELECT id, subject
FROM   mailboxes
WHERE  tsv @@ to_tsquery('simple', 'avail:*')
ORDER  BY id DESC;

नोट 3 चीजें:

  1. इस मामले में उपयोग करें to_tsquery(), नहीं plainto_tsquery(), क्योंकि ( मैनुअल उद्धृत करते हुए ):

    ... इसके इनपुट में ऑपरेटरों, भार लेबल, या उपसर्ग-मिलान लेबल plainto_tsqueryको नहीं पहचानेंगेtsquery

  2. का प्रयोग करें 'simple'उत्पन्न करने के लिए पाठ खोज विन्यास tsqueryके बाद से आपको स्पष्ट रूप से शब्द ले जाना चाहते हैं 'लाभ' के रूप में है और उत्पन्न लागू नहीं।

  3. संलग्न :*यह एक उपसर्ग खोज बनाने के लिए, यानी साथ 'लाभ' शुरू करने सभी शब्दिम पाते हैं।

महत्वपूर्ण: यह दस्तावेज़ में 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;

मैं इसके लिए अपना जवाब हटा रहा हूं क्योंकि दोनों ही तरह से क्योंकि मैं पहली बार स्पष्ट रूप से गलत हूं और मुझे इसके बारे में याद नहीं होगा। मेरे पास आपके लिए दो प्रश्न हैं 1) कहां से :*प्रलेखित है, और 2) को to_tsvector('simple'..)निर्देश के साथ हाथ से निर्माण करने के लिए एक उल्लेख नहीं करना चाहिए कि भविष्य में उस tsv की क्वेरी को 'सरल' विन्यास भी tsquery की आवश्यकता होगी? मुझे लगता है कि आपको एक tsvector / tsquery पर स्टेमिंग को अक्षम करने के प्रभावों को स्पष्ट करना चाहिए।
इवान कैरोल

@EvanCarroll: 'सरल' कॉन्फ़िगरेशन का उपयोग करने की आवश्यकता नहीं है । यह सिर्फ स्टेमिंग से बचता है (जैसे 'चूहे' से 'चूहे' तक) जो वांछनीय हो भी सकता है और नहीं भी। दिए गए उदाहरण के लिए वांछनीय नहीं है। मैनुअल: मैंने ऊपर लिंक जोड़ दिए हैं ...
इरविन ब्रांडस्टैटर

4
@EvanCarroll: एक तरफ: यह सोचते हुए कि आप पहली बार गलत हैं , दूसरी बार होगा। और यह गलत होगा, पुनरावर्ती होगा। ;)
एरविन ब्रैंडस्टैटर

2
@ErwinBrandstetter, वाह, आपके रास्ते ने मुझे पूरी गति दी। अपने तरीके से पहले यह 0.380msपरिणाम प्राप्त करने के लिए ले गया। तुम्हारे जाने के बाद यह लिया 0.079 ms
xangr

1
@xangr: नहीं, FTS केवल lexemes के लिए उपसर्ग मिलान प्रदान करता है । कुछ और के लिए, देखो pg_trgm। एफटीएस तेज (एक छोटे सूचकांक के साथ) है। तुम भी दोनों अनुक्रमित गठबंधन कर सकते हैं ...
Erwin Brandstetter
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.