tsvector全文检索数据类型代表一个被优化的可以基于搜索的文档,将一串字符串转换成tsvector全文检索数据类型,如下:
- mydb=> SELECT 'Hello,cat,how are u? cat is smiling! '::tsvector;
- tsvector
- --------------------------------------------------
- 'Hello,cat,how' 'are' 'cat' 'is' 'smiling!' 'u?'
- (1 row)
可以看到,字符串的内容被分隔成好几段,但通过::tsvector只是做类型转换,没有进行数据标准化处理,对于英文全文检索可通过函数to_tsvector进行数据标准化,如下所示:
- mydb=> SELECT to_tsvector('english','Hello cat,');
- to_tsvector
- -------------------
- 'cat':2 'hello':1
- (1 row)
Tsquery
tsquery表示一个文本查询,存储用于搜索的词,并且支持布尔操作&、|、!,将字符串转换成tsquery,如下所示:
- mydb=> SELECT 'hello&cat'::tsquery;
- tsquery
- -----------------
- 'hello' & 'cat'
- (1 row)
上述只是转换成tsquery类型,而并没有做标准化,使用to_tsquery函数可以执行标准化,如下所示:
- mydb=> SELECT to_tsquery( 'hello&cat' );
to_tsquery
一个全文检索示例如下,检索字符串是否包括hello和cat字符,本例中返回真。
- mydb=> SELECT to_tsvector('english','Hello cat,how are u') @@to_tsquery( 'hello&cat' );
检索字符串是否包含字符hello和dog,本例中返回假。
- mydb=> SELECT to_tsvector('english','Hello cat,how are u') @@ to_tsquery( 'hello&dog' );
- f
- (1 row)
有兴趣的读者可以测试tsquery的其他操作符,例如|、!等。
注意:这里使用了带双参数的to_tsvector函数,函数to_tsvector双参数的格式如下:
to_tsvector([ config regconfig , ] document text),本节to_tsvector函数指定了config参数为english,如果不指定config参数,则默认使用default_text_search_config参数的配置。
英文全文检索例子
下面演示一个英文全文检索示例,创建一张测试表并插入200万测试数据,如下所示:
- mydb=> CREATE TABLE test_search(id int4,name text);
- CREATE TABLE
- mydb=> INSERT INTO test_search(id,name) SELECT n, n||'_francs'
- FROM generate_series(1,2000000) n;
- INSERT 0 2000000
执行以下SQL,查询test_search表name字段包含字符1_francs的记录。
- mydb=> SELECT * FROM test_search WHERE name LIKE '1_francs';
- id | name
- ----+----------
- 1 | 1_francs
- (1 row)
执行计划如下:
- mydb=> EXPLAIN ANALYZE SELECT * FROM test_search WHERE name LIKE '1_francs';
- QUERY PLAN
- -------------------------------------------------------------------------------------Seq Scan on test_search (cost=0.00..38465.04 rows=204 width=18) (actual time=0.022..261.766 rows=1 loops=1)
- Filter: (name ~~ '1_francs'::text)
- Rows Removed by Filter: 1999999
- Planning time: 0.101 ms
- Execution time: 261.796 ms
- (5 rows)
以上执行计划走了全表扫描,执行时间为261毫秒左右,性能很低,接着创建索引,如下所示:
- mydb=> CREATE INDEX idx_gin_search ON test_search USING gin (to_tsvector('english',name));
- mydb=> SELECT * FROM test_search WHERE to_tsvector('english',name) @@ to_tsquery('english','1_francs');
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|