用途:在 PostgreSQL 文本列上构建关键词搜索、按相关度排序结果,并决定全文搜索与三元组模糊匹配之间的取舍。
主要能力:讲解全文搜索流水线——原始文本经 to_tsvector(config, text) 转为 tsvector,查询经构造函数转为 tsquery,再用 @@ 运算符匹配;两侧都会做词干化、去停用词和小写化。区分四种查询构造器:to_tsquery 解析 & | ! <-> 语法,遇畸形输入会抛语法错误(SQLSTATE 42601),绝不可直接传入终端用户文本;plainto_tsquery 将所有词以 AND 连接;phraseto_tsquery 要求词按顺序相邻;websearch_to_tsquery 接受 Google 式语法(引号、or、前导 -)且不会报错,是处理不可信输入唯一安全的构造器。
索引与写法:性能来自 GIN 索引。可为表达式 to_tsvector('english', body) 建索引(必须用两参数形式,否则依赖会话默认配置、不是不可变表达式),或使用 v12+ 的生成列:ALTER TABLE docs ADD COLUMN search tsvector GENERATED ALWAYS AS (to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))) STORED; 再 CREATE INDEX ON docs USING gin (search); 查询侧必须重复与索引完全相同的配置,否则索引被跳过而走顺序扫描。可用 setweight 给标题、摘要、正文标 A/B/C/D 权重,配合 ts_rank / ts_rank_cd 排序;ts_headline 生成高亮片段,但应仅在已过滤并 LIMIT 的结果集上调用。
适用场景:单列或多列关键词搜索、结果相关度排序、构造器选型、GIN 与 GiST 取舍、表达式索引与生成列取舍、高亮摘要、字段权重、全文搜索与 pg_trgm 模糊匹配的取舍。
限制:本技能不适用于拼写容错、子串匹配或 LIKE/ILIKE 加速(应使用 pg_trgm),也不涉及 JSONB/数组的通用 GIN 索引、EXPLAIN 输出解读或向量语义检索(pgvector)。反模式包括:对原始用户输入用 to_tsquery、无 GIN 索引、索引表达式与查询配置不一致、索引中用一参数 to_tsvector、漏写 coalesce 导致整个 tsvector 为 NULL、在 WHERE 或未过滤行上调用 ts_headline、用全文搜索做子串或错拼匹配、以及从存储的 tsvector 中去掉位置信息后仍调用 ts_rank_cd 或短语搜索。ts_headline 输出不防 XSS,渲染进 HTML 前需转义。具体版本支持、性能数据以及完整 API 与代码示例以官方文档和技能内 references 为准,资料未提供价格或平台信息。