第十三章 全文搜索与向量相似度匹配 - 第一节:tsvector 与 GIN 索引全文搜索
文章目录
第十三章 全文搜索与向量相似度匹配
第一节 tsvector
与 GIN 索引全文搜索
目标:理解 PostgreSQL 内置全文搜索引擎的工作原理,掌握
tsvector
和tsquery
两种核心数据类型,并学会使用 GIN 索引来加速文本搜索查询。
在 pg_trgm
提供了高效的模糊搜索(相似度搜索)能力之外,PostgreSQL 还拥有一个功能更全面、更符合传统搜索引擎逻辑的全文搜索引擎(Full Text Search, FTS)。
与 LIKE
或 pg_trgm
不同,FTS 引擎能够理解自然语言的结构。它知道如何:
- 分词(Parsing):将文本分解成独立的词元(Tokens)。
- 词形还原(Stemming):将不同形式的同一个词(如 “running”, “ran”, “runs”)还原为其基本形式(“run”)。
- 忽略停用词(Stop Words):自动忽略像 “a”, “the”, “is” 这样没有实际意义的常见词。
- 处理复杂查询:支持
AND
,OR
,NOT
以及短语搜索。
全文搜索的核心组件
PostgreSQL 的 FTS 功能主要由两种数据类型和一种操作符构成。
1. tsvector
(Text Search Vector)
tsvector
是一种特殊的数据类型,用于存储预处理过的文档。它将一个文本文档转换为一个由**词位(Lexemes)**组成的、排好序的、去重的列表。词位就是经过词形还原后的词。
to_tsvector()
函数:
这个函数负责将普通文本转换为 tsvector
。
|
|
结果:
|
|
'english'
是指定的文本搜索配置,它决定了使用哪种语言的停用词列表和词形还原规则。- 停用词 “A”, “over”, “the” 被移除了。
- “jumps” 被还原为 “jump”,“lazy” 被还原为 “lazi”。
- 每个词位后面都跟着它在原文中出现的位置,这对于后续的相关度排序很重要。
2. tsquery
(Text Search Query)
tsquery
用于存储预处理过的查询条件。它同样会将查询字符串进行词形还原。
to_tsquery()
函数:
|
|
结果:
|
|
&
代表AND
。|
代表OR
。!
代表NOT
。<->
代表短语搜索中的FOLLOWED BY
。
3. @@
匹配操作符
@@
操作符用于判断一个 tsvector
是否匹配一个 tsquery
。这是 FTS 的核心查询操作符。
|
|
实战:构建一个文章搜索引擎
第一步:准备数据表
|
|
将 tsvector
单独存为一列是最佳实践,因为 to_tsvector
是一个计算密集型函数,我们不希望在每次查询时都重新计算它。
第二步:自动更新 tsvector
列
我们可以使用一个触发器,在 articles
表的 title
或 body
发生变化时,自动更新 search_vector
列。
|
|
setweight()
函数可以为文档的不同部分(如标题、正文)赋予不同的重要性权重,这在相关度排序时非常有用。
第三步:创建 GIN 索引
为了让 @@
操作符能够高效查询,我们必须在 tsvector
列上创建一个 GIN 索引。
|
|
第四步:执行搜索和排序
|
|
📌 小结
PostgreSQL 内置的全文搜索引擎是一个功能极其完备的系统:
- 语言感知:通过
tsvector
和tsquery
,它能理解词形变化和停用词,提供比LIKE
或pg_trgm
更精准的搜索结果。 - 高性能:配合 GIN 索引,
@@
操作符可以对海量文本数据进行毫秒级的查询。 - 相关度排序:通过
ts_rank_cd
等函数,可以像专业搜索引擎一样,将最相关的结果排在最前面。 - 高级查询:支持布尔操作符和短语搜索,能满足复杂的搜索需求。
对于任何需要在应用中构建文本搜索功能(如站内搜索、文档检索)的场景,PostgreSQL 的 FTS 都是一个不容忽视的、开箱即用的强大解决方案。在下一节,我们将探索一个更前沿的领域:向量搜索。