全文搜索
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 官方文档(英文)。