云原生数据仓库 AnalyticDB PostgreSQL 版数据库安装Zhparser插件后可以实现全文检索时的中文分词。
全文检索概述
PostgreSQL默认按照空格及各种标点符号来分词,不支持中文分词。云原生数据仓库 AnalyticDB PostgreSQL 版通过集成Zhparser扩展来支持中文分词。
一般情况下,全文检索可以采用如下两种方法:
搜索表:
SELECT name FROM <table...> WHERE to_tsvector('english', name) @@ to_tsquery('english', 'friend');
创建GIN索引:
CREATE INDEX <idx_...> ON <table...> USING gin(to_tsvector('english', name));
配置Zhparser
安装Zhparser插件。
使用全文检索时的中文分词功能之前,您需要在云原生数据仓库 AnalyticDB PostgreSQL 版实例插件管理中安装Zhparser插件。具体操作,请参见安装、升级与卸载插件。
配置中文解析器,取名为zh_cn。
CREATE TEXT SEARCH CONFIGURATION zh_cn (PARSER = zhparser);
查看分词策略。
查看Zhparser的词典配置:
SELECT ts_token_type('zhparser');
返回信息如下:
ts_token_type --------------------------------- (97,a,"adjective,形容词") (98,b,"differentiation,区别词") (99,c,"conjunction,连词") (100,d,"adverb,副词") (101,e,"exclamation,感叹词") (102,f,"position,方位词") (103,g,"root,词根") (104,h,"head,前连接成分") (105,i,"idiom,成语") (106,j,"abbreviation,简称") (107,k,"tail,后连接成分") (108,l,"tmp,习用语") (109,m,"numeral,数词") (110,n,"noun,名词") (111,o,"onomatopoeia,拟声词") (112,p,"prepositional,介词") (113,q,"quantity,量词") (114,r,"pronoun,代词") (115,s,"space,处所词") (116,t,"time,时语素") (117,u,"auxiliary,助词") (118,v,"verb,动词") (119,w,"punctuation,标点符号") (120,x,"unknown,未知词") (121,y,"modal,语气词") (122,z,"status,状态词") (26 rows)
查看zh_cn的结构(Configuration):
SELECT * FROM pg_ts_config_map WHERE mapcfg=(SELECT oid FROM pg_ts_config WHERE cfgname='zh_cn');
添加或删除分词策略:
添加分词策略:
添加名词(n)、动词(v)、形容词(a)、成语(i)、叹词(e)和习用语(l) 六种分词策略:
ALTER TEXT SEARCH CONFIGURATION zh_cn ADD MAPPING FOR n,v,a,i,e,l WITH simple;
删除分词策略:
删除名词(n)、动词(v)、形容词(a)、成语(i)、叹词(e)和习用语(l)六种分词策略:
ALTER TEXT SEARCH CONFIGURATION zh_cn DROP MAPPING IF EXISTS FOR n,v,a,i,e,l;
通过以下下两个函数测试全文检索中文分词功能:
to_tsvector:
SELECT to_tsvector('zh_cn', '有两种方法进行全文检索');
返回信息如下:
to_tsvector --------------------------------------- '全文检索':4 '方法':2 '有':1 '进行':3 (1 ROW)
to_tsquery:
SELECT to_tsquery('zh_cn', '有两种方法进行全文检索');
返回信息如下:
to_tsquery ------------------------------------- '有' & '方法' & '进行' & '全文检索' (1 ROW)
自定义词典
云原生数据仓库 AnalyticDB PostgreSQL 版Zhparser插件支持自定义词典。通过向自定义词典表zhparser.zhprs_custom_word
写入或删除数据,实现添加或删除自定义词的功能。词典表zhparser.zhprs_custom_word
的表结构如下。
您无需手动创建词典表。安装zhparser插件时,系统会自动创建词典表
zhparser.zhprs_custom_word
。已安装zhparser插件的用户,系统也已经自动创建了词典表
zhparser.zhprs_custom_word
,您无需再手动创建。
CREATE TABLE zhparser.zhprs_custom_word
(
word text PRIMARY key, --- 自定义词
tf FLOAT DEFAULT '1.0', --- 该词的自定义TF值,默认1.0
idf FLOAT DEFAULT '1.0', --- 该词的自定义IDF值,默认1.0
attr CHAR DEFAULT '@', CHECK(attr = '@' OR attr = '!') --- 该词的词性:@ 新增;! 停止
);
添加自定义词典配置
添加自定义分词配置至解析器zh_cn中,具体SQL语句如下。
ALTER TEXT SEARCH CONFIGURATION zh_cn ADD MAPPING FOR x with simple;
添加自定义词
INSERT INTO zhparser.zhprs_custom_word(word, attr) VALUES('两种方法', '@');
删除自定义词
DELETE FROM zhparser.zhprs_custom_word WHERE word='两种方法';
查询自定义词典表
SELECT * FROM zhparser.zhprs_custom_word;
加载自定义词典表
在添加或删除自定义词之后,需要重新加载自定义词典表,新的自定义词典表才能生效。重新加载自定义词典表的SQL语句如下。
SELECT sync_zhprs_custom_word();
自定义分词的检索效果
在配置自定义词典表前后,分别执行示例语句,验证分词结果。示例SQL语句如下。
SELECT to_tsvector('zh_cn', '有两种方法进行全文检索');
分词检索效果如下:
未配置自定义词典表
+---------------------------------------+
| to_tsvector |
+---------------------------------------+
|'全文检索':4 '方法':2 '有':1 '进行':3 |
+---------------------------------------+
(1 ROW)
在词典表中添加词“两种方法”
+---------------------------------------+
| to_tsvector |
+---------------------------------------+
|'两种方法':2 '全文检索':4 '有':1 '进行':3|
+---------------------------------------+
(1 ROW)
相关文档
全文检索总体介绍,请参见全文检索。
全文检索函数和操作符,请参见文本检索函数和操作符。