Postgresql - Tìm kiếm tiếng việt không dấu
- Ryan Nghiêm
- /
- 12/02/2018
- /
- 24
- Views 3821
Khi một developer thao tác với Database Postgresql có dữ liệu là tiếng Việt. Công việc khó khăn phát sinh khi muốn so sánh, tìm kiếm chuỗi có dấu và chuỗi không dấu.
Bài viết này tôi sẽ đưa ra 2 cách để convert tiếng Việt có dấu thành không dấu trong Postgresql:
- Cách đầu tiên là viết 1 function convert thủ công để replace
- Cách thứ hai là dùng hàm có sẵn được hỗ trợ: Unaccent
1. Tạo function convert
Với cách này, sẽ giúp bạn hình dung cơ chế convert tiếng Việt có dấu thành không dấu như thế nào. Khi bạn muốn convert language này sang language khác cũng có thể làm như này. Ngoài ra, nó còn giúp ta maintance tốt hơn, chủ động hơn. Nhược điểm của nó là tốc độ có thể chậm hơn so với cách thứ 2.
// convert TV khong dau CREATE OR REPLACE FUNCTION convertTVkdau (x text) RETURNS text AS $$ DECLARE codau text; kdau text; r text; BEGIN codau = 'áàảãạâấầẩẫậăắằẳẵặđéèẻẽẹêếềểễệíìỉĩịóòỏõọôốồổỗộơớờởỡợúùủũụưứừửữựýỳỷỹỵÁÀẢÃẠÂẤẦẨẪẬĂẮẰẲẴẶĐÉÈẺẼẸÊẾỀỂỄỆÍÌỈĨỊÓÒỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢÚÙỦŨỤƯỨỪỬỮỰÝỲỶỸỴ'; kdau = 'aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAADEEEEEEEEEEEIIIIIOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYY'; r = x; FOR i IN 0..length(codau) LOOP r = replace(r, substr(codau,i,1), substr(kdau,i,1)); END LOOP; RETURN r; END; $$ LANGUAGE plpgsql;
Sau đó, ta sẽ thử áp dụng function trên với câu select sau:
SELECT converttvkdau('Phần mềm quản lý quán net');
Thì sẽ nhận được kết quả:
Phan mem quan ly quan net
2. Dùng hàm có sẵn Unaccent
Trước hết để sử dụng được hàm Unaccent này cần tạo Extension
CREATE EXTENSION unaccent; SELECT unaccent('Phần mềm quản lý quán net');
Kết quả sẽ tương tự cách 1
Chú ý quan trọng:
Để sử dụng hàm unaccent này tốt cho tiếng Việt bạn sẽ cần bổ sung , chính sửa thêm vào file unaccent.rules
Nếu ở centos, các bạn vào thư mục "/usr/pgsql-9.6/share/tsearch_data" sửa
Nếu ở windows, thì vào thư mục "C:/Program Files/PostgreSQL/9.6/share/tsearch_data"
Link github: https://github.com/phuongnm153/postgres/blob/master/contrib/unaccent/unaccent.rules