摘要:全文检索是在互联网场景下应用非常广泛的特性,搜索引擎、站内搜索、电商搜索等场景下都会使用到,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 。

点击关注,第一时间了解华为云新鲜技术~

基于GaussDB(DWS)的全文检索特性,了解一下?的更多相关文章

  1. 基于SpringBoot实现操作GaussDB(DWS)的项目实战

    摘要:本文就使用springboot结合mybatis plus在项目中实现对GaussDB(DWS)的增删改查操作. 本文分享自华为云社区<基于SpringBoot实现操作GaussDB(DW ...

  2. 从数据仓库双集群系统模式探讨,看GaussDB(DWS)的容灾设计

    摘要:本文主要是探讨OLAP关系型数据库框架的数据仓库平台如何设计双集群系统,即增强系统高可用的保障水准,然后讨论一下GaussDB(DWS)的容灾应该如何设计. 当前社会.企业运行当中,大数据分析. ...

  3. 一文详解GaussDB(DWS) 的并发管控和内存管控

    摘要:DWS的负载管理分为两层,第一层为cn的全局并发控制,第二层为资源池级别的并发控制. 本文分享自华为云社区<GaussDB(DWS) 并发管控&内存管控>,作者: fight ...

  4. 详解GaussDB(DWS) explain分布式执行计划

    摘要:本文主要介绍如何详细解读GaussDB(DWS)产生的分布式执行计划,从计划中发现性能调优点. 前言 执行计划(又称解释计划)是数据库执行SQL语句的具体步骤,例如通过索引还是全表扫描访问表中的 ...

  5. 由两个问题引发的对GaussDB(DWS)负载均衡的思考

    摘要:GaussDB(DWS)的负载均衡通过LVS+keepAlived实现.对于这种方式,需要思考的问题是,CN的返回结果是否会经过LVS,然后再返回给前端应用?如果经过LVS,那么,LVS会不会成 ...

  6. 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写

    摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...

  7. 探索GaussDB(DWS)的过程化SQL语言能力

    摘要:在当前GaussDB(DWS)的能力中主要支持两种过程化SQL语言,即基于PostgreSQL的PL/pgSQL以及基于Oracle的PL/SQL.本篇文章我们通过匿名块,函数,存储过程向大家介 ...

  8. 细说GaussDB(DWS)复杂多样的资源负载管理手段

    摘要:对于如此多的管控功能,管控起来实际的效果到底如何,本篇文章就基于当前最新版本,进行效果实测,并进行一定的分析说明. 本文分享自华为云社区<GaussDB(DWS) 资源负载管理:并发管控以 ...

  9. GaussDB(DWS)网络调度与隔离管控能力

    摘要:调度算法是调度器的核心,设计调度算法要充分考虑业务场景和用户需求,没有万能的调度算法,只有合适的调度算法. 本文分享自华为云社区<GaussDB(DWS)网络调度与隔离管控能力>,作 ...

  10. GaussDB(DWS)应用实战:对被视图引用的表进行DDL操作

    摘要:GaussDB(DWS)是从Postgres演进过来的,像Postgres一样,如果表被视图引用的话,特定场景下,部分DDL操作是不能直接执行的. 背景说明 GaussDB(DWS)是从Post ...

随机推荐

  1. BSD协议原文及中文翻译

    # BSD协议原文及翻译 参考链接 原文: The following is a BSD license template. To generate your own license, change ...

  2. Go 函数的健壮性、panic异常处理、defer 机制

    Go 函数的健壮性.panic异常处理.defer 机制 目录 Go 函数的健壮性.panic异常处理.defer 机制 一.函数健壮性的"三不要"原则 1.1 原则一:不要相信任 ...

  3. 优化预算管理流程:Web端实现预算编制的利器

    本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言:什么是预算和预算编制 预算 预算是企业在预测.决策的基础上,以数量和金 ...

  4. Java IO教程- Java文件

    创建文件 我们可以从中创建一个 File 对象 路径名 父路径名和子路径名 URI(统一资源标识符) 我们可以使用File类的以下构造函数之一创建一个文件: File(String pathname) ...

  5. Lyndon 分解

    介绍 [模板]Lyndon 分解 #include<cstdio> #include<cstring> char s[5000005]; int main(){ scanf(& ...

  6. 手撕Vuex-安装模块方法

    前言 经过上一篇文章的介绍,我们实现了将模块安装到 store 中,那么本章我们就来介绍一下怎么安装模块当中的方法也就是 actions.mutations.getters. 所以本次文章的目标就是将 ...

  7. Android 使用 ContentProvider 简单操作数据库

    ContentProvider 可以用来原生读写 Android 自带的数据库 SQLite. 使用 Studio 创建一个 ContentProvider, 名字叫 TestContentProvi ...

  8. Log4j入门使用

    前言 本篇文章主要在于,初步了解log4j,以及对它的简单使用 欢迎点赞 收藏 留言评论 私信必回哟 博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 @ 目录 一,log4j简介 二,配 ...

  9. cookie和session的区别?一文讲透

    一.问题 cookie和session的区别? 二.回答 1.总结如下- cookie: - cookie存储于客户端本地,即浏览器缓存 - cookie存储着sessionId,作为后台sessio ...

  10. excel表格怎么设置数据超链接?

    在Excel表格中,可以设置超链接来快速导航到其他单元格.工作表.文件.网页等.下面我将详细介绍如何设置数据超链接. 1. 在Excel表格中选择要添加超链接的单元格或文本. 2. 使用鼠标右键点击选 ...