关于数据:基于GaussDBDWS的全文检索特性了解一下

31次阅读

共计 5676 个字符,预计需要花费 15 分钟才能阅读完成。

摘要 :全文检索是在互联网场景下利用十分宽泛的个性,搜索引擎、站内搜索、电商搜寻等场景下都会应用到,GaussDB(DWS) 同样也反对全文检索性能,是基于 GIN 索引实现的,上面给大家具体介绍一下 GaussDB(DWS)的全文检索个性的性能。

全文检索实现的性能,简略来说就是依据关键字从在全文字段中搜寻到相干的信息,在不应用全文检索个性时,只能通过 like‘%keyword%’形式做含糊匹配,无奈利用到索引,只能进行全表扫描,效率非常低,全文检索个性能够无效地晋升检索性能。

全文检索的根底就是 GIN 索引,Generalized Inverted Index,也就是通用倒排索引,是一个存储对 (key, posting list) 汇合的索引构造,其中 key 是一个键值,而 posting list 是一组呈现过 key 的地位。如 (‘hello’, 2,3) 中,示意 hello 在 2 和 3 这两个地位呈现过。

先来理解一下几个接口

to_tsvector

to_tsvector(text,text)

这个函数能够把一个文本转换为一个向量,其中保留单词和其呈现的程序,

test=# SELECT to_tsvector(‘english’, ‘huawei cloud data warehouse’);

            to_tsvector --------------------------------------------

‘cloud’:2 ‘data’:3 ‘huawei’:1 ‘warehous’:4 (1 row)

test=# SELECT to_tsvector(‘zhparser’, ‘ 华为云数据仓库 ’);

        to_tsvector -----------------------------------

‘ 云 ’:2 ‘ 仓库 ’:4 ‘ 华为 ’:1 ‘ 数据 ’:3 (1 row)

to_tsquery

to_tsquery(text)

这个函数作用是用来把文本转化为可查问的语句,例如:

SELECT to_tsquery(‘ 华为 & 深圳 ’);

这样就是寻找文本既蕴含“华为”,也蕴含“深圳”的语句,& 是 AND 与操作,| 是 OR 或操作

如果想晓得一个 tsvector 是否让 tsquery 成立,能够应用 @@ 操作符,例如:

SELECT to_tsvector(‘zhparser’, ‘ 华为深圳 ’) @@ to_tsquery(‘ 华为 & 深圳 ’);

这条语句会返回 True

ts_rank

ts_rank(tsvector, tsquery)

这个函数能够计算 tsvector 和 tsquery 的近似水平,通过这个函数计算出 rank 之后,就能够排序了

SELECT

ts_rank(

to_tsvector('zhparser', '华为深圳'),

to_tsquery('华为 & 深圳')

);

讲完了这些接口,让咱们来做一些具体实际:

1. 创立数据库

CREATE DATABASE test ENCODING ‘utf8’ template = template0;

【留神】全文检索必须应用在 encoding 为 utf8 或者 gbk 的数据库上。

2. 创立表

CREATE TABLE t1(id int, news text, location text);

3. 导入数据

INSERT INTO t1 VALUES(1, ‘ 华为云 GaussDB(DWS)数据仓库以 2048 大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群冲破两千的商用数据仓库产品 ’, ‘ 北京 ’);

INSERT INTO t1 VALUES(2, ‘GaussDB(DWS)历经十年磨炼,是业界当先的企业级云分布式数据仓库服务 ’, ‘ 深圳 ’);

INSERT INTO t1 VALUES(3, ‘ 华为 GaussDB(DWS)数据仓库,助力招行“人人用数,翻新前行,招行客户在华为论坛中示意,华为与招行的联创实验室还将进一步摸索云数仓反对 OBS 存储的实际 ’, ‘ 深圳 ’);

INSERT INTO t1 VALUES(4, ‘ 数智金融 使能翻新,2020 华为 数智金融论坛在溪村胜利举办 ’, ‘ 东莞 ’);

INSERT INTO t1 VALUES(5, ‘ 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙隆重揭幕 ’, ‘ 西安 ’);

4. 创立索引

CREATE INDEX t1_news_idx ON t1 USING gin(to_tsvector(‘zhparser’, news));

执行查问:

SELECT * FROM t1 WHERE to_tsvector(‘zhparser’,news) @@ to_tsquery(‘ 华为 ’);

查问后果:

news 中只有蕴含“华为”词组,都会检索进去

5. 创立多字段联结索引:

CREATE INDEX t1_news_location_idx ON t1 USING gin(to_tsvector(‘zhparser’, news||location));

执行后果:

  • 查找同时蕴含两个词组

SELECT * FROM t1 WHERE to_tsvector(‘zhparser’, news||location) @@ to_tsquery(‘ 华为 & 深圳 ’);

news 跟 location 只有有一个字段中蕴含“华为”和“深圳”都会检索进去

test=# SELECT * FROM t1 WHERE to_tsvector(‘zhparser’, news||location) @@ to_tsquery(‘ 华为 & 深圳 ’);
id | news | location —-+———————————————————————————————————————————————-+———-
3 | 华为 GaussDB(DWS)数据仓库,助力招行“人人用数,翻新前行,招行客户在华为论坛中示意,华为与招行的联创实验室还将进一步摸索云数仓反对 OBS 存储的实际 | 深圳
(1 row)

  • 查问蕴含其中一个词组

SELECT * FROM t1 WHERE to_tsvector(‘zhparser’, news||location) @@ to_tsquery(‘ 云 | 深圳 ’);

news 跟 location 只有有一个蕴含“云”跟“深圳”这两个词的任何一个都会检索进去。

test=# SELECT * FROM t1 WHERE to_tsvector(‘zhparser’, news||location) @@ to_tsquery(‘ 云 | 深圳 ’);
id | news | location —-+———————————————————————————————————————————————-+———-
5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙隆重揭幕 | 西安 3 | 华为 GaussDB(DWS)数据仓库,助力招行“人人用数,翻新前行,招行客户在华为论坛中示意,华为与招行的联创实验室还将进一步摸索云数仓反对 OBS 存储的实际 | 深圳 1 | 华为云 GaussDB(DWS)数据仓库以 2048 大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群冲破两千的商用数据仓库产品 | 北京 2 | GaussDB(DWS)历经十年磨炼,是业界当先的企业级云分布式数据仓库服务 | 深圳
(4 rows)

6. 排序

  • 依照某一列蕴含的某个词组权重来排序

SELECT id, news, location ,ts_rank_cd(to_tsvector(‘zhparser’,news), query) AS rank FROM t1, to_tsquery(‘ 华为 ’) query WHERE query @@ to_tsvector(‘zhparser’,news) order by rank DESC;

执行后果:

test=# SELECT id, news, location ,ts_rank_cd(to_tsvector(‘zhparser’,news), query) AS rank FROM t1, to_tsquery(‘ 华为 ’) query WHERE query @@ to_tsvector(‘zhparser’,news) order by rank DESC;
id | news | location | rank —-+———————————————————————————————————————————————-+———-+——
3 | 华为 GaussDB(DWS)数据仓库,助力招行“人人用数,翻新前行,招行客户在华为论坛中示意,华为与招行的联创实验室还将进一步摸索云数仓反对 OBS 存储的实际 | 深圳 | .3
1 | 华为云 GaussDB(DWS)数据仓库以 2048 大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群冲破两千的商用数据仓库产品 | 北京 | .2
4 | 数智金融 使能翻新,2020 华为 数智金融论坛在溪村胜利举办 | 东莞 | .1
5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙隆重揭幕 | 西安 | .1 (4 rows)

搜寻出含有“华为”的词组,并且依据权重排序

  • 依照某一列蕴含多个词组权重排序(同时蕴含两个词组)

SELECT id, news, location,ts_rank_cd(to_tsvector(‘zhparser’, news||location), query) AS rank FROM t1, to_tsquery(‘ 华为 & 深圳 ’) query WHERE query @@ to_tsvector(‘zhparser’,news||location) order by rank DESC;

执行后果:

test=# SELECT id, news, location,ts_rank_cd(to_tsvector(‘zhparser’, news||location), query) AS rank FROM t1, to_tsquery(‘ 华为 & 深圳 ’) query WHERE query @@ to_tsvector(‘zhparser’,news||location) order by rank DESC;
id | news | location | rank —-+———————————————————————————————————————————————-+———-+———–
3 | 华为 GaussDB(DWS)数据仓库,助力招行“人人用数,翻新前行,招行客户在华为论坛中示意,华为与招行的联创实验室还将进一步摸索云数仓反对 OBS 存储的实际 | 深圳 | .00555556 (1 row)

搜寻出含有“华为”和“深圳”的词组,并且依据权重排序

  • 依照某一列蕴含多个词组权重排序(蕴含两个词组其中一个)

SELECT id, news, location,ts_rank_cd(to_tsvector(‘zhparser’, news||location), query) AS rank FROM t1, to_tsquery(‘ 云 | 深圳 ’) query WHERE query @@ to_tsvector(‘zhparser’, news||location) order by rank DESC;

查看执行后果:

test=# SELECT id, news, location,ts_rank_cd(to_tsvector(‘zhparser’, news||location), query) AS rank FROM t1, to_tsquery(‘ 云 | 深圳 ’) query WHERE query @@ to_tsvector(‘zhparser’, news||location) order by rank DESC;
id | news | location | rank —-+———————————————————————————————————————————————-+———-+——
1 | 华为云 GaussDB(DWS)数据仓库以 2048 大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群冲破两千的商用数据仓库产品 | 北京 | .2
2 | GaussDB(DWS)历经十年磨炼,是业界当先的企业级云分布式数据仓库服务 | 深圳 | .2
5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙隆重揭幕 | 西安 | .1
3 | 华为 GaussDB(DWS)数据仓库,助力招行“人人用数,翻新前行,招行客户在华为论坛中示意,华为与招行的联创实验室还将进一步摸索云数仓反对 OBS 存储的实际 | 深圳 | .1 (4 rows)

检索出蕴含“云”或者“深圳”的记录,并且依据权重排序。

通过以上的案例,置信大家对 GaussDB(DWS)的全文检索应用曾经有了一些理解,其实全文检索还有 ngram 分词,和自定义词典等等其余用法,大家如果有趣味,能够拜访 DWS 产品文档或者到社区发问,获取更全面的解答。

本文分享自华为云社区《GaussDB(DWS)全文检索个性初探》,原文作者:DWS_Jack。

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0