加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

PostgreSQL何以支持丰富的NoSQL特性?

发布时间:2018-10-02 15:38:22 所属栏目:MySql教程 来源:DBAplus社群
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 作者介绍 谭峰,网名francs,中国开源软件推进联盟PostgreSQL分会特聘专家,《PostgreSQL实战》作者之一,《PostgreSQL 9 Administration Cookbook》译者之一。现就职于浙江移动负责应用上云架构管控以及

tsvector全文检索数据类型代表一个被优化的可以基于搜索的文档,将一串字符串转换成tsvector全文检索数据类型,如下:

  1. mydb=> SELECT 'Hello,cat,how are u? cat is smiling! '::tsvector;  
  2. tsvector  
  3. --------------------------------------------------  
  4. 'Hello,cat,how' 'are' 'cat' 'is' 'smiling!' 'u?'  
  5. (1 row) 

可以看到,字符串的内容被分隔成好几段,但通过::tsvector只是做类型转换,没有进行数据标准化处理,对于英文全文检索可通过函数to_tsvector进行数据标准化,如下所示:

  1. mydb=> SELECT to_tsvector('english','Hello cat,');  
  2. to_tsvector  
  3. -------------------  
  4. 'cat':2 'hello':1  
  5. (1 row) 

Tsquery

tsquery表示一个文本查询,存储用于搜索的词,并且支持布尔操作&、|、!,将字符串转换成tsquery,如下所示:

  1. mydb=> SELECT 'hello&cat'::tsquery;  
  2. tsquery  
  3. -----------------  
  4. 'hello' & 'cat'  
  5. (1 row) 

上述只是转换成tsquery类型,而并没有做标准化,使用to_tsquery函数可以执行标准化,如下所示:

  1. mydb=> SELECT to_tsquery( 'hello&cat' ); 

to_tsquery

一个全文检索示例如下,检索字符串是否包括hello和cat字符,本例中返回真。

  1. mydb=> SELECT to_tsvector('english','Hello cat,how are u') @@to_tsquery( 'hello&cat' ); 

检索字符串是否包含字符hello和dog,本例中返回假。

  1. mydb=> SELECT to_tsvector('english','Hello cat,how are u') @@ to_tsquery( 'hello&dog' );  
  2. f  
  3. (1 row) 

有兴趣的读者可以测试tsquery的其他操作符,例如|、!等。

注意:这里使用了带双参数的to_tsvector函数,函数to_tsvector双参数的格式如下:

to_tsvector([ config regconfig , ] document text),本节to_tsvector函数指定了config参数为english,如果不指定config参数,则默认使用default_text_search_config参数的配置。

英文全文检索例子

下面演示一个英文全文检索示例,创建一张测试表并插入200万测试数据,如下所示:

  1. mydb=> CREATE TABLE test_search(id int4,name text);  
  2. CREATE TABLE  
  3. mydb=> INSERT INTO test_search(id,name) SELECT n, n||'_francs'  
  4. FROM generate_series(1,2000000) n;  
  5. INSERT 0 2000000 

执行以下SQL,查询test_search表name字段包含字符1_francs的记录。

  1. mydb=> SELECT * FROM test_search WHERE name LIKE '1_francs';  
  2. id | name  
  3. ----+----------  
  4. 1 | 1_francs  
  5. (1 row) 

执行计划如下:

  1. mydb=> EXPLAIN ANALYZE SELECT * FROM test_search WHERE name LIKE '1_francs';  
  2. QUERY PLAN  
  3. -------------------------------------------------------------------------------------Seq Scan on test_search (cost=0.00..38465.04 rows=204 width=18) (actual time=0.022..261.766 rows=1 loops=1)  
  4. Filter: (name ~~ '1_francs'::text)  
  5. Rows Removed by Filter: 1999999  
  6. Planning time: 0.101 ms  
  7. Execution time: 261.796 ms  
  8. (5 rows) 

以上执行计划走了全表扫描,执行时间为261毫秒左右,性能很低,接着创建索引,如下所示:

  1. mydb=> CREATE INDEX idx_gin_search ON test_search USING gin (to_tsvector('english',name)); 
  2. mydb=> SELECT * FROM test_search WHERE to_tsvector('english',name) @@ to_tsquery('english','1_francs'); 

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读