跳到主要内容

文本搜索函数和操作符

全文检索把文档转换为带位置信息的词元集合 tsvector,把检索条件转换为 tsquery,再用 @@ 匹配。它解决的是按词检索,不等同于字符串包含,也不自动适合所有语言的分词。

建索引与查询​

CREATE INDEX articles_search_idx ON articles
USING gin (to_tsvector('english', coalesce(title, '') || ' ' || coalesce(body, '')));

SELECT id, title
FROM articles
WHERE to_tsvector('english', coalesce(title, '') || ' ' || coalesce(body, ''))
@@ websearch_to_tsquery('english', 'database indexing');

to_tsvector 会规范化词形并去除停用词;plainto_tsquery 把普通文本词项按“且”组合,websearch_to_tsquery 接受更贴近日常搜索的引号、OR、减号写法,to_tsquery 直接解析查询语法(如 'postgres & search'),不适合直接接收未经处理的用户输入。配置 'english' 适合英语,中文检索需要另选分词配置或扩展并实测。

操作符与结果​

SELECT to_tsvector('english', 'The cats chase mice')
@@ to_tsquery('english', 'cat & chase');
-- true(cats 归一化为 cat)

&、|、! 在 tsquery 内组合词项;<-> 要求相邻,<N> 可要求指定距离。ts_rank(vector, query)、ts_rank_cd 根据词频、位置等计算相关度,分数不是跨语料库固定可比的概率。ts_headline 可生成带标记的摘要,输出若呈现在 HTML 页面中仍须考虑转义与 XSS。

一致性和性能​

查询表达式必须与表达式索引的配置及文本构造保持一致,或改用维护好的 tsvector 列。GIN 加速匹配,但排序、排名与其他过滤仍可能需要额外计算。NULL 文本可用 coalesce 处理;不同字段可用 setweight 指定标题、正文的权重。短语、前缀及停用词查询要用真实数据检查结果。