华为云用户手册

  • 参数说明 IF EXISTS 如果不存在相同名称的表,不会抛出错误,而会返回一个通知,告知表不存在。 tablename 需要修改的外表名称。 取值范围:已存在的外表名。 new_owner 外表的新所有者。 取值范围:字符串,有效的用户名。 data_type 现存字段的新类型。 取值范围:字符串,需符合标识符的命名规范。 constraint_name 要添加/删除的约束的名称。 column_name 现存字段的名称。 取值范围:字符串,需符合标识符的命名规范。 修改外表语法中其他参数如IF EXISTS,请参见ALTER TABLE的参数说明。
  • 示例 创建HDFS_Server,对应的foreign data wrapper为HDFS_FDW或者DFS_FDW。 1 CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000',hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop',type'HDFS'); 创建不包含分区列的HDFS外表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 DROP FOREIGN TABLE IF EXISTS ft_region; CREATE FOREIGN TABLE ft_region ( R_REGIONKEY INT4, R_NAME TEXT, R_COMMENT TEXT ) SERVER hdfs_server OPTIONS ( FORMAT 'orc', encoding 'utf8', FOLDERNAME '/user/hive/warehouse/gauss.db/region_orc11_64stripe/' ) DISTRIBUTE BY roundrobin; 修改外表ft_region的r_name字段类型为text: 1 ALTER FOREIGN TABLE ft_region ALTER r_name TYPE TEXT; 标记外表ft_region的r_name列为not null: 1 ALTER FOREIGN TABLE ft_region ALTER r_name SET NOT NULL;
  • 语法格式 设置外表属性: 1 2 ALTER FOREIGN TABLE [ IF EXISTS ] table_name OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ]); 设置外表的所有者: 1 2 ALTER FOREIGN TABLE [ IF EXISTS ] tablename OWNER TO new_owner; 更新外表列: 1 2 ALTER FOREIGN TABLE [ IF EXISTS ] table_name MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] ); 修改外表的列: 1 2 ALTER FOREIGN TABLE [ IF EXISTS ] tablename action [, ... ]; 其中action语法为: 1 2 3 4 5 6 7 ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL | ALTER [ COLUMN ] column_name SET STATIS TICS [PERCENT] integer | ALTER [ COLUMN ] column_name OPTIONS ( {[ ADD | SET | DROP ] option ['value'] } [, ... ]) | MODIFY column_name data_type | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | MODIFY column_name [ CONSTRAINT constraint_name ] NULL 参考ALTER TABLE。
  • 语法格式 设置外表属性 1 2 ALTER FOREIGN TABLE [ IF EXISTS ] table_name OPTIONS ( {[ ADD | SET | DROP ] option ['value']}[, ... ]); 设置新的所有者 1 2 ALTER FOREIGN TABLE [ IF EXISTS ] tablename OWNER TO new_owner;
  • 示例 创建外表customer_ft,用来以TEXT格式导入GDS服务器10.10.123.234上的数据: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 DROP FOREIGN TABLE IF EXISTS customer_ft; CREATE FOREIGN TABLE customer_ft ( c_customer_sk integer , c_customer_id char(16) , c_current_cdemo_sk integer , c_current_hdemo_sk integer , c_current_addr_sk integer , c_first_shipto_date_sk integer , c_first_sales_date_sk integer , c_salutation char(10) , c_first_name char(20) , c_last_name char(30) , c_preferred_cust_flag char(1) , c_birth_day integer , c_birth_month integer , c_birth_year integer , c_birth_country varchar(20) , c_login char(13) , c_email_address char(50) , c_last_review_date char(10) ) SERVER gsmpp_server OPTIONS ( location 'gsfs://10.10.123.234:5000/customer1*.dat', FORMAT 'TEXT' , DELIMITER '|', encoding 'utf8', mode 'Normal')READ ONLY; 修改外表customer_ft属性,删除mode选项: 1 ALTER FOREIGN TABLE customer_ft options(drop mode);
  • 参数说明 database_name 需要修改属性的数据库名称。 取值范围:字符串,要符合标识符的命名规范。 connlimit 数据库可以接收的最大并发连接数(管理员用户连接除外)。 取值范围:整数,建议填写1~50的整数。-1(缺省)表示没有限制。 new_name 数据库的新名称。 取值范围:字符串,要符合标识符的命名规范。 new_owner 数据库的新所有者。 取值范围:字符串,有效的用户名。 configuration_parameter value 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 取值范围:字符串, DEFAULT OFF RESET FROM CURRENT 根据当前会话连接的数据库设置该参数的值。 RESET configuration_parameter 重置指定的数据库会话参数值。 RESET ALL 重置全部的数据库会话参数值。 修改数据库默认表空间,会将旧表空间中的所有表和索引转移到新表空间中,该操作不会影响其他非默认表空间中的表和索引。 修改的数据库会话参数值,将在下一次会话中生效。
  • 语法格式 修改数据库的最大连接数。 1 2 ALTER DATABASE database_name [ [ WITH ] CONNECTION LIMIT connlimit ]; 修改数据库名称。 1 2 ALTER DATABASE database_name RENAME TO new_name; 若该数据库中有OBS冷热表,则不支持修改数据库名。 修改数据库所属者。 1 2 ALTER DATABASE database_name OWNER TO new_owner; 修改数据库默认表空间。 1 2 ALTER DATABASE database_name SET TABLESPACE new_tablespace; 修改数据库的表空间时不能修改为OBS表空间。 修改数据库指定会话参数值。 1 2 ALTER DATABASE database_name SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }; 数据库配置参数重置。 1 2 ALTER DATABASE database_name RESET { configuration_parameter | ALL };
  • 示例 创建示例数据库testdb和用户tom: 1 CREATE DATABASE testdb ENCODING 'UTF8' template = template0; 1 2 DROP USER IF EXISTS tom; CREATE USER tom PASSWORD '{Password}'; 设置testdb数据库的连接数为10: 1 ALTER DATABASE testdb CONNECTION LIMIT= 10; 将testdb名称改为testdb_1: 1 ALTER DATABASE testdb RENAME TO testdb_1; 将数据库testdb_1的所属者改为tom: 1 ALTER DATABASE testdb_1 OWNER TO tom; 设置music1的表空间为PG_DEFAULT: 1 ALTER DATABASE testdb_1 SET TABLESPACE PG_DEFAULT; 关闭在数据库testdb_1上缺省的索引扫描: 1 ALTER DATABASE testdb_1 SET enable_indexscan TO off; 重置enable_indexscan参数: 1 ALTER DATABASE testdb_1 RESET enable_indexscan;
  • 注意事项 只有拥有数据库所有者权限的用户才能执行ALTER DATABASE命令,系统管理员默认拥有此权限。如果是非系统管理员,针对所要修改属性的不同,对其还有以下权限约束: 修改数据库名称,必须拥有CREATEDB权限。 修改数据库所有者,当前用户必须是该数据库的所有者且拥有CREATEDB权限,并确保该用户是新所有者角色的成员。 修改数据库默认表空间,该用户必须是该数据库的所有者或系统管理员且拥有新表空间的CREATE权限。该语法从物理上将一个数据库原来缺省表空间上的表和索引移至新的表空间。注意不在缺省表空间的表和索引不受此影响。 修改某个按数据库设置的相关参数,只有数据库所有者或者系统管理员可以改变这些设置。 修改某个数据库对象隔离属性,只有数据库所有者或者系统管理员可以执行此操作。 不能重命名当前使用的数据库,如果需要重新命名,须连接至其他数据库上。 不支持修改现有数据库的兼容模式,只能在创建数据库时指定兼容模式,详情请参见CREATE DATABASE。
  • 定义文本搜索配置 文本搜索配置指定了文本搜索解析器,该文本搜索解析器可以将字符串划分为标记,外加一些词典(可被用来决定哪些标记是搜索感兴趣的)。所涉及的SQL语句,请参考下表。 表20 文本搜索配置相关SQL 功能 相关SQL 创建文本搜索配置 CREATE TEXT SEARCH CONFIGURATION 修改文本搜索配置 ALTER TEXT SEARCH CONFIGURATION 删除文本搜索配置 DROP TEXT SEARCH CONFIGURATION
  • 定义全文检索词典 词典是在全文检索时识别特定词并进行处理。词典的创建依赖于预定义模板(在系统表PG_TS_TEMPLATE中定义),支持创建五种类型的词典,分别是Simple、Ispell、Synonym、Thesaurus、以及Snowball,每种类型的词典可以完成不同的任务。所涉及的SQL语句,请参考下表。 表21 全文检索词典相关SQL 功能 相关SQL 创建全文检索词典 CREATE TEXT SEARCH DICTIONARY 修改全文检索词典 ALTER TEXT SEARCH DICTIONARY 删除全文检索词典 DROP TEXT SEARCH DICTIONARY
  • 定义分区表 分区表是一种逻辑表,数据是由普通表存储的,主要用于提升查询性能。所涉及的SQL语句,请参考下表。 表4 分区表定义相关SQL 功能 相关SQL 创建分区表 CREATE TABLE PARTITION 修改分区 ALTER TABLE PARTITION 修改分区表属性 ALTER TABLE PARTITION 删除分区 ALTER TABLE PARTITION 删除分区表 DROP TABLE
  • 定义外表 外表是指一个逻辑上的表对象,它对应的实际数据存储位置并不在数据库内部,而是存储于外部存储服务中。 表5 外表定义相关SQL 功能 相关SQL 创建GDS外表 CREATE FOREIGN TABLE (GDS导入导出) 创建HDFS或OBS外表(需手动创建Server) CREATE FOREIGN TABLE (SQL on OBS or Hadoop) 创建OBS外表(默认Server) CREATE FOREIGN TABLE (OBS导入导出) 创建协同分析外表 CREATE FOREIGN TABLE (SQL on other GaussDB (DWS)) 修改GDS外表 ALTER FOREIGN TABLE (GDS导入导出) HDFS外表和OBS外表 ALTER FOREIGN TABLE (For HDFS or OBS) 修改协同分析外表 ALTER FOREIGN TABLE (SQL on other GaussDB(DWS)) 删除外表 DROP FOREIGN TABLE
  • 定义脱敏策略 数据脱敏策略是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。用户可以在指定表对象创建脱敏策略,并限定策略生效范围,也可以新增、修改、删除脱敏列信息。所涉及的SQL语句,请参考下表。 表9 脱敏策略定义相关SQL 功能 相关SQL 对表创建数据脱敏策略 CREATE REDACTION POLICY 修改应用在指定表的脱敏策略 ALTER REDACTION POLICY 删除应用在指定表的脱敏策略 DROP REDACTION POLICY
  • 定义行级访问控制 行级访问控制策略控制数据库表中行级数据可见性。不同用户执行相同的SQL查询操作,读取到的结果不同。所涉及的SQL语句,请参考下表。 表10 行级访问控制定义相关SQL 功能 相关SQL 创建行访问控制策略 CREATE ROW LEVEL SECURITY POLICY 修改已存在的行访问控制策略 ALTER ROW LEVEL SECURITY POLICY 删除表上某个行访问控制策略 DROP ROW LEVEL SECURITY POLICY
  • 两阶段事务 GaussDB(DWS)属于分布式share-nothing架构,表的数据分布在不同的节点上。客户端的一条或多条语句可能会同时修改多个节点上的数据,这种情况下,会产生分布式事务。GaussDB(DWS)采用两阶段提交事务来保证分布式事务中数据的一致性和事务的原子性。顾名思义,两阶段提交就是将事务提交划分为两个阶段,通常针对的是包含写操作的事务。当写操作将数据写入不同的节点时,需要满足事务的原子性要求,要么全部提交,要么全部回滚。 不支持两阶段的场景如下: 不支持显示的两阶段提交语法PREPARE TRANSACTION。 1 2 BEGIN; PREPARE TRANSACTION 'p1'; 不支持在两阶段事务中修改系统表的文件映射关系。 1 REINDEX TABLE pg_class; 不支持在跨节点的事务中提交导出事务快照。 1 2 3 4 BEGIN; CREATE TABLE t1(a int); SELECT pg_export_snapshot(); END;
  • 隔离级别 Isolation(隔离性)可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离级别,决定多个事务并发操作同一个对象时的处理方式。 GaussDB(DWS)的事务隔离级别,由GUC参数transaction_isolation或SET TRANSACTION语法设置,支持以下隔离级别,默认为读已提交(read committed)。 read committed:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。 read uncommitted:读未提交隔离级别,GaussDB(DWS)不支持read uncommitted,如果设置了read uncommitted,实际上使用的是read committed。 repeatable read:可重复读隔离级别,仅仅能看到事务开始之前提交的数据,不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 serializable:事务可序列化,GaussDB(DWS)不支持serializable,如果设置了serializable,实际上使用的是repeatable read。
  • 事务场景示例 某顾客在商店使用电子支付购买100元的物品,当中至少包括两个操作:1. 该顾客的账户减少100元。2. 商店账户(商户)增加100元。支持事务的数据库管理系统就是要确保以上两个操作(整个“事务”)都能完成,或一起取消。 创建样例数据: 创建一个简单的用户金额表并向表中插入数据(假设商户和顾客的账户上各有500元)。 1 2 3 4 5 CREATE TABLE customer_info ( NAME VARCHAR(32) PRIMARY KEY, MONEY INTEGER ); INSERT INTO customer_info (name, money) VALUES ('buyer', 500), ('shop', 500); 查看表数据显示商户和顾客各有500元。 1 SELECT * FROM customer_info; 普通操作(正常模式)。 模拟正常购买过程,顾客先扣款100元,商户再增加款额100元。 1 2 3 4 UPDATE customer_info SET money = money-100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'buyer'); UPDATE customer_info SET money = money+100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'shop'); SELECT * FROM customer_info; 恢复初始值。 1 2 UPDATE customer_info SET money=500; select * from customer_info; 普通操作(异常模式)。 模拟购买过程出现状况,顾客发生扣款100元,商户没有增加款额。 顾客先扣款100元。 1 UPDATE customer_info SET money = money-100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'buyer'); 商户发现支付有问题,终止了后续交易。商户增加款操作直接报错,终止执行下面的语句。(仅商户觉得支付有问题) 1 UPDATE customer_info SET money = money+100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'shop'); 查询结果发现:消费者已经扣款,但商户没增加款额,这里顾客的金额了100元。 1 SELECT * FROM customer_info; 因此,如果没有事务,一旦SQL语句中间出现异常,整个账户系统的收支就不平衡了。 使用数据库事务,模拟出现异常操作时,进行事务回滚。 恢复初始值: 1 UPDATE customer_info SET money=500; 开启事务后,顾客先扣款100元。 1 2 BEGIN TRANSACTION; UPDATE customer_info SET money = money-100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'buyer'); 商户增加款额操作直接报错,终止执行下面的语句。 1 UPDATE customer_info SET money = money+100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'shop'); 回滚事务,在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销。 1 2 END TRANSACTION; ROLLBACK 查询显示顾客和商户的账户金额仍旧完整一致。即数据库在事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,数据库的完整性没有被破坏。 1 SELECT * FROM customer_info;
  • 事务的属性 事务具有以下四个标准属性,通常根据首字母缩写为ACID。 Atomicity(原子性):事务中的全部操作在数据库中是不可分割的,整个事务中的所有操作要么全部完成,要么全部失败,对于一个事务来说,不能只执行其中的一部分操作。 比如: A给B转账,A扣除500元 ,B增加500元。整个事务的操作要么全部成功,要么全部失败,不能出现A扣钱,但是B不增加的情况。如果原子性不能保证,就会出现一致性问题。 Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,这包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 比如:A给B转账,A扣除500元 ,B增加500元,扣除的钱-500与增加的钱+500,相加应该为0。如从A账户转账500元到B账户,不管操作成功与否,A和B的存款总额是不变的。 Isolation(隔离性):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。 Durability(持久性):一旦事务提交,则其所做的修改就会永久保存到数据库中。即使系统故障,已经提交的修改数据也不会丢失。 表1 ACID用途 ACID 属性 用途 Atomicity 原子性 并发控制,故障恢复。 Consistency 一致性 SQL的完整性约束(主键约束、外键约束)。 Isolation 隔离性 并发控制。 Durability 持久性 故障恢复。 常用的并发控制技术有基于锁的并发控制和基于时间戳的并发控制,GaussDB(DWS)数据库针对DDL语句采用两阶段锁技术,而针对DML语句则采用多版本控制技术(Multi-Version Concurrency Control,MVCC)。GaussDB(DWS)数据库的故障恢复采用WAL日志的方式来实现,目前主要支持Redo日志,通过Redo日志和MVCC可以保证事务读写的一致性。
  • 事务控制语法 启动事务 GaussDB(DWS)通过START TRANSACTION和BEGIN语法启动事务,请参考START TRANSACTION和BEGIN。 设置事务 GaussDB(DWS)通过SET TRANSACTION或者SET LOCAL TRANSACTION语法设置事务,请参考SET TRANSACTION。 提交事务 GaussDB(DWS)通过COMMIT或者END可完成提交事务的功能,即提交事务的所有操作,请参考COMMIT | END。 回滚事务 回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销。请参考ROLLBACK。 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,如果其中有一个语句失败,那么整个请求都将会被回滚。 其他事务操作 SAVEPOINT用于在当前事务里建立一个新的保存点。即在一个事务中标记一个位置并且允许做部分回滚。用户可以回滚在一个保存点之后执行的命令但保留该保存点之前执行的命令。请参考SAVEPOINT。 ROLLBACK TO SAVEPOINT回滚事务到一个保存点。隐含地删除所有在该保存点之后建立的保存点。请参考ROLLBACK TO SAVEPOINT。 RELEASE SAVEPOINT删除一个事务内的保存点。请参考RELEASE SAVEPOINT。
  • 词典测试 函数ts_lexize用于进行词典测试。 ts_lexize(dict regdictionary, token text) returns text[]如果输入的token可以被词典识别,那么ts_lexize返回词素的数组;如果token可以被词典识别但它是一个停用词,则返回空数组;如果是一个不可识别的词则返回NULL。 比如: 1 2 3 4 5 6 7 8 9 SELECT ts_lexize('english_stem', 'stars'); ts_lexize ----------- {star} SELECT ts_lexize('english_stem', 'a'); ts_lexize ----------- {} ts_lexize函数支持单一token,不支持文本。 父主题: 测试和调试文本搜索
  • 解析器测试 函数ts_parse可以直接测试文本搜索解析器。 1 2 ts_parse(parser_name text, document text, OUT tokid integer, OUT token text) returns setof record ts_parse解析指定的document并返回一系列的记录,一条记录代表一个解析生成的token。每条记录包括标识token类型的tokid,及token文本。比如: 1 2 3 4 5 6 7 8 9 10 SELECT * FROM ts_parse('default', '123 - a number'); tokid | token -------+-------- 22 | 123 12 | 12 | - 1 | a 12 | 1 | number (6 rows) 1 2 ts_token_type(parser_name text, OUT tokid integer, OUT alias text, OUT description text) returns setof record ts_token_type返回一个表,这个表描述了指定解析器可以识别的每种token类型。对于每个token类型,表中给出了整数类型的tokid--用于解析器标记对应的token类型;alias——命名分词器命令中的token类型;及简单描述。比如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 SELECT * FROM ts_token_type('default'); tokid | alias | description -------+-----------------+------------------------------------------ 1 | asciiword | Word, all ASCII 2 | word | Word, all letters 3 | numword | Word, letters and digits 4 | email | Email address 5 | url | URL 6 | host | Host 7 | sfloat | Scientific notation 8 | version | Version number 9 | hword_numpart | Hyphenated word part, letters and digits 10 | hword_part | Hyphenated word part, all letters 11 | hword_asciipart | Hyphenated word part, all ASCII 12 | blank | Space symbols 13 | tag | XML tag 14 | protocol | Protocol head 15 | numhword | Hyphenated word, letters and digits 16 | asciihword | Hyphenated word, all ASCII 17 | hword | Hyphenated word, all letters 18 | url_path | URL path 19 | file | File or path name 20 | float | Decimal notation 21 | int | Signed integer 22 | uint | Unsigned integer 23 | entity | XML entity (23 rows) 父主题: 测试和调试文本搜索
  • 分词器测试 函数ts_debug允许简单测试文本搜索分词器。 1 2 3 4 5 6 7 8 ts_debug([ config regconfig, ] document text, OUT alias text, OUT description text, OUT token text, OUT dictionaries regdictionary[], OUT dictionary regdictionary, OUT lexemes text[]) returns setof record ts_debug显示document的每个token信息,token是由解析器生成,由指定的词典进行处理。如果忽略对应参数,则使用config指定的分词器或者default_text_search_config指定的分词器。 ts_debug为文本解析器标识的每个token返回一行记录。记录中的列分别是: alias:text类型,token的别名。 description:text类型,token的描述。 token:text类型,token的文本内容。 dictionaries:regdictionary数组类型,是分词器为token选定的词典。 dictionary:regdictionary类型,用来识别token的词典。如果为空,则不做识别。 lexemes:text数组类型,词典识别token时生成的词素。如果为空,则不生成词素。空数组({})意味着token将被识别成停用词。 一个简单的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 SELECT * FROM ts_debug('english','a fat cat sat on a mat - it ate a fat rats'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+----------------+--------------+--------- asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | fat | {english_stem} | english_stem | {fat} blank | Space symbols | | {} | | asciiword | Word, all ASCII | cat | {english_stem} | english_stem | {cat} blank | Space symbols | | {} | | asciiword | Word, all ASCII | sat | {english_stem} | english_stem | {sat} blank | Space symbols | | {} | | asciiword | Word, all ASCII | on | {english_stem} | english_stem | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | mat | {english_stem} | english_stem | {mat} blank | Space symbols | | {} | | blank | Space symbols | - | {} | | asciiword | Word, all ASCII | it | {english_stem} | english_stem | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | ate | {english_stem} | english_stem | {ate} blank | Space symbols | | {} | | asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | fat | {english_stem} | english_stem | {fat} blank | Space symbols | | {} | | asciiword | Word, all ASCII | rats | {english_stem} | english_stem | {rat} (24 rows) 父主题: 测试和调试文本搜索
  • 操作步骤 创建一个文本搜索配置ts_conf,复制预定义的文本搜索配置english。 1 2 CREATE TEXT SEARCH CONFIGURATION ts_conf ( COPY = pg_catalog.english ); CREATE TEXT SEARCH CONFIGURATION 创建Synonym词典。 假设同义词词典定义文件pg_dict.syn内容如下: 1 2 3 postgres pg pgsql pg postgresql pg 执行如下语句创建Synonym词典: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 CREATE TEXT SEARCH DICTIONARY pg_dict ( TEMPLATE = synonym, SYNONYMS = pg_dict, FILEPATH = 'obs://bucket01/obs.example.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1' ); 创建一个Ispell词典english_ispell(词典定义文件来自开源词典)。 1 2 3 4 5 6 7 CREATE TEXT SEARCH DICTIONARY english_ispell ( TEMPLATE = ispell, DictFile = english, AffFile = english, StopWords = english, FILEPATH = 'obs://bucket01/obs.example.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1' ); 设置文本搜索配置ts_conf,修改某些类型的token对应的词典列表。关于token类型的详细信息,请参见文本搜索解析器。 1 2 3 4 ALTER TEXT SEARCH CONFIGURATION ts_conf ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part WITH pg_dict, english_ispell, english_stem; 在文本搜索配置中,选择设置不索引或搜索某些token类型。 1 2 ALTER TEXT SEARCH CONFIGURATION ts_conf DROP MAPPING FOR email, url, url_path, sfloat, float; 使用文本检索调测函数ts_debug()对所创建的词典配置ts_conf进行测试。 1 2 3 4 5 SELECT * FROM ts_debug('ts_conf', ' PostgreSQL, the highly scalable, SQL compliant, open source object-relational database management system, is now undergoing beta testing of the next version of our software. '); 可以设置当前session使用ts_conf作为默认的文本搜索配置。此设置仅在当前session有效。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 \dF+ ts_conf Text search configuration "public.ts_conf" Parser: "pg_catalog.default" Token | Dictionaries -----------------+------------------------------------- asciihword | pg_dict,english_ispell,english_stem asciiword | pg_dict,english_ispell,english_stem file | simple host | simple hword | pg_dict,english_ispell,english_stem hword_asciipart | pg_dict,english_ispell,english_stem hword_numpart | simple hword_part | pg_dict,english_ispell,english_stem int | simple numhword | simple numword | simple uint | simple version | simple word | pg_dict,english_ispell,english_stem SET default_text_search_config = 'public.ts_conf'; SET SHOW default_text_search_config; default_text_search_config ---------------------------- public.ts_conf (1 row)
  • Snowball词典 Snowball词典模板支持词干分析词典,基于Martin Porter的Snowball项目,内置有许多语言的词干分析算法。GaussDB(DWS)中预定义有多种语言的Snowball词典,可通过系统表PG_TS_DICT查看预定义的词干分析词典以及支持的语言词干分析算法。 无论是否可以简化,Snowball词典将标示所有输入为已识别,因此它应当被放置在词典列表的最后。把Snowball词典放在任何其他词典前面会导致后继词典失效,因为输入token不会通过Snowball词典进入到下一个词典。 关于Snowball词典的语法,请参见CREATE TEXT SEARCH DICTIONARY。 父主题: 词典
  • 操作步骤 获取词典定义文件和词缀文件。 用户可以使用开源词典,直接获取的开源词典后缀名可能为.aff和.dic,此时需要将扩展名改为.affix和.dict。此外,对于某些词典文件,还需要使用下面的命令把字符转换成UTF-8编码,比如挪威语词典: 1 2 iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic 创建Ispell词典。 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 CREATE TEXT SEARCH DICTIONARY norwegian_ispell ( TEMPLATE = ispell, DictFile = nn_no, AffFile = nn_no, FilePath = 'obs://bucket01/obs.example.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1' ); 其中,词典文件全名为nn_no.dict和nn_no.affix,所在目录为 'obs://bucket01/obs.example.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1'。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 使用Ispell词典进行复合词拆分。 1 2 3 4 5 SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk'); ts_lexize --------------------- {sjokolade,fabrikk} (1 row) MySpell不支持复合词,Hunspell对复合词有较好的支持。GaussDB(DWS)仅支持Hunspell中基本的复合词操作。通常情况下,Ispell词典能够识别的词是一个有限集合,其后应该配置一个更广义的词典,例如一个可以识别所有词的Snowball词典。
  • 注意事项 由于TZ词典需要识别短语,所以在处理过程中必须保存当前状态并与解析器进行交互,以决定是否处理下一个token或是结束当前识别。此外,TZ词典配置时需谨慎,如果设置TZ词典仅处理asciiword类型的token,则类似one 7的分类词典定义将不会生效,因为uint类型的token不会传给TZ词典处理。 在索引期间要用到分类词典,因此分类词典参数中的任何变化都要求重新索引。对于其他大多数类型的词典来说,类似添加或删除停用词这种修改并不需要强制重新索引。
  • 操作步骤 创建一个名为thesaurus_astro的TZ词典。 以一个简单的天文学词典thesaurus_astro为例,其中定义了两组天文短语及其同义词如下: 1 2 supernovae stars : sn crab nebulae : crab 执行如下语句创建TZ词典: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 CREATE TEXT SEARCH DICTIONARY thesaurus_astro ( TEMPLATE = thesaurus, DictFile = thesaurus_astro, Dictionary = pg_catalog.english_stem, FILEPATH = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' ); 其中,词典定义文件全名为thesaurus_astro.ths,所在目录为 "obs://bucket_name/path accesskey=ak secretkey=sk region=rg"。子词典pg_catalog.english_stem是预定义的Snowball类型的英语词干词典,用于规范化输入词,子词典自身相关配置(例如停用词等)不在此处显示。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 创建词典后,将其绑定到对应文本搜索配置中需要处理的token类型上: 1 2 3 ALTER TEXT SEARCH CONFIGURATION english ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH thesaurus_astro, english_stem; 使用TZ词典。 测试TZ词典。 ts_lexize函数对于测试TZ词典作用不大,因为该函数是按照单个token处理输入。可以使用plainto_tsquery、to_tsvector、to_tsquery函数测试TZ词典,这些函数能够将输入分解成多个token(to_tsquery函数需要将输入加上引号)。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT plainto_tsquery('english','supernova star'); plainto_tsquery ----------------- 'sn' (1 row) SELECT to_tsvector('english','supernova star'); to_tsvector ------------- 'sn':1 (1 row) SELECT to_tsquery('english','''supernova star'''); to_tsquery ------------ 'sn' (1 row) 其中,supernova star匹配了词典thesaurus_astro定义中的supernovae stars,这是因为在thesaurus_astro词典定义中指定了Snowball类型的子词典english_stem,该词典移除了e和s。 如果同时需要索引原始短语,只要将其同时放置在词典定义文件中对应定义的右侧即可,如下: 1 2 3 4 5 6 7 8 9 10 11 supernovae stars : sn supernovae stars ALTER TEXT SEARCH DICTIONARY thesaurus_astro ( DictFile = thesaurus_astro, FILEPATH = 'file:///home/dicts/'); SELECT plainto_tsquery('english','supernova star'); plainto_tsquery ----------------------------- 'sn' & 'supernova' & 'star' (1 row)
  • 示例 Synonym词典可用于解决语言学相关问题,例如,为避免使单词"Paris"变成"pari",可在Synonym词典文件中定义一行"Paris paris",并将该词典放置在预定义的english_stem词典之前。 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+----------------+--------------+--------- asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari} (1 row) CREATE TEXT SEARCH DICTIONARY my_synonym ( TEMPLATE = synonym, SYNONYMS = my_synonyms, FILEPATH = 'obs://bucket01/obs.example.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1' ); ALTER TEXT SEARCH CONFIGURATION english ALTER MAPPING FOR asciiword WITH my_synonym, english_stem; SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) SELECT * FROM ts_debug('english', 'paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) ALTER TEXT SEARCH DICTIONARY my_synonym ( CASESENSITIVE=true); SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) SELECT * FROM ts_debug('english', 'paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {pari} (1 row) 其中,同义词词典文件全名为my_synonyms.syn,所在目录为 'obs://bucket01/obs.example.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1'。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 星号(*)可用于词典文件中的同义词结尾,表示该同义词是一个前缀。在to_tsvector()中该星号将被忽略,但在to_tsquery()中会匹配该前缀并对应输出结果(参照处理tsquery一节)。 假设词典文件synonym_sample.syn内容如下: 1 2 3 4 5 postgres pgsql postgresql pgsql postgre pgsql gogle googl indices index* 创建并使用词典: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 CREATE TEXT SEARCH DICTIONARY syn ( TEMPLATE = synonym, SYNONYMS = synonym_sample ); SELECT ts_lexize('syn','indices'); ts_lexize ----------- {index} (1 row) CREATE TEXT SEARCH CONFIGURATION tst (copy=simple); ALTER TEXT SEARCH CONFIGURATION tst ALTER MAPPING FOR asciiword WITH syn; SELECT to_tsvector('tst','indices'); to_tsvector ------------- 'index':1 (1 row) SELECT to_tsquery('tst','indices'); to_tsquery ------------ 'index':* (1 row) SELECT 'indexes are very useful'::tsvector; tsvector --------------------------------- 'are' 'indexes' 'useful' 'very' (1 row) SELECT 'indexes are very useful'::tsvector @@ to_tsquery('tst','indices'); ?column? ---------- t (1 row)
  • 注意事项 大多数词典的功能依赖于词典定义文件,词典定义文件名仅支持小写字母、数字、下划线组合。 临时模式pg_temp下不允许创建词典。 词典定义文件的字符集编码必须为UTF-8格式。实际应用时,如果与数据库的字符编码格式不一致,在读入词典定义文件时会进行编码转换。 通常情况下,每个session仅读取词典定义文件一次,当且仅当在第一次使用该词典时。需要修改词典文件时,可通过ALTER TEXT SEARCH DICTIONARY命令进行词典定义文件的更新和重新加载。
共100000条