云原生数据仓库 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

  1. 安装Zhparser插件。

    使用全文检索时的中文分词功能之前,您需要在云原生数据仓库 AnalyticDB PostgreSQL 版实例插件管理中安装Zhparser插件。具体操作,请参见安装、升级与卸载插件

  2. 配置中文解析器,取名为zh_cn。

    CREATE TEXT SEARCH CONFIGURATION zh_cn (PARSER = zhparser);
  3. 查看分词策略。

    • 查看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');
  4. 添加或删除分词策略:

    • 添加分词策略:

      添加名词(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;
  5. 通过以下下两个函数测试全文检索中文分词功能:

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

相关文档