ServBay में pg_jieba के साथ PostgreSQL के लिए चीनी फुल-टेक्स्ट सर्च
परिचय
अंग्रेज़ी जैसी भाषाओं के लिए, PostgreSQL की इनबिल्ट फुल-टेक्स्ट सर्च स्पेस और पंक्चुएशन के आधार पर शब्दों को पहचान लेती है, लेकिन चीनी पाठ में प्राकृतिक स्पेस डिवाइडर नहीं होते। ऐसे में हमें विशेष शब्द विभाजन (Segmentation) टूल की आवश्यकता होती है, जो लगातार चाइनीज़ अक्षरों के अनुक्रम को सही शब्दों में तोड़े।
pg_jieba एक थर्ड पार्टी एक्सटेंशन है, जो PostgreSQL डेटा बेस में लोकप्रिय Jieba (结巴分词) चाइनीज़ टोकनाइज़र लाता है। इसके सहारे, आप PostgreSQL के भीतर चीनी टेक्स्ट को तेज़ी व सटीकता से विभाजित करके मज़बूत फुल-टेक्स्ट सर्च बना सकते हैं।
ServBay एक इंटीग्रेटेड लोकल वेब डेवेलपमेंट एन्वायरनमेंट है, जिसमें pg_jieba एक्सटेंशन पहले से मौजूद है—इससे आपको मैन्युअल इंस्टॉल या कम्पाइल करने की झंझट नहीं होगी और आप तुरंत चीनी फुल-टेक्स्ट सर्च का विकास व परीक्षण लोकल स्तर पर शुरू कर सकते हैं।
यह लेख बताएगा कि ServBay में pg_jieba को कैसे एक्टिवेट, कॉन्फ़िगर और इस्तेमाल करें।
आवश्यकताएँ
pg_jieba के प्रयोग से पहले, कृपया सुनिश्चित करें:
- आपने macOS प्रणाली पर ServBay स्थापित कर लिया है और PostgreSQL चल रहा है।
- आपको PostgreSQL के बुनियादी संचालन (जैसे कनेक्ट करना, SQL कमांड चलाना) आता है।
pg_jieba की इंस्टॉलेशन व उपयोग
ServBay ने pg_jieba पहले से PostgreSQL के पैकेज में शामिल कर रखा है। आपको अलग से डाउनलोड या कम्पाइल नहीं करना पड़ेगा—कुछ सिंपल SQL कमांड से यह सक्रिय हो जाएगा।
इन स्टेप्स का पालन करें:
PostgreSQL डेटाबेस से कनेक्ट करें: टर्मिनल खोलें, और
psqlकमांडलाइन टूल से अपने PostgreSQL डाटाबेस से जुड़ें।your_usernameकी जगह अपना यूज़रनेम, औरyour_databaseकी जगह डाटाबेस नाम डालें। ServBay में डिफ़ॉल्ट यूज़र और डाटाबेस अक्सरservbayयाpostgresहोते हैं।bashpsql -U your_username -d your_database1उदाहरण के लिए डिफ़ॉल्ट यूज़र/डेटाबेस:
bashpsql -U servbay -d servbay1pg_jiebaएक्सटेंशन बनाएं/एक्टिवेट करें:psqlइंटरफ़ेस में यह SQL चलाएं:sqlCREATE EXTENSION pg_jieba;1यदि एक्सटेंशन पहले से बना है, तो यह कमांड एरर दे सकती है, जो सामान्य है।
ज्ञानवर्धन करें कि pg_jieba सक्रिय है या नहीं: इंस्टॉल्ड एक्सटेंशन देखने के लिए यह कमांड चलाएँ:
sql\dx1अगर सूची में
pg_jiebaहै तो एक्टिवेशन सफल है।
pg_jieba के लिए चीनी फुल-टेक्स्ट सर्च कॉन्फ़िगर करें
एक्सटेंशन एक्टिव होने के बाद, PostgreSQL के टेक्स्ट सर्च (Text Search) फीचर में pg_jieba को टोकनाइज़र के तौर पर सेट करना होगा।
टेक्स्ट सर्च कॉन्फ़िगरेशन सेटअप
टेक्स्ट सर्च कॉन्फ़िगरेशन यह तय करता है कि किन नियमों से कोई डॉक्युमेंट प्रोसेस किया जाए—कौन सा पार्सर/टोकनाइज़र यूज़ हो, और कौन से टोकन किस डिक्शनरी के साथ जाएँ।
नई कॉन्फ़िगरेशन बनाएँ: एक नई
chineseनाम की कॉन्फ़िगरेशन बनाएं जोpg_jiebaपार्सर इस्तेमाल करे।sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);1अब PostgreSQL, टेक्स्ट हैंडलिंग में
pg_jiebaका उपयोग करेगा।टोकन-टॉइपिंग मैपिंग एड करें:
pg_jiebaपार्सर, टोकन को उनके शब्द-प्रकार (जैसे Noun, Verb आदि) के साथ जेनरेट करता है। इन्हें खोज और इंडेक्सिंग के लिए किसी डिक्शनरी (dictionary) से मैप करना ज़रूरी है। यहाँ आम शब्द-प्रकार (n,v,aआदि) को PostgreSQL की इनबिल्टsimpleडिक्शनरी से जोड़ेंगे (जो टोकन को वैसा ही रखती है जैसाpg_jiebaदेता है):sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;1यहाँ
n,v,a,i,e,lवे टोकन-टैग्स हैं जिन्हेंpg_jiebaपहचान सकता है। जरूरत के अनुसार टैग बढ़ाया/हटाया जा सकता है। आम टैग्स:n: संज्ञा (Noun)v: क्रिया (Verb)a: विशेषण (Adjective)i: कहावत/मुहावराe: आश्चर्यसूचकl: मुहावराnr: व्यक्ति का नामns: स्थान का नामnt: संस्था/संघnz: अन्य विशिष्ट नामm: संख्याq: मात्रकt: समय-संबंधी शब्दs: जगहf: दिक/स्थिति सूचकp: पूर्वसर्गc: संयोजनu: सहायक शब्दxc: अन्य कार्यसूचकw: विराम चिह्नeng: इंग्लिशx: अपूर्णांश
आमतौर पर, आप संज्ञा, क्रिया, विशेषण आदि शामिल करना चाहेंगे जो एक्टुअल मायनों वाले शब्द हैं।
pg_jieba के साथ फुल-टेक्स्ट सर्च का उदाहरण
सेटअप के बाद, आप अब चीनी टेक्स्ट पर फुल-टेक्स्ट सर्च कर सकते हैं। एक बुनियादी उदाहरण:
टेबल और डेटा बनाएं
पहले, दस्तावेज़ों के लिए टेबल बनाएं और कुछ चीनी टेक्स्ट डेटा डालें।
टेबल बनाएं:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );1
2
3
4डेमो डेटा डालें:
sqlINSERT INTO documents (content) VALUES ('मैं प्राकृतिक भाषा प्रसंस्करण तकनीक से प्यार करता हूँ'), ('चीनी शब्द विभाजन, टेक्स्ट प्रोसेसिंग का एक महत्वपूर्ण चरण है'), ('pg_jieba एक बेहतरीन चीनी शब्द विभाजन टूल है, यह Jieba लाइब्रेरी पर आधारित है'), ('ServBay लोकल डेवेलपमेंट को सरल और प्रभावी बनाता है');1
2
3
4
5
फुल-टेक्स्ट सर्च इंडेक्स बनाएँ
खास तौर पर बड़े डेटासेट पर सर्च को तेज़ करने हेतु, फुल-टेक्स्ट कॉलम्स पर इंडेक्स बनाना ज़रूरी है। PostgreSQL में GIN (Generalized Inverted Index) इंडेक्स उदाहरण के लिए आदर्श है।
GIN इंडेक्स बनाएँ:
to_tsvectorफंक्शन का उपयोग करते हुए, हमारेchineseकॉन्फ़िगरेशन के साथcontentकॉलम पर GIN इंडेक्स बनाएँ। यहcontentकोpg_jiebaसे प्रोसेस करकेtsvectorफॉर्मेट में बदल देगा, जो कि सर्च के लिए उपयुक्त है।sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));1
सर्च क्वेरी चलाएँ
अब, to_tsquery और @@ ऑपरेटर की मदद से फुल-टेक्स्ट सर्च करें। to_tsquery('chinese', 'your query') में आपकी खोज को chinese कांफिग के अनुसार tsquery में बदला जाता है। @@ देखता है कि कोई tsvector उस tsquery से मेल खाता है या नहीं।
सर्च क्वेरी: वे डॉक्युमेंट्स खोजें, जिनमें "चीनी" और "विभाजन" दोनों शब्द हों।
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'चीनी & विभाजन');1
2
3
4
5यहाँ
&का अर्थ AND है।|लगाएंगे तो OR,!लगाएंगे तो NOT।उदाहरण: "ServBay" या "डिवेलपमेंट" वाले दस्तावेज़:
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | डेवेलपमेंट');1
2
3
4
5
कस्टम डिक्शनरी
pg_jieba, Jieba लाइब्रेरी की डिफ़ॉल्ट डिक्शनरी इस्तेमाल करता है। कई बार आपको अपने खास शब्द (जैसे तकनीकी, ब्रांड नेम आदि) जोड़ने होंगे ताकि विभाजन और सटीक हो।
इसके लिए आपको अपना कस्टम डिक्शनरी फाइल बनाना और pg_jieba को बताना होता है।
कस्टम शब्द जोड़ना
कस्टम डिक्शनरी फाइल बनाएं: ServBay की config डायरेक्टरी में एक नया फाइल बनाएं, जैसे:
plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt1यह केवल एक सुझाया गया पथ है। अपने सर्वबे इंस्टालेशन के मुताबिक उचित लोकेशन चुनें।
फाइल में शब्द जोड़ें: किसी टेक्स्ट एडिटर में
custom_dict.txtखोलें और हर पंक्ति में एक शब्द डालें। चाहें तो उसके बाद फ्रीक्वेंसी (frequency) और टाइप (tag) भी डाल सकते हैं (स्पेस से अलग करें)। फॉर्मेट:शब्द [फ्रीक्वेंसी [टैग]]। जितनी ज्यादा फ्रीक्वेंसी, उतना वह शब्द पार्ट बनेगा।plaintextप्राकृतिक भाषा प्रसंस्करण 3 n ServBay 5 eng Jieba लाइब्रेरी 3 n1
2
3इसमें
3 nका अर्थ—"प्राकृतिक भाषा प्रसंस्करण" शब्द की आवृत्ति 3 है, टैग n (noun) है। "ServBay" की फ्रीक्वेंसी 5, टैग इंग्लिश (eng) है।pg_jieba में कस्टम डिक्शनरी सेट करें: PostgreSQL सेशन में,
pg_jieba.dict_pathपैरामीटर को अपने कस्टम डिक्शनरी डायरेक्टरी की ओर पॉइंट करें। ध्यान दें: आमतौर पर यह डाइरेक्टरी को दिखाता है, एकल फाइल नहीं। यदि कस्टम डिक्शनरी, pg_jieba के डिफ़ॉल्ट डिक्शनरी फोल्डर में ही हो, तो सेटिंग की जरूरत ना भी पड़े। सही सेटिंग के लिए अपने सर्वबे पैकेज के डाक्यूमेंटेशन को देखें।यदि कमांड जरूरी हो, तो उदाहरण:
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- मान लें कि यही डिक्शनरी डायरेक्टरी है1या यदि फाइल पॉइंट करना संभव हो (असाधारण, लेकिन कभी-कभी सर्वबे पैकजिंग में):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- सावधानी, सेटिंग जांचें1महत्वपूर्ण:
SETसिर्फ वर्तमान सेशन में लागू होता है। स्थायी रूप से एक्टिव करने के लिए, PostgreSQL कीpostgresql.confफाइल में यह सेटिंग डालें।
डिक्शनरी को री-लोड करें
डिक्शनरी काट-छाँट या सेटिंग के बाद, अपडेट लागू करने के लिए री-लोड करें।
री-लोड कमांड: SQL फंक्शन चलाएँ:
sqlSELECT jieba_reload_dict();1सफल होने पर, विभाजन नए शब्दों/सेटिंग्स के अनुसार होगा।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
प्र: यदि
CREATE EXTENSION pg_jieba;पर "extension 'pg_jieba' is not available" एरर मिले तो? उ: यह अक्सर तब होता है जब pg_jieba एक्सटेंशन की फाइल PostgreSQL के एक्सटेंशन डाइरेक्टरी में मौजूद नहीं है, या डेटाबेस उसे नहीं पहचान रहा। ServBay में यह एक्सटेंशन पहले से होता है—कृपया देखें कि आप सर्वबे के PostgreSQL से जुड़े हैं, और इंस्टालेशन सही है। परेशानी बने तो सर्वबे रीस्टार्ट करें या सर्वबे लॉग देखें।प्र: कस्टम डिक्शनरी काम ना करे तो? उ: ये जांचें:
- डिक्शनरी फाइल पथ सही हो, और PostgreSQL यूज़र को पढ़ने की अनुमति हो।
- डिक्शनरी में हर पंक्ति—एक शब्द, वैकल्पिक फ्रीक्वेंसी और टैग (स्पेस से अलग)।
pg_jieba.dict_pathसही से सेट हो। याद रहे,SETसिर्फ वर्तमान सेशन में ही लागू है, अन्यथाpostgresql.confमें डालें।- आपने
SELECT jieba_reload_dict();से डिक्शनरी रीलोड की हो। postgresql.confमें बदलाव के बाद, PostgreSQL सेवा को रीस्टार्ट किया हो।
प्र: फुल-टेक्स्ट सर्च परिणाम असंतोषजनक हो तो? उ: सटीकता, शब्द विभाजन व सर्च क्वेरी हाई क्वालिटी होने पर निर्भर करती है।
- शब्द विभाजन जांचें—
ts_debug('chinese', 'आपका टेक्स्ट')से देख सकते हैं कि टेक्स्ट कैसे विभाजित हुआ। - विभाजन कॉन्फ़िगरेशन सुधारें—
ALTER TEXT SEARCH CONFIGURATION ...में गैर-ज़रूरी टैग्स (जैसे सहायिका, विराम-चिन्ह वगैरह) हटाएँ। - सर्च क्वेरी का गठन—
to_tsqueryमें सही शब्द व लॉजिक (&,|,!) इस्तेमाल करें।
- शब्द विभाजन जांचें—
निष्कर्ष
pg_jieba, PostgreSQL में चीनी फुल-टेक्स्ट सर्च के लिए एक शक्तिशाली टूल है। ServBay के बंडल्ड pg_jieba एक्सटेंशन से आप लोकल डेवलपमेंट में आसानी से चीनी शब्द विभाजन सक्षम कर सकते हैं। ऊपर दिए निर्देशों से आप सीख गए होंगे कि pg_jieba कैसे एक्टिवेट करें, टेक्स्ट सर्च सेट करें, बेसिक सर्च क्वेरी चलाएँ और कस्टम डिक्शनरी से शब्द विभाजन बेहतर करें। इन तकनीकों को अपने प्रोजेक्ट में अपनाकर, आपकी चीनी सामग्री की खोज क्षमता कई गुना बढ़ेगी।
