AnalyticDB PostgreSQL版数据库安装Zhparser插件后可以实现全文检索时的中文分词。

说明 全文检索功能仅支持AnalyticDB PostgreSQL 6.0版

全文检索概述

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插件。
    CREATE EXTENSION zhparser;
    说明 需要使用rds_superuser权限账号安装。
  2. 配置中文解析器,取名为zh_cn。
    CREATE TEXT SEARCH CONFIGURATION zh_cn (PARSER = zhparser);

    配置完成后,您可以通过\dF\dFp命令查看配置。目前暂不支持用户自定义词典。

  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)

相关文档