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)  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值