全文检索是一种信息检索技术,旨在从大量文本数据中快速准确地找到与用户查询相关的信息。PolarDB PostgreSQL版具备一系列全文检索能力。

背景

与传统的关键词搜索相比,全文检索的目标是在海量文本数据中迅速而准确地查找与用户查询相关的信息。它能够处理整个文档的内容,而不仅限于特定字段或标签。

全文检索系统通常包括以下步骤:

  • 文本预处理:将文本进行分词、去除停用词及词干提取等处理,以提高检索效率和准确性。

  • 索引构建:将处理后的文本建立索引,通常采用倒排索引结构,记录每个词出现的位置和相关文档。

  • 查询处理:用户输入查询后,系统分析查询语句并转换为合适的格式进行检索。

  • 结果排序:根据相关性算法对检索结果进行排序,返回最符合用户需求的结果。

使用场景

全文检索具有非常广泛的使用场景,一些典型的场景如下:

  • 文档管理系统:用于快速查找公司内部文档、报告和条款,提升工作效率。

  • 在线搜索引擎:通过全文检索技术帮助用户快速找到所需信息。

  • 学术研究:学术数据库和文献管理工具中,研究人员可以快速定位相关文献和数据。

  • 电子商务:电商平台通过全文检索帮助顾客快速找到所需的产品,提升购物体验。

  • 社交媒体:用户可以根据关键词搜索帖子、评论和图片,提高信息获取的便捷性。

  • 法律文书检索:律师和法律专业人员通过全文检索工具快速查找相关案例和法律条款。

  • 医疗记录管理:医院可以使用全文检索技术在病历和报告中快速找出患者信息和历史记录。

  • 客户支持:在线客服系统通过全文搜索帮助客户快速找到常见问题解答(FAQ)和支持文档。

  • 内容管理系统:网站和博客使用全文检索功能帮访客快速找到相关的文章和资料。

  • 图书馆与信息检索:图书馆的信息检索系统利用全文检索技术,方便读者查找书籍和文章。

功能概述

分词

PolarDB PostgreSQL版全文索引允许对文档进行预处理,并保存一个索引用于后续的快速搜索。预处理包括:

  • 将文档解析成记号。标识出多种类型的记号,例如数字、词、复杂的词及电子邮件地址,便于它们可以以不同的方式处理。

  • 将记号转换成词位。一个词位类似于一个记号,是一个经过正规化的字符串,使得同一词的不同形式被统一为相同的表达。例如,正规化通常包括将大写字母转换为小写形式,并且常常涉及去除后缀(例如英语中的s或es)。这一过程使得搜索能够识别同一词汇的不同变体,从而避免冗长地输入所有可能的变体形式。

  • 为搜索优化而存储预处理的文档。例如,每一个文档可以表示为正规化词位的有序数组。除了词位,通常还需要存储用于近似排名的位置信息。这样,一个包含查询词的“密集”区域的文档,其排名将高于那些包含分散查询词的文档。

tsvector

tsvector是PolarDB PostgreSQL版提供的一个用于全文搜索的数据类型。该数据类型能够高效存储经过处理的文本,以实现快速搜索和匹配。tsvector用于存储文档的词汇索引,通常由词汇及其在文本中的位置组成。

pg_bigm

pg_bigmPolarDB PostgreSQL版的一个扩展模块,用于提供模糊搜索功能,特别是用于实现近似字符串匹配。该扩展最常用于处理包含大量文本数据的应用程序,如搜索引擎和内容管理系统。其核心理念是通过“n-grams”(n-元组)来提高文本搜索的效率和准确性。

说明

pg_bigm扩展针对前后模糊查询(like '%xxxx%')有效。

pg_trgm

pg_trgm是PolarDB PostgreSQL版的一个扩展模块,用于提供对三元组(trigram)的支持。三元组是一种用于位移字符串相似性搜索的方法,特别适合处理模糊匹配和文本相似性查询。pg_trgm主要通过创建索引和查询运算符,以提高对大文本数据集的查询效率,通常应用于全文搜索、自动补全、拼写纠错等场景。

说明

pg_trgm扩展针对前后模糊查询(like '%xxxx%')有效。

中文分词

在中文语言中,词语是最小的语素单位。与英语不同的是,中文在书写时并不使用空格分隔词语。这一特性导致在使用PostgreSQL的默认全文检索引擎时,难以获得符合中文语义的分词结果。

针对中文分词,PolarDB PostgreSQL版支持pg_jieba和Zhparser两种全文检索能力。

pg_jieba

Jieba(结巴)是目前比较流行的中文分词库之一,能够准确地识别中文语句中的单词,对中文语句进行分词。pg_jieba插件将Jieba的分词能力引入到数据库中,能够高效地对中文文本进行分词处理,从而支持全文检索功能。

Zhparser

SCWS(Simple Chinese Word Segmentation,简易中文分词系统),是一套基于词频词典的开源中文分词引擎,能将一整段的中文文本基本正确地切分成词。

Zhparser插件是一个基于SCWS能力开发的中文分词插件,在兼容PostgreSQL已有全文检索能力的基础上,提供丰富的功能配置选项,同时也提供用户自定义词典功能。

索引

PolarDB PostgreSQL版支持多种索引结构以支持全文检索。

GIN索引

GIN(Generalized Inverted Index,广义倒排索引)是PostgreSQL中一种支持全文检索的索引类型。使用GIN索引可以有效地进行全文搜索,尤其是在处理大规模文本数据时。GIN索引允许快速的查询操作,特别是在处理复杂的文本查询时(如使用tsvector和tsquery的查询)。同时,GIN索引支持JSONB等类型。

RUM索引

RUM是PostgreSQL的一个扩展,提供了一种可用于全文搜索及其他索引需求的RUM索引类型。该索引旨在提升全文搜索的性能,特别是在需要对文档进行排名的场景中。

RUM索引是一种倒排索引,它与内置的GIN (Generalized Inverted Index) 索引相似。主要区别在于RUM索引为存储附加信息提供了一种机制,这在执行排序或其他操作时能够更快地获取结果。例如,在全文搜索中,RUM索引可以存储词语在文档中的位置信息,从而在查询时利用这些位置信息来计算相关性排名。

查询处理

tsquery

tsquery是一个用于全文搜索的功能,专门用于处理文本数据的查询。它允许用户创建复杂的搜索条件,以便在大规模文本数据中快速有效地查找所需的信息。PolarDB PostgreSQL版同样提供了to_tsquery方法将文本转换为tsquery,结合tsvector及全文检索操作符,就可以完成全文检索查询。

tsquery支持@@(包含)操作符和Boolean操作符&( AND)、|(OR) 和!(NOT),可以方便地构建组合条件的检索查询。

排序

ts_rank

ts_rank是PostgreSQL数据库中用于全文搜索的函数,主要用于计算文档与查询之间的相关性评分。该评分可用于评估文档在特定搜索条件下的重要性或相关性。