标签
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)