การใช้ pg_jieba เพื่อการค้นหาข้อความภาษาจีนแบบเต็มใน PostgreSQL บน ServBay
ภาพรวม
สำหรับภาษาอังกฤษและภาษาอื่น ๆ PostgreSQL สามารถใช้งานระบบค้นหาแบบเต็มข้อความ (Full Text Search) ได้อย่างมีประสิทธิภาพ เนื่องจากใช้การวิเคราะห์ทางไวยากรณ์ด้วยช่องว่างและเครื่องหมายวรรคตอน อย่างไรก็ตาม ข้อความภาษาจีนไม่มีการเว้นวรรคโดยธรรมชาติ จึงจำเป็นต้องมี**ตัวตัดคำ (Segmentation)**สำหรับแยกข้อความจีนออกเป็นคำที่มีความหมาย
pg_jieba
คือส่วนขยายของ PostgreSQL ที่รวมเอาไลบรารีตัดคำชื่อดังอย่าง Jieba มาไว้ในฐานข้อมูล ช่วยให้ PostgreSQL สามารถตัดคำภาษาจีนได้อย่างถูกต้องและรวดเร็ว ส่งผลให้สามารถสร้างระบบค้นหาข้อความภาษาจีนแบบเต็มที่มีประสิทธิภาพ
ServBay ในฐานะที่เป็นสภาพแวดล้อมพัฒนาเว็บครบวงจรแบบ Local ได้ติดตั้งส่วนขยาย pg_jieba
มาพร้อมกับระบบ PostgreSQL แล้ว คุณจึงสามารถเริ่มต้นพัฒนาและทดสอบฟีเจอร์การค้นหาข้อความภาษาจีนได้อย่างง่ายดายและรวดเร็ว โดยไม่ต้องเสียเวลาติดตั้งและคอมไพล์เอง
บทความนี้จะอธิบายขั้นตอนการเปิดใช้งาน กำหนดค่า และใช้งานส่วนขยาย pg_jieba
ใน ServBay
ข้อกำหนดเบื้องต้น
ก่อนใช้งาน pg_jieba
กรุณาตรวจสอบให้แน่ใจว่าคุณได้ดำเนินการดังนี้:
- ติดตั้ง ServBay บนระบบ macOS และระบบฐานข้อมูล PostgreSQL ได้รับการเริ่มต้นใช้งานเรียบร้อยแล้ว
- มีพื้นฐานการใช้งาน PostgreSQL เช่น การเชื่อมต่อฐานข้อมูลและรันคำสั่ง SQL
การติดตั้งและเปิดใช้งาน pg_jieba
ServBay ได้รวมเอาส่วนขยาย pg_jieba
มาไว้กับ PostgreSQL เรียบร้อยแล้ว จึงไม่ต้องดาวน์โหลดหรือติดตั้งเอง เพียงแค่รันคำสั่ง SQL ง่าย ๆ ในฐานข้อมูลที่ต้องการก็เปิดใช้งานได้ทันที
ขั้นตอนการเปิดใช้งาน pg_jieba
:
เชื่อมต่อกับฐานข้อมูล PostgreSQL ของคุณ
เปิดแอปเทอร์มินัล จากนั้นใช้เครื่องมือpsql
เพื่อเชื่อมต่อกับฐานข้อมูล PostgreSQL แทนที่your_username
ด้วยชื่อผู้ใช้ PostgreSQL และyour_database
ด้วยชื่อฐานข้อมูล (ค่าปกติใน ServBay มักจะเป็นservbay
หรือpostgres
)bashpsql -U your_username -d your_database
1ตัวอย่าง การใช้ชื่อผู้ใช้และฐานข้อมูลตามค่าเริ่มต้น:
bashpsql -U servbay -d servbay
1สร้างและเปิดใช้งานส่วนขยาย
pg_jieba
ที่ prompt ของpsql
ให้รันคำสั่ง SQL ต่อไปนี้:sqlCREATE EXTENSION pg_jieba;
1หากส่วนขยายถูกสร้างไว้แล้ว เมื่อรันซ้ำอาจมีข้อความแสดงข้อผิดพลาดได้ ซึ่งไม่ใช่ปัญหา
ตรวจสอบการเปิดใช้งาน
pg_jieba
ดูรายการส่วนขยายทั้งหมดในฐานข้อมูลด้วยคำสั่ง:sql\dx
1ถ้ามี
pg_jieba
อยู่ในรายการ แสดงว่าส่วนขยายเปิดใช้งานสมบูรณ์
การตั้งค่า pg_jieba สำหรับค้นหาข้อความภาษาจีน
หลังจากเปิดใช้งาน pg_jieba
แล้ว จะต้องตั้งค่าระบบ "Text Search" ของ PostgreSQL เพื่อให้ใช้ pg_jieba
เป็นตัวตัดคำ
การตั้งค่า Text Search Configuration
Text Search Configuration จะกำหนดวิธีการจัดการข้อความสำหรับค้นหา เช่น เลือก parser (ตัววิเคราะห์) ตัวใด ใช้ dictionary (พจนานุกรม) อะไร ฯลฯ
สร้าง Text Search Configuration ใหม่
สร้าง config ชื่อchinese
และระบุให้ใช้pg_jieba
เป็น parsersqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1ค่านี้จะบอก PostgreSQL ให้ใช้
pg_jieba
สำหรับแยกคำเวลาทำ text searchเพิ่ม Mapping ให้กับผลลัพธ์การตัดคำ
Parser จากpg_jieba
จะให้ labels (ป้ายระบุชนิดของคำ เช่น คำนาม กริยา ฯลฯ) คุณต้องแมปป้ายเหล่านี้กับ dictionary ซึ่งโดยทั่วไปจะแมปไปที่simple
dictionary ที่ PostgreSQL มีในตัว (simple dictionary จะไม่เปลี่ยนแปลงคำใด ๆ รับเอาผลลัพธ์จาก parser ตรง ๆ)sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1n,v,a,i,e,l
คือป้ายชนิดคำทั่วไปที่pg_jieba
ตรวจจับได้ สามารถเพิ่มหรือลดชนิดตามต้องการ ตัวอย่างชนิดคำที่พบบ่อย:n
: คำนามv
: คำกริยาa
: คำคุณศัพท์i
: สุภาษิต สำนวนe
: คำอุทานl
: วลีหรือสำนวนnr
: ชื่อคนns
: ชื่อสถานที่nt
: องค์กร หน่วยงานnz
: ชื่อเฉพาะอื่น ๆm
: ตัวเลข (คำบอกจำนวน)q
: ลักษณนามt
: คำบอกเวลาหรือวันที่s
: คำบอกสถานที่f
: คำบอกตำแหน่งp
: คำบุพบทc
: คำสันธานu
: คำเสริมxc
: คำเสริมอื่น ๆw
: เครื่องหมายวรรคตอนeng
: ภาษาอังกฤษx
: อักขระที่ไม่ใช่คำ
โดยทั่วไปควรเน้นการจัดทำดัชนีและค้นหาเฉพาะคำหลักอย่างคำนาม กริยา คุณศัพท์ ฯลฯ
ตัวอย่างการใช้ pg_jieba กับการค้นหาแบบเต็มข้อความ
เมื่อเซ็ตอัปเรียบร้อยแล้ว คุณสามารถใช้ pg_jieba
สำหรับการค้นหาข้อความจีนได้ ตัวอย่างต่อไปนี้จะแสดงทุกขั้นตอน
สร้างตัวอย่างตารางและข้อมูล
เริ่มต้นด้วยการสร้างตารางเก็บข้อความและเพิ่มข้อมูลตัวอย่าง
สร้างตาราง
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4เพิ่มตัวอย่างข้อมูล
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');
1
2
3
4
5
การสร้างดัชนีสำหรับ全文搜索
เพื่อประสิทธิภาพสูง โดยเฉพาะหากตารางมีข้อมูลจำนวนมาก แนะนำให้สร้างดัชนีประเภท GIN (Generalized Inverted Index) ในคอลัมน์ที่ใช้สำหรับการค้นหา
สร้างดัชนี GIN ใช้ฟังก์ชั่น
to_tsvector
คู่กับ config ที่สร้างไว้ข้างต้น โดยจะสร้างดัชนีใน column content จากการตัดคำด้วยpg_jieba
sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
การรัน Full Text Query
ตอนนี้ คุณสามารถรันการค้นหาเต็มข้อความโดยใช้ to_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
การปรับแต่งพจนานุกรม (Custom Dictionary)
pg_jieba
จะใช้พจนานุกรมมาตรฐานของ Jieba ในการตัดคำ แต่ในบางกรณี คุณอาจต้องการเพิ่มคำศัพท์เฉพาะ (เช่น คำเทคนิค, ชื่อแบรนด์) เพื่อให้การตัดคำแม่นยำยิ่งขึ้น
สามารถสร้างไฟล์พจนานุกรมเอง และแจ้งให้ pg_jieba
ใช้งานได้
วิธีเพิ่มคำศัพท์เอง
สร้างไฟล์พจนานุกรมเอง
สร้างไฟล์ข้อความ เช่นplaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt
1เส้นทางนี้เป็นตัวอย่าง คุณอาจเลือก path ที่เหมาะกับโครงสร้าง ServBay ที่ใช้ก็ได้
เพิ่มคำศัพท์ในไฟล์
เปิดไฟล์custom_dict.txt
ด้วย editor ที่ถนัด แล้วพิมพ์คำศัพท์ละ 1 บรรทัด สามารถระบุความถี่ (frequency) และชนิดของคำ (tag) ได้ด้วย โดยคั่นด้วยช่องว่าง รูปแบบคือคำ [ความถี่ [ชนิดคำ]]
ตัวเลขความถี่สูงจะทำให้โชว์คำนั้นบ่อยขึ้นplaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
2
3เช่น
3 n
คือ “自然语言处理” มีความถี่ 3 และชนิดคำเป็นคำนาม (n),5 eng
คือ "ServBay" ถือเป็นอังกฤษปรับ config ของ
pg_jieba
ให้ชี้ไปใช้พจนานุกรมที่เตรียมไว้
ใน session ของ PostgreSQL ให้ตั้งค่าตัวแปรpg_jieba.dict_path
ให้ชี้ไปยัง"โฟลเดอร์"ที่มีไฟล์ custom_dict.txt (โดยปกติไม่ต้องตั้งเป็นชื่อไฟล์โดยตรง เว้นแต่ ServBay จะตั้งค่าพิเศษไว้)หาก ServBay ให้ระบุ path ไปยังโฟลเดอร์ เช่น
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- กรณี custom_dict.txt อยู่ในโฟลเดอร์นี้
1หรือถ้าระบบรองรับการชี้ไปที่ไฟล์โดยตรง:
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- ควรตรวจสอบเอกสาร ServBay ด้วย
1หมายเหตุ: คำสั่ง
SET
จะมีผลเฉพาะใน session ปัจจุบัน หากต้องการถาวรต้องเพิ่มไปยังไฟล์postgresql.conf
การโหลดพจนานุกรมใหม่
หลังจากแก้ไขไฟล์ custom_dict.txt หรือเปลี่ยนค่าพารามิเตอร์ dict_path แล้ว ต้องสั่งให้ pg_jieba โหลดพจนานุกรมใหม่
โหลดพจนานุกรมใหม่
sqlSELECT jieba_reload_dict();
1หลังจากรันนี้ คำใหม่จะถูกใช้งานในการตัดคำทันที
คำถามที่พบบ่อย (FAQ)
ถาม: รัน
CREATE EXTENSION pg_jieba;
แล้วขึ้นว่า "extension 'pg_jieba' is not available" ต้องทำอย่างไร?
ตอบ: แปลว่าพบปัญหา pg_jieba ยังไม่ติดตั้งครบถ้วนในโฟลเดอร์ extension ของ PostgreSQL หรือ PostgreSQL มองไม่เห็น ใน ServBay ปกติแล้วควรติดตั้งมาเรียบร้อย กรุณาตรวจสอบว่าคุณเชื่อมต่อ PostgreSQL ของ ServBay จริง และโปรแกรมไม่มีความเสียหาย หากยังมีปัญหา ให้ลองรีสตาร์ท ServBay หรือดู log เพิ่มเติมถาม: เพิ่ม custom dictionary แล้วไม่เห็นผล ต้องแก้ตรงไหน?
ตอบ: ตรวจสอบสิ่งต่อไปนี้- Path ไฟล์พจนานุกรมถูกต้อง PostgreSQL user มีสิทธิ์อ่านไฟล์
- รูปแบบไฟล์ถูกต้อง 1 คำ/1บรรทัด ระบุ frequency/tag คั่นด้วยช่องว่าง
- ตั้งค่าพารามิเตอร์
pg_jieba.dict_path
ถูกต้อง (SET มีผลเฉพาะ session, หากต้องการถาวรต้องเพิ่มใน postgresql.conf) - รัน
SELECT jieba_reload_dict();
- หากไปแก้ postgresql.conf ต้องรีสตาร์ท PostgreSQL
ถาม: ผลลัพธ์ Full Text Search ไม่แม่นยำ ทำอย่างไร?
ตอบ: ตรวจสอบดังนี้- ดูผลลัพธ์การตัดคำโดยใช้
ts_debug('chinese', 'ข้อความของคุณ')
เพื่อดูว่า config ตัดคำถูกต้องหรือไม่ - ปรับค่า mapping ด้วย
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;
เช่น ไม่ควรแมปคำเสริม/วรรคตอน ฯลฯ - ตรวจสอบคำใน to_tsquery ควรเลือกคำหลัก และใช้โอเปอเรเตอร์ (
&
,|
,!
) ให้เหมาะสมกับจุดประสงค์การค้นหา
- ดูผลลัพธ์การตัดคำโดยใช้
สรุป
pg_jieba
คือเครื่องมือทรงพลังสำหรับค้นหาข้อความภาษาจีนอย่างเต็มรูปแบบด้วย PostgreSQL โดย ServBay ได้ติดตั้งและเตรียมค่าเริ่มต้นไว้ให้พร้อม นักพัฒนาสามารถเปิดใช้งานและตั้งค่าระบบตัดคำได้ง่ายดาย บทความนี้ได้อธิบายทุกขั้นตอน ตั้งแต่การติดตั้ง การสร้าง Text Search Configuration ตัวอย่าง Query การสร้างดัชนี ไปจนถึงการปรับแต่งพจนานุกรมเฉพาะธุรกิจ คุณสามารถนำเทคนิคเหล่านี้ไปต่อยอดในโปรเจกต์ เพื่อเพิ่มศักยภาพการค้นหาข้อมูลภาษาจีนให้ครบวงจรและมีประสิทธิภาพสูงสุด