PostgreSQL 中英文混合分词特殊规则(中文单字、英文单词) - 中英分明-阿里云开发者社区

开发者社区> 阿里云数据库> 正文
登录阅读全文

PostgreSQL 中英文混合分词特殊规则(中文单字、英文单词) - 中英分明

简介:

标签

PostgreSQL , 正则表达式 , 分词 , 拆分


背景

某个业务系统有一个这样的要求:

分词后,要求,英文以单词形式出现,中文(多字节字符)以单字符形式出现。

这样的需求,需要如何来实现呢?

自定义分词规则UDF

切词的一些隐含参数,请参考:

《使用阿里云PostgreSQL zhparser时不可不知的几个参数》

要出现单字,我们需要这样来设置,对于多字节字符,设置单切。

postgres=# set zhparser.multi_zall=on;  
postgres=# SELECT array_to_tsvector(array_agg(token)) from ts_debug('testzhcfg', '保障房资金压力 hello digoal')   
           where (char_length(token)=1 and octet_length(token)<>1 ) or (char_length(token)=octet_length(token));  
                  array_to_tsvector                    
-----------------------------------------------------  
 'digoal' 'hello' '保' '力' '压' '房' '资' '金' '障'  
(1 row)  

以上满足业务需求,中文按字,英文按分词。

下面我们写一个UDF,编译使用。

create or replace function udf_to_tsvector(regconfig,text) returns tsvector as $$  
  SELECT array_to_tsvector(array_agg(token)) from ts_debug($1, $2)   
    where (char_length(token)=1 and octet_length(token)<>1 ) or (char_length(token)=octet_length(token));  
$$ language sql strict immutable;  

测试,满足业务需求

postgres=# select udf_to_tsvector('testzhcfg', '保障房资金压力 hello digoal');  
                   udf_to_tsvector                     
-----------------------------------------------------  
 'digoal' 'hello' '保' '力' '压' '房' '资' '金' '障'  
(1 row)  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
阿里云数据库
使用钉钉扫一扫加入圈子
+ 订阅

帮用户承担一切数据库风险,给您何止是安心!

官方博客
链接