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');
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|