全部术语

全文搜索

PostgreSQL 中的全文搜索是如何工作的?

全文搜索按词语而非精确的子串来匹配文档,使用 tsvector、tsquery 和 @@ 操作符。GIN 索引可以让它更快。

PostgreSQL 内置的全文搜索会把文档解析为词元(token),再将其规范化为词位(lexeme,例如把单词还原为词干),并将结果存储为 tsvector。搜索查询是一个 tsquery,@@ 操作符用于测试文档是否与其匹配。

文本搜索配置(例如 english)决定如何将文本拆分为单词、忽略哪些常用词以及如何提取词干。ts_rank 等排序函数按相关性对结果排序。为了加快搜索,请用 GIN 为 tsvector 表达式建立索引,并在查询中使用与索引相同的配置。

示例

该示例将文章文本作为 tsvector 建立索引,并查找同时包含 search 和 postgres 的行。只有第 1 篇文章匹配。

CREATE TABLE articles (id int PRIMARY KEY, body text NOT NULL);
INSERT INTO articles VALUES
  (1, 'Postgres supports full text search with tsvector and tsquery'),
  (2, 'Indexes make lookups fast');

CREATE INDEX articles_fts ON articles USING gin (to_tsvector('english', body));

SELECT id
FROM articles
WHERE to_tsvector('english', body) @@ to_tsquery('english', 'search & postgres');

适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。

参考资料

PostgreSQL 官方文档(英文)。

相关术语