暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

digoal 2017-11-04
600

作者

digoal

日期

2017-11-04

标签

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)
```

PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

文章转载自digoal,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论