
# 使用zhparser插件
#### 简介
PostgreSQL自带的parser插件适用于分词比较简单的语言（如英语），按照标点、空格切分语句即可获得有含义的词语，而中文比较复杂，词语之间没有空格分隔，长度也不固定，分词还和语义有关，因此parser不能用来做中文分词，建议使用zhparser。
zhparser是PostgreSQL的中文分词插件，安装后可以使PostgreSQL支持中文的全文检索（Full Text Search）。
更多信息，请参见[zhparser官方文档](https://github.com/amutu/zhparser)。
#### 支持的版本说明
PostgreSQL 9.5及以上版本的最新小版本支持该插件。可通过以下SQL语句查询当前实例是否支持该插件：
```
SELECT * FROM pg_available_extension_versions WHERE name = 'zhparser';
```
如果不支持，可通过[升级内核小版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0003.html)或者[使用转储与还原升级大版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0053.html)使用该插件。
RDS for PostgreSQL实例支持的插件，具体请参见[支持的插件列表](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0045.html)。
#### 插件介绍
RDS PostgreSQL支持zhparser插件，用于中文的全文检索。
PostgreSQL默认按照空格及各种标点符号来分词，不支持中文分词。RDS for PostgreSQL通过集成Zhparser扩展来支持中文分词。
#### 插件安装与卸载
- 安装插件
  ```
  SELECT control_extension('create', 'zhparser');
  ```
  
- 删除插件
  ```
  SELECT control_extension('drop', 'zhparser');
  ```
  
更多信息，请参见[通过界面安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0070.html)和[通过SQL命令安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0043.html)。
#### 基本使用
- 全文检索中文分词功能
  ```
  -- 查看Zhparser的词典配置
  SELECT ts_token_type('zhparser');
  -- 配置中文解析器
  CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
  ```
  
- 添加分词策略
  ```
  -- 添加名词（n）、动词（v）、形容词（a）、成语（i）、叹词（e）和习用语（l） 六种分词策略
  ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
  ```
  
- 测试分词效果（to_tsvector）
  ```
  SELECT to_tsvector('testzhcfg','华为云数据库 RDS for PostgreSQL是一种典型的开源关系型数据库，在保证数据可靠性和完整性方面表现出色，支持互联网电商、地理位置应用系统、金融保险系统、复杂数据对象处理等场景。');
  to_tsvector
  ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  -------------------------------------------------------------------------------------------------------------------------
  'for':5 'postgresql':6 'rds':4 '云':2 '互联网':19 '保证':11 '典型':8 '出色':17 '华为':1 '可靠性':13 '地理位置':21 '场景':30 '处理':28 '复杂':25 '完整性':14 '对象':27 '应用系统':22 '开源':9 '支持':18 '数据':12,26 '数据库':3,10 '方面':15 '是':7 '电商':20 '等':29 '系统':24 '表现':16 '金融保险':23
  (1 row)
  ```
  
- 测试分词效果（to_tsquery）
  ```
  SELECT to_tsquery('testzhcfg', 'PostgreSQL是一种典型的开源关系型数据库，在保证数据可靠性和完整性方面表现出色');
  to_tsquery
  ---------------------------------------------------------------------------------------------------------------------------------------------
  'postgresql' & '是' & '典型' & '开源' & '数据库' & '保证' & '数据' & '可靠性' & '完整性' & '方面' & '表现' & '出色'
  (1 row)
  ```
  
 
#### 进阶使用
利用分词进行全文索引，示例：为t1表的name字段创建全文索引，使用时将SQL语句中的表名(t1)和字段(name)替换为实际业务中的表名和字段值。
```
-- 创建测试表
CREATE TABLE t1(name text);
INSERT INTO t1 VALUES ('华为云数据RDS for PostgreSQL是一种典型的开源关系型数据库');
INSERT INTO t1 VALUES ('在保证数据可靠性和完整性方面表现出色');
INSERT INTO t1 VALUES ('支持互联网电商、地理位置应用系统、金融保险系统、复杂数据对象处理等场景');
-- 创建索引
CREATE INDEX idx_t1 ON t1 USING gin (to_tsvector('testzhcfg',upper(name) ));
-- 使用全文索引
SELECT * FROM t1 WHERE to_tsvector('testzhcfg',upper(t1.name)) @@ to_tsquery('testzhcfg','(互联网)') ; 
                                                   name                                                    
-----------------------------------------------------------------------------------------------------------
 支持互联网电商、地理位置应用系统、金融保险系统、复杂数据对象处理等场景
(1 row)
```
