Sử dụng pg_jieba để thực hiện tìm kiếm toàn văn tiếng Trung trên PostgreSQL với ServBay 
Tổng quan 
Đối với các ngôn ngữ như tiếng Anh, chức năng tìm kiếm toàn văn tích hợp của PostgreSQL hoạt động hiệu quả nhờ vào phân tích từ dựa trên dấu cách và dấu câu. Tuy nhiên, tiếng Trung lại không có dấu cách tự nhiên giữa các từ, do đó bạn cần sử dụng công cụ phân tách từ chuyên biệt để chia một chuỗi ký tự Trung Quốc liền mạch thành các từ có ý nghĩa độc lập.
pg_jieba là một phần mở rộng bên thứ ba dành cho cơ sở dữ liệu PostgreSQL, tích hợp thư viện phân tách tiếng Trung phổ biến Jieba. Với pg_jieba, bạn có thể thực hiện phân tách từ tiếng Trung hiệu quả, chính xác ngay trong PostgreSQL để xây dựng hệ thống tìm kiếm toàn văn tiếng Trung mạnh mẽ.
ServBay là môi trường phát triển web cục bộ tích hợp sẵn, đã đóng gói sẵn phần mở rộng pg_jieba, giúp loại bỏ các bước biên dịch, cài đặt phức tạp và cho phép bạn nhanh chóng phát triển, kiểm thử tìm kiếm toàn văn tiếng Trung ngay trên máy.
Tài liệu này sẽ hướng dẫn chi tiết cách kích hoạt, cấu hình và sử dụng phần mở rộng pg_jieba trong môi trường ServBay.
Điều kiện tiên quyết 
Trước khi sử dụng pg_jieba, hãy đảm bảo bạn đã:
- Cài đặt ServBay trên hệ điều hành macOS và khởi chạy thành công cơ sở dữ liệu PostgreSQL.
- Nắm vững các thao tác cơ bản với PostgreSQL, như kết nối cơ sở dữ liệu và thực thi lệnh SQL.
Cài đặt & kích hoạt pg_jieba 
ServBay đã đóng gói sẵn phần mở rộng pg_jieba cùng với PostgreSQL. Bạn không cần tải xuống, biên dịch thủ công mà chỉ cần thực thi lệnh SQL trên cơ sở dữ liệu mong muốn để kích hoạt.
Các bước kích hoạt như sau:
- Kết nối tới cơ sở dữ liệu PostgreSQL của bạn: Mở terminal và dùng công cụ dòng lệnh - psqlđể kết nối. Thay- your_usernamebằng tên người dùng PostgreSQL và- your_databasebằng tên cơ sở dữ liệu. Trong ServBay, mặc định thường là- servbayhoặc- postgres.bash- psql -U your_username -d your_database1- Ví dụ, dùng tài khoản mặc định: bash- psql -U servbay -d servbay1
- Tạo và kích hoạt phần mở rộng - pg_jieba: Trong giao diện dòng lệnh- psql, thực thi:sql- CREATE EXTENSION pg_jieba;1- Nếu đã tạo trước đó, lệnh này có thể báo lỗi, điều này bình thường. 
- Kiểm tra phần mở rộng đã được kích hoạt: Chạy lệnh sau để liệt kê các phần mở rộng đã cài đặt: sql- \dx1- Nếu danh sách hiện có - pg_jiebanghĩa là phần mở rộng đã được kích hoạt thành công.
Cấu hình pg_jieba cho tìm kiếm toàn văn tiếng Trung 
Sau khi kích hoạt, bạn cần cấu hình chức năng Tìm kiếm văn bản (Text Search) của PostgreSQL để sử dụng pg_jieba làm bộ tách từ.
Thiết lập cấu hình tìm kiếm văn bản (Text Search Configuration) 
Cấu hình tìm kiếm văn bản xác định cách xử lý dữ liệu cho tìm kiếm toàn văn: dùng bộ phân tích nào (parser) và cách ánh xạ các loại từ (token).
- Tạo cấu hình tìm kiếm văn bản mới: Tạo một cấu hình tên - chinese, dùng parser là- pg_jieba.sql- CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);1- Cấu hình này yêu cầu PostgreSQL dùng - pg_jiebađể tách từ khi xử lý văn bản.
- Thêm mappings cho kết quả tách từ: Parser - pg_jiebatrả về nhiều loại từ khác nhau theo từ loại. Để các từ này được lập chỉ mục, bạn cần ánh xạ chúng tới một từ điển cụ thể — ở đây là từ điển tích hợp- simplecủa PostgreSQL, vốn đơn giản dùng nguyên văn dữ liệu parser trả về.sql- ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;1- Ở đây, - n,v,a,i,e,llà một số nhãn từ loại phổ biến. Bạn có thể thêm hoặc chỉnh sửa theo nhu cầu. Một số nhãn thường gặp:- n: Danh từ
- v: Động từ
- a: Tính từ
- i: Thành ngữ
- e: Thán từ
- l: Thành ngữ ngắn
- nr: Tên người
- ns: Địa danh
- nt: Tổ chức
- nz: Tên riêng khác
- m: Số từ
- q: Lượng từ
- t: Từ chỉ thời gian
- s: Từ chỉ nơi chốn
- f: Từ chỉ phương hướng
- p: Giới từ
- c: Liên từ
- u: Trợ từ
- xc: Hư từ khác
- w: Dấu câu
- eng: Tiếng Anh
- x: Từ không mang nghĩa
 - Thông thường, bạn nên lập chỉ mục các từ có ý nghĩa thực như danh từ, động từ, tính từ,... 
Ví dụ sử dụng pg_jieba cho tìm kiếm toàn văn 
Sau khi cấu hình, bạn đã có thể dùng pg_jieba cho tìm kiếm toàn văn tiếng Trung. Ví dụ thực tế sau đây:
Tạo bảng và dữ liệu mẫu 
Trước tiên, tạo bảng lưu trữ văn bản và chèn một số dòng dữ liệu tiếng Trung.
- Tạo bảng: sql- CREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );1
 2
 3
 4
- Chèn dữ liệu mẫu: sql- INSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');1
 2
 3
 4
 5
Tạo chỉ mục tìm kiếm toàn văn 
Để tăng tốc độ tìm kiếm, đặc biệt với lượng lớn dữ liệu, rất nên tạo chỉ mục trên trường bạn định tìm kiếm. Loại chỉ mục GIN của PostgreSQL rất thích hợp cho tìm kiếm toàn văn.
- Tạo chỉ mục GIN: Dùng hàm - to_tsvectorvới cấu hình- chineseđã tạo để lập chỉ mục trên cột- content.sql- CREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));1
Thực hiện truy vấn tìm kiếm toàn văn 
Giờ bạn có thể dùng hàm to_tsquery và toán tử @@ để thực hiện truy vấn tìm kiếm toàn văn. to_tsquery('chinese', 'từ khóa') sẽ chuyển truy vấn của bạn về định dạng phù hợp. Toán tử @@ kiểm tra xem tsvector có khớp với tsquery không.
- Thực hiện truy vấn tìm kiếm: Tìm các tài liệu chứa cả hai từ "中文" và "分词": sql- SELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');1
 2
 3
 4
 5- Ký hiệu - &nghĩa là AND logic; bạn cũng có thể dùng- |cho OR, hoặc- !cho NOT.- Ví dụ, tìm tài liệu chứa "ServBay" hoặc "开发": sql- SELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');1
 2
 3
 4
 5
Từ điển tùy chỉnh 
pg_jieba sử dụng mặc định từ điển của thư viện Jieba để tách từ. Trong nhiều trường hợp chuyên ngành, bạn sẽ muốn thêm các từ vựng riêng (như tên sản phẩm, thuật ngữ chuyên môn...) để tăng độ chính xác.
Bạn có thể tạo file từ điển tùy chỉnh riêng và cấu hình để pg_jieba sử dụng nó.
Thêm từ tùy chỉnh 
- Tạo file từ điển tùy chỉnh: Tạo một file văn bản chẳng hạn: plaintext- /Applications/ServBay/etc/pg_jieba/custom_dict.txt1- Lưu ý, đây là đường dẫn gợi ý; bạn có thể chọn đường dẫn khác phù hợp với cấu trúc ServBay của mình. 
- Thêm từ vào file từ điển: Mở file - custom_dict.txtbằng trình soạn thảo, viết mỗi từ một dòng. Có thể tùy chọn thêm tần suất (frequency) và từ loại (tag) ở bên phải, cách nhau bởi dấu cách:- từ [tần_suất [từ_loại]]. Tần suất càng cao thì từ càng dễ được tách ra.plaintext- 自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n1
 2
 3- Ở đây - 3 nnghĩa là "自然语言处理" có tần suất 3, từ loại danh từ.- 5 engnghĩa là "ServBay" có tần suất 5, từ loại tiếng Anh.
- Cấu hình - pg_jiebasử dụng từ điển tùy chỉnh: Trong phiên làm việc PostgreSQL, đặt biến- pg_jieba.dict_pathtrỏ tới thư mục chứa file từ điển của bạn. Lưu ý: Tham số này thường trỏ tới thư mục, không phải file đơn lẻ. Nếu file của bạn nằm cùng thư mục với từ điển chính mặc định, bạn có thể không cần thiết lập thêm. Hãy kiểm tra tài liệu ServBay về cấu hình này hoặc thử thực tế để xác định giá trị phù hợp.- Nếu cấu hình cho phép chỉ định trực tiếp file từ điển, cũng như bạn đã đặt từ điển đúng chỗ, lệnh có thể như sau: sql- SET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- Giả sử ServBay đặt từ điển tại đây, custom_dict.txt cùng thư mục1- Hoặc nếu hỗ trợ chỉ định trực tiếp file: sql- SET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- Cẩn thận, xác thực lại cấu hình thực tế1- Chú ý: - SETchỉ hiệu lực trong phiên làm việc hiện tại. Để hiệu lực vĩnh viễn, hãy sửa file cấu hình PostgreSQL- postgresql.confvới tham số- pg_jieba.dict_path.
Nạp lại từ điển 
Sau khi sửa đổi file từ điển hay thay đổi pg_jieba.dict_path, bạn cần yêu cầu pg_jieba tải lại từ điển để thay đổi có hiệu lực.
- Nạp lại từ điển: Thực thi hàm sau: sql- SELECT jieba_reload_dict();1- Khi lệnh thực thi thành công, các thao tác tách từ sau đó sẽ dùng từ điển mới cập nhật. 
Giải đáp thắc mắc (FAQ) 
- Hỏi: Khi chạy - CREATE EXTENSION pg_jieba;mà báo lỗi "extension "pg_jieba" is not available" thì phải làm sao? Đáp: Thường là do phần mở rộng chưa được cài đúng vào thư mục extensions của PostgreSQL, hoặc PostgreSQL không thể tìm thấy. Trên ServBay,- pg_jiebađã được cài sẵn. Hãy chắc chắn bạn đang kết nối đúng PostgreSQL của ServBay và việc cài đặt không bị lỗi. Nếu vẫn gặp lỗi, thử khởi động lại ServBay hoặc kiểm tra log của ServBay.
- Hỏi: Từ điển tùy chỉnh không hoạt động? Đáp: Hãy kiểm tra: - Đường dẫn file từ điển có đúng và tài khoản PostgreSQL có quyền đọc?
- Định dạng file đúng? Mỗi từ một dòng, các giá trị tùy chọn phân tách bằng dấu cách.
- Biến pg_jieba.dict_pathđã được đặt đúng chưa? Nhớ rằngSETchỉ hiệu lực cho phiên làm việc hiện tại. Muốn dùng ở các phiên khác hoặc sau khi khởi động lại, cần sửapostgresql.conf.
- Đã thực hiện SELECT jieba_reload_dict();để nạp lại từ điển chưa?
- Nếu bạn sửa đổi postgresql.conf, đã khởi động lại PostgreSQL chưa?
 
- Hỏi: Kết quả tìm kiếm toàn văn không chính xác? Đáp: Độ chính xác phụ thuộc vào việc tách từ và việc thiết lập truy vấn tìm kiếm. - Kiểm tra kết quả tách từ: dùng hàm ts_debug('chinese', 'nội dung của bạn')để xem cấu hìnhchineseđã tách câu đó như thế nào, đánh giá cả tác dụng từ điển tùy chỉnh.
- Tối ưu cấu hình tách từ: Loại bỏ một số từ loại không quan trọng (như trợ từ, dấu câu...) khỏi đoạn ALTER MAPPING.
- Tối ưu truy vấn: Kiểm tra kỹ cú pháp, từ khóa lẫn logic của truy vấn (&,|,!).
 
- Kiểm tra kết quả tách từ: dùng hàm 
Tổng kết 
pg_jieba là công cụ mạnh mẽ để triển khai tìm kiếm toàn văn tiếng Trung ngay trong PostgreSQL. Nhờ phần mở rộng tích hợp sẵn trên ServBay, các nhà phát triển có thể dễ dàng kích hoạt, cấu hình phân tách từ tiếng Trung cho ứng dụng trong môi trường nội bộ. Qua các bước hướng dẫn ở trên, bạn đã nắm được cách cài đặt, tạo cấu hình tìm kiếm, thực hành tìm kiếm toàn văn cơ bản và khai thác từ điển tùy chỉnh để nâng cao độ chính xác khi tách từ. Áp dụng các kỹ thuật này cho dự án của bạn sẽ giúp tăng khả năng tìm kiếm nội dung tiếng Trung một cách hiệu quả.
