2009-09-30 7 views
24

मैं एक परियोजना के लिए PostgreSQL पूर्ण पाठ खोज का उपयोग कर रहा हूं जहां पारंपरिक स्टॉप शब्द ('ए', 'द', 'अगर' इत्यादि) को अनुक्रमित और खोजने योग्य होना चाहिए, जो डिफ़ॉल्ट व्यवहार नहीं है। उदाहरण के लिए, मैं चाहता हूं कि मेरे उपयोगकर्ता 'होने या न होने' के लिए परिणाम ढूंढ सकें।क्या मैं PostgreSQL पूर्ण-पाठ खोज के साथ प्रोग्रामैटिक रूप से स्टॉप शब्दों को कॉन्फ़िगर कर सकता हूं?

documentation इंगित करता है कि मैं $SHAREDIR/tsearch_data/english.stop (उदाहरण के लिए) में एक खाली स्टॉपवर्ड शब्दकोश बनाकर इसे प्राप्त कर सकता हूं, लेकिन यह तैनाती को जटिल करेगा; मैं एसक्यूएल के साथ PostgreSQL के स्टॉप शब्द हैंडलिंग को कॉन्फ़िगर करने में सक्षम होना चाहता हूं। क्या यह संभव है? यदि हां, तो क्या आप एक नमूना एसक्यूएल कथन प्रदान कर सकते हैं?

उत्तर

34

पिछले जवाब पर अपनी टिप्पणी के अनुसार, आप आसानी से कोई रोक शब्द और का उपयोग कर सभी शब्दों रोक के बीच स्विच कर सकते हैं। आप एक कस्टम खोज विन्यास के साथ इस हासिल कर सकते हैं:

(1) आप रोकने वाले शब्द फ़ाइल का उपयोग कर, उदाहरण के लिए बिना एक कस्टम शब्दकोश बना सकते हैं:,

CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
    Template = snowball 
    , Language = english 
); 

नोट में ऊपर मैं बाहर छोड़ दिया StopWords पैरामीटर।

(2) तब अपना नया शब्दकोश का उपयोग करने के लिए एक नया विन्यास बनाने के लिए:

CREATE TEXT SEARCH CONFIGURATION public.english_nostop (COPY = pg_catalog.english); 
ALTER TEXT SEARCH CONFIGURATION public.english_nostop 
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop; 

(3) तब, जब खोज config आप उपयोग करना चाहते हैं निर्दिष्ट (वैकल्पिक रूप से आप default_text_search_config विकल्प हर बार बदल सकते हैं), उदाहरण के लिए:

SELECT 
    title 
FROM 
    articles 
WHERE 
    to_tsvector('english_nostop', COALESCE(title,'') || ' ' || COALESCE(body,'')) 
    @@ to_tsquery('english_nostop', 'how & to'); 

आप सामान्य config उपयोग करने के लिए ऊपर एसक्यूएल में सिर्फ 'english' निर्दिष्ट कर सकते हैं।

नोट, केवल शब्दों रोक देखते हैं क्योंकि इस उदाहरण में मानक विन्यास का उपयोग कर नोटिस में परिणाम होगा कि।


याद रखिए निम्नलिखित, तथापि:

  • आप अनुक्रमणिका का उपयोग कर रहे हैं, तो आप दो की आवश्यकता होगी - प्रत्येक विन्यास के लिए एक। (इन दस्तावेज़ों को देखें: tsearch tables और triggers)।
  • डबल चेक करें कि कौन सा पार्सर टोकन आप इस मैपिंग का उपयोग चरण # 2 के अनुसार करना चाहते हैं (देखें Parsers)।
+0

धन्यवाद, कैचडेव - यही वह है जिसे मैं ढूंढ रहा था। – tomd

2

नहीं, स्टॉप शब्द केवल उस फ़ाइल के माध्यम से कॉन्फ़िगर करने योग्य हैं। आपके पास एक सर्वर साइड फ़ंक्शन हो सकता है जो फ़ाइल को संशोधित करता है, लेकिन इसके लिए फ़ाइल को लिखने की आवश्यकता होती है: पोस्टग्रेस सेवा उपयोगकर्ता द्वारा सक्षम, जिसे आप शायद नहीं चाहते हैं।

+1

ठीक है, धन्यवाद। स्पष्ट होना - PostgreSQL को * किसी * स्टॉपवर्ड फ़ाइल का उपयोग न करने के लिए कहना संभव नहीं है? – tomd

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

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