5

से सही परिणाम प्राप्त नहीं कर सकते हैं मैं ब्राज़ीली पुर्तगाली भाषा में एक साधारण लेख वेबसाइट विकसित कर रहा हूं। खोज सुविधा पूर्ण-पाठ खोज पर आधारित है, लेकिन यह अपेक्षित परिणामों को वापस नहीं कर रही है।पोस्टग्रे पूर्ण-पाठ खोज

मैंने इसे पोस्टग्रेस्क्ल पर बनाया है। यहाँ सरलीकृत तालिका है:

Artigos 
-id 
-title -- article title 
-intro -- article introduction 
-content -- article body 
-publishdate -- date of launch 
-artigosts -- this will work as our fts index. 

तालिका बनाने के बाद, मैं भाग गया:

UPDATE artigos SET artigosts = 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(title,'')), 'A') || 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(intro,'')), 'B') || 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(content,'')), 'C'); 

CREATE INDEX artigosts_idx ON artigos USING gist (artigosts); 

CREATE TRIGGER artigosts_tg 
BEFORE INSERT OR UPDATE ON artigos 
FOR EACH ROW EXECUTE PROCEDURE 
    tsvector_update_trigger('artigosts', 'pg_catalog.portuguese', 'title', 'intro', 'content'); 

हाँ, मैं इन खोजों के लिए सरल weightning उपयोग करना चाहते हैं। एक ट्रिगर को गति देने के लिए एक इंडेक्स बनाया, इसलिए मैं इंडेक्स रीमेकिंग के बारे में चिंता किए बिना सम्मिलित और अपडेट कर सकता हूं।

ठीक है, मेरी समझ के अनुसार, यह सबकुछ ठीक है। लेकिन परिणाम नहीं हैं। एक साधारण उदाहरण।

मान लें कि मेरे पास है "... banco de dados ... no banco ..." एक लेख सामग्री के रूप में। जब मैं करता हूं:

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('banco de dados') @@ artigosts; 

यह एक खाली सेट देता है। मैंने ts_vector कॉलम की जांच की और भविष्यवाणी 'बैंक' और 'पिता' देखा। लेकिन मैं अभी भी समझ नहीं पा रहा हूं कि यह उल्लिखित आलेख वाली पंक्ति को वापस क्यों नहीं करता है।

क्या कोई इस प्रश्न में प्रकाश ला सकता है?

+0

सर्वर पर उपलब्ध विभिन्न कॉन्फ़िगरेशन के साथ खेल रहा था। मुझे लगता है कि यह उपलब्ध शब्दकोशों और शब्द स्टॉप से ​​एक मुद्दा है।क्या किसी को पता है कि कैसे ऊपरी वर्ण (जैसे áéóôú) वैक्टर को मैप करना है? उत्तर के लिए – Dave

उत्तर

4

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

SELECT * FROM ts_debug('banco de dados'); 

यह क्वेरी दिखाएगी कि शब्दकोश आपके खोज वाक्यांश को कैसे पार करता है। यह lexemes "banco", "डी", और "दाडो" प्रदान करना चाहिए। तो जो आप वास्तव में खोज रहे हैं वह इंडेक्स में मौजूद नहीं होगा और आपको 0 परिणाम प्राप्त होंगे।

अब इस प्रयास करें:

SELECT * FROM ts_debug('portuguese', 'banco de dados'); 

यह शब्दिम कि सूचकांक, "बैंक" और "पिता" में मौजूद लौटना चाहिए। यदि ऐसा है तो उचित परिणाम प्राप्त करने के लिए आप बस अपनी खोज क्वेरी बदल सकते हैं।

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('portuguese', 'banco de dados') @@ artigosts; 
+0

Thx। हाँ, मुझे एहसास हुआ कि मुख्य शब्दकोश अंग्रेजी आधारित है। और पुर्तगाली, शब्दकोश के लिए conf conf, मौजूदा के बावजूद, बेकार है। मैं SIMPLE कॉन्फ़िगरेशन का उपयोग करके सर्वोत्तम परिणाम प्राप्त कर सकता हूं। बड़ी समस्या विशेष पात्रों का उपयोग है, जैसे áéóíúçãõ, जिनका उपयोग पुर्तगाली पर भारी रूप से किया जाता है। और कुछ lexemes ठीक से पार्स नहीं किया जाता है, लेकिन ज्यादातर lexemes सही पार्स कर रहे हैं, तो अब यह आंशिक रूप से मेरी जरूरतों को पूरा करता है। – Dave

+0

@ डेव - मैंने अंग्रेजी के अलावा किसी अन्य भाषा के साथ यह कोशिश नहीं की है, लेकिन आप हमेशा स्नोबॉलर पर फ़ॉलबैक के साथ एक आईस्पेल शब्दकोश का उपयोग कर सकते हैं। पुर्तगाली शब्दकोश ऑनलाइन उपलब्ध हैं: http://lasr.cs.ucla.edu/geoff/ispell-dples.html#Portglish-dicts – thetaiko

+0

त्वरित उत्तर के लिए Thx, लेकिन मेरी इच्छा है कि मैं अपने होस्ट पर उन सेटिंग्स को बदल सकता हूं। दुर्भाग्य से dict गुणों को बदलना, फ़ॉलबैक, फ़ाइलें और इतने पर उस विशेष सर्वर पर मेरे लिए एक विकल्प नहीं है। लेकिन फिर, सुझावों के लिए thx। – Dave

1

शायद यह आपके लिए देर हो चुकी है। और मेरे पास एक साधारण टिप्पणी जोड़ने के लिए पर्याप्त प्रतिष्ठा नहीं है ...

विशेष पात्रों के संबंध में मैं उन्हें सॉवेक्टर में बदलने से पहले उन्हें मुक्त करता हूं।

SELECT to_tsvector('simple',unaccent('banco de dados áéóíúçãõ')) 

तो मैं मिलता है:

"'aeoiucao':4 'banco':1 'dados':3 'de':2" 

आप की जरूरत है:

उपयोगकर्ता postgres
CREATE EXTENSION unaccent; 

... के रूप में। और निश्चित रूप से, आपको अपने tsquery को भी अनजान करना होगा

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