全文搜索简介(tsvector、to_tsquery)
使用 tsvector 为文档建立索引,使用 to_tsquery 执行自然语言查询,并使用 ts_rank 对结果排序。
全文搜索简介(tsvector、to_tsquery) 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
为什么要使用全文搜索?
LIKE/ILIKE 可以查找子字符串。全文搜索(FTS)理解词语:词干提取、停用词、语言规则以及相关性排序。PostgreSQL 内置全文搜索,无需扩展。
两种核心类型
FTS 建立在两种类型之上:
tsvector— 已解析的文档:词位 + 位置tsquery— 已解析的查询:词位 + 布尔运算符
使用 @@ 运算符将两者进行匹配。
解析文档
将原始文本转换为 tsvector:
SELECT to_tsvector('english', 'The quick brown foxes jump over the lazy dogs');
-- 'brown':3 'dog':9 'fox':4 'jump':5 'lazi':8 'quick':2
-- Stop words ('the', 'over') dropped; words stemmed (foxes → fox)解析查询
搜索输入也是如此:
SELECT to_tsquery('english', 'foxes & dogs');
-- 'fox' & 'dog'匹配
使用 @@ 进行测试:
SELECT to_tsvector('english', 'The lazy fox')
@@ to_tsquery('english', 'fox'); -- TRUE为文档表创建索引
添加 tsvector 列和 GIN 索引,以加快查询:
CREATE TABLE articles (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
body TEXT NOT NULL
);
-- Either keep a generated tsvector column:
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
to_tsvector('english',
coalesce(title,'') || ' ' || coalesce(body,'')
)
) STORED;
CREATE INDEX articles_search_idx ON articles USING GIN (search_doc);搜索
有了索引,查询速度会很快:
SELECT id, title
FROM articles
WHERE search_doc @@ to_tsquery('english', 'postgres & json')
ORDER BY id DESC;查询中的布尔运算符
tsquery 支持 &(AND)、|(OR)、!(NOT)以及分组:
to_tsquery('english', '(cat | dog) & !rabbit');短语搜索
使用 <-> 匹配相邻词语:
to_tsquery('english', 'postgres <-> performance');
-- finds 'postgres performance', not 'postgres is great for performance'友好的网页查询:websearch_to_tsquery
接受 Google 风格的查询:
SELECT websearch_to_tsquery('english', 'postgres "json indexing" -mongo');为结果排序
使用 ts_rank 或 ts_rank_cd 进行排序:
SELECT id, title,
ts_rank(search_doc, query) AS rank
FROM articles, to_tsquery('english', 'postgres & json') AS query
WHERE search_doc @@ query
ORDER BY rank DESC
LIMIT 20;高亮显示
显示匹配的摘要片段:
SELECT ts_headline('english', body,
to_tsquery('english', 'postgres & json'),
'StartSel=<mark>,StopSel=</mark>')
FROM articles
WHERE search_doc @@ to_tsquery('english', 'postgres & json');回顾
FTS 已内置于 PostgreSQL。
tsvector+tsquery+@@- 使用 GIN 索引提升速度
- 使用 websearch_to_tsquery 处理用户输入
- 使用 ts_rank 按相关性排序
快速检查
哪个运算符可以将 tsvector 与 tsquery 进行匹配?
常见问题解答
「全文搜索简介(tsvector、to_tsquery)」课时是免费的吗?
是的 — 「全文搜索简介(tsvector、to_tsquery)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「全文搜索简介(tsvector、to_tsquery)」这节课中我会学到什么?
使用 tsvector 为文档建立索引,使用 to_tsquery 执行自然语言查询,并使用 ts_rank 对结果排序。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「全文搜索简介(tsvector、to_tsquery)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 字符串连接:|| 与 CONCAT
- UPPER、LOWER、SUBSTRING、REPLACE
- TRIM、LPAD、RPAD
- 全文搜索简介(tsvector、to_tsquery)