2009-09-28 10 views
12

मान लीजिए कि आप एक postgres 8.3 तालिका इस प्रकार करते हैं:आप पोस्टग्रेज़ में वाक्यांश-आधारित पूर्ण पाठ खोज कैसे करते हैं जो पूर्ण-पाठ अनुक्रमणिका का लाभ उठाता है?

CREATE TABLE t1 (body text, body_vector tsvector);

मैं पूरा टेक्स्ट सूचकांक (सार, जिन या दोनों tsvector स्तंभ पर) का उपयोग वाक्यांशों के लिए यह खोज करने के लिए सक्षम होना चाहते हैं। सबसे अच्छा कामकाज जिसे मैं ढूंढने में सक्षम हूं, पहले शब्दों (बुलियन और) दोनों पर पूर्ण पाठ खोज करना है और फिर वाक्यांश के लिए शरीर पर एक समान तुलना करना है। बेशक, यह किसी भी स्टेमिंग या वर्तनी-जांच को कैप्चर करने में विफल रहता है जो पोस्टग्रेस 'पूर्ण-पाठ खोज आपके लिए करता है। इस का एक उदाहरण है कि अगर मैं वाक्यांश 'w1 डब्ल्यू 2' के लिए खोज कर रहा हूँ है, मैं का उपयोग करेंगे:

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

वहाँ आप पर खोज कर का सहारा की जरूरत नहीं है, जहां यह करने के लिए एक रास्ता है पाठ कॉलम?

उत्तर

11

यदि आप सटीक वाक्यांश मिलान चाहते हैं, तो ऐसा करने का तरीका है। आप body_vector @@ plainto_tsquery ('w1 w2') को भी आजमा सकते हैं, और उसके बाद इसे रैंकिंग द्वारा ऑर्डर कर सकते हैं। (बिंदु जा रहा है कि हिट जहां शब्द एक दूसरे के बगल ठीक कह रहे हैं शीर्ष पर पहुंचना चाहिए)

4

अद्यतन:

: PostgreSQL 9.6 पाठ खोज वाक्यांश

select 
    * 
from (values 
    ('i heart new york'), 
    ('i hate york new') 
) docs(body) 
where 
    to_tsvector(body) @@ phraseto_tsquery('new york') 

(1 row retrieved) 

या शब्दों के बीच की दूरी से समर्थन करता है

-- a distance of exactly 2 "hops" between "quick" and "fox" 
select 
    * 
from (values 
    ('the quick brown fox'), 
    ('quick brown cute fox') 
) docs(body) 
where 
    to_tsvector(body) @@ to_tsquery('quick <2> fox') 

(1 row retrieved) 
+1

शायद मुझे कुछ पकड़ नहीं आया, लेकिन क्या इनपुट इनपुट स्ट्रिंग को सिंगल कोट्स के बीच खोजे गए वाक्यांश को शामिल करने की आवश्यकता नहीं है? कोई भी सामान्य रूप से इसका उपयोग कैसे कर सकता है, जब वाक्यांश ऑसर इनपुट से आता है, और दस्तावेज़ डेटाबेस कॉलम से आता है? –

+1

यह अभी भी "वाक्यांश खोज" नहीं है। यह केवल तभी काम कर रहा है जब आपके सॉवेक्टर वाक्यांश 'न्यू यॉर्क' सिंगल-कोट्स में लपेटा गया है। – soyayix

+0

हां दोनों फ़ंक्शन करता है - लेकिन अधिकांश मामलों में आपके tsvector स्ट्रिंग पर एकल-उद्धरण नहीं होंगे - यदि ऐसा होता है तो इसके लिए खोज वाक्यांश क्या है .. मेरे पास एक postgreSQL 9.4 है और आपके द्वारा काम की गई क्वेरी - यह न केवल 9.6 के लिए विशिष्ट। 'मैं दिल न्यू यॉर्क शहर' :: tsvector @@ 'new' :: tsquery, --true 'मैं दिल न्यू यॉर्क शहर' :: tsvector @@ 'नया और यॉर्क' :: tsquery, - सच 'मैं दिल न्यू यॉर्क शहर' :: tsvector @@ '' 'न्यू यॉर्क' ':: tsquery --false – soyayix

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