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. Thayyour_username
bằng tên người dùng PostgreSQL vàyour_database
bằng tên cơ sở dữ liệu. Trong ServBay, mặc định thường làservbay
hoặcpostgres
.bashpsql -U your_username -d your_database
1Ví dụ, dùng tài khoản mặc định:
bashpsql -U servbay -d servbay
1Tạo và kích hoạt phần mở rộng
pg_jieba
: Trong giao diện dòng lệnhpsql
, thực thi:sqlCREATE EXTENSION pg_jieba;
1Nế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\dx
1Nếu danh sách hiện có
pg_jieba
nghĩ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
.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Cấ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_jieba
trả 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ợpsimple
của PostgreSQL, vốn đơn giản dùng nguyên văn dữ liệu parser trả về.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1Ở đây,
n,v,a,i,e,l
là 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ắnnr
: Tên ngườins
: Địa danhnt
: Tổ chứcnz
: Tên riêng khácm
: Số từq
: Lượng từt
: Từ chỉ thời gians
: Từ chỉ nơi chốnf
: Từ chỉ phương hướngp
: Giới từc
: Liên từu
: Trợ từxc
: Hư từ khácw
: Dấu câueng
: Tiếng Anhx
: 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:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Chèn dữ liệu mẫu:
sqlINSERT 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_tsvector
với cấu hìnhchinese
đã tạo để lập chỉ mục trên cộtcontent
.sqlCREATE 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à "分词":
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5Ký 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 "开发":
sqlSELECT 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.txt
1Lư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.txt
bằ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 n
1
2
3Ở đây
3 n
nghĩa là "自然语言处理" có tần suất 3, từ loại danh từ.5 eng
nghĩa là "ServBay" có tần suất 5, từ loại tiếng Anh.Cấu hình
pg_jieba
sử dụng từ điển tùy chỉnh: Trong phiên làm việc PostgreSQL, đặt biếnpg_jieba.dict_path
trỏ 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:
sqlSET 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ục
1Hoặc nếu hỗ trợ chỉ định trực tiếp file:
sqlSET 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ế
1Chú ý:
SET
chỉ 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 PostgreSQLpostgresql.conf
vớ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:
sqlSELECT jieba_reload_dict();
1Khi 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ằngSET
chỉ 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ả.