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

less than 1 minute read

背景

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

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

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

自定义分词规则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)  

Flag Counter

digoal’s 大量PostgreSQL文章入口