0Pricing
SQL Academy · 课时

全文搜索简介(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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 字符串连接:|| 与 CONCAT
  2. UPPER、LOWER、SUBSTRING、REPLACE
  3. TRIM、LPAD、RPAD
  4. 全文搜索简介(tsvector、to_tsquery)
← 返回 SQL Academy