PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

12.3. 控制全文搜索 #

12.3.1. 解析文档
12.3.2. 解析查询
12.3.3. 对搜索结果进行排序
12.3.4. 高亮显示搜索摘要

12.3.1. 解析文档 #

函数 to_tsvector 将原始文本转化为 tsvector 词元向量:

SELECT to_tsvector('english', 'The Fat Rats');
   to_tsvector   
-----------------
 'fat':2 'rat':3

冠词 The 作为停用词被自动剔除,名词复数被自动还原为词干原型,且记录了词在文本中的出现位置。

支持为文档中不同权重的部分标记字母权重标识(A、B、C、D),例如将标题标记为最高权重 A,而正文标记为普通权重 D。通过函数 setweight 完成权重打标。

12.3.2. 解析查询 #

系统提供了多种函数将用户输入的检索字符串解析转化为规范的 tsquery 对象:

  • to_tsquery:支持完整的布尔运算符(&、|、!、<->)。

  • plainto_tsquery:将未转义的自然语言文本转换为由逻辑与拼接的纯文本查询(忽略内部标点符号)。

  • phraseto_tsquery:将连续词语转换为要求严格相邻顺序出现的短语检索。

  • websearch_to_tsquery:支持主流搜索引擎通用的检索语法(双引号精确匹配短语、负号排除特定词汇、OR 逻辑或等)。

12.3.3. 对搜索结果进行排序 #

通过计算文档与查询之间的相关度得分,能够对海量检索结果按照匹配紧密程度进行从高到低排序。PostgreSQL 提供了两大打分函数: ts_rank(基于词频命中统计)与 ts_rank_cd(基于词距覆盖密度 Cover Density 算法)。

SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(supernova&star)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;

12.3.4. 高亮显示搜索摘要 #

函数 ts_headline 用于从原始文档中提取包含命中关键字的上下文片段,并自动以指定 HTML 标签(如 <b>)包裹高亮显示命中词:

SELECT ts_headline('english',
  'The most common type of search is to find all documents containing given query terms.',
  to_tsquery('english', 'query & terms'));