0

0

postgresql全文检索如何使用_postgresqltsvector完整指南

舞夢輝影

舞夢輝影

发布时间:2025-11-22 20:15:54

|

745人浏览过

|

来源于php中文网

原创

PostgreSQL通过tsvector和tsquery实现高效全文检索。tsvector将文本转为带位置的词位向量,过滤停用词并标准化,tsquery构建含逻辑操作符的查询条件。为提升性能,可在生成列上创建GIN索引,自动维护向量化数据。支持与、或、非、短语及前缀查询,结合权重setweight和排序函数ts_rank或ts_rank_cd可优化相关性排序,ts_headline用于高亮关键词。合理使用这些功能可实现精准、高效的文本搜索。

postgresql全文检索如何使用_postgresqltsvector完整指南

PostgreSQL 的全文检索功能强大且灵活,核心是 tsvectortsquery 两个数据类型。通过合理使用它们,可以实现高效、精准的文本搜索。下面详细介绍如何使用 tsvector 构建和优化全文检索。

什么是 tsvector 和 tsquery

tsvector 是 PostgreSQL 中用于表示文档的数据类型。它将一段文本分解为词位(lexemes),去除停用词(如“the”、“and”等),并记录每个词位的位置信息。

tsquery 表示查询条件,也由词位组成,支持与(&)、或(|)、非(!)等逻辑操作符。

全文检索的本质就是将 tsvectortsquery 进行匹配,返回匹配结果。

示例:

将句子 "I like PostgreSQL for full-text search" 转换为 tsvector:

SELECT to_tsvector('english', 'I like PostgreSQL for full-text search');

输出类似:
'like':2 'postgressql':3 'search':6 'text':5
注意:停用词 “I” 和 “for” 被过滤掉,词被标准化为小写和词干形式。

创建全文检索索引

为了提升查询性能,必须在 tsvector 列上创建索引。推荐使用 GIN(Generalized Inverted Index)索引。

假设有一个文章表:

CREATE TABLE articles (id serial, title text, content text);

你可以创建一个生成列来存储 tsvector,然后在其上建立索引:

ALTER TABLE articles ADD COLUMN search_vector tsvector;
UPDATE articles SET search_vector = to_tsvector('english', coalesce(title, '') || ' ' || coalesce(content, ''));
CREATE INDEX idx_search_vector ON articles USING GIN(search_vector);

更现代的方式是使用生成列(PostgreSQL 12+):

ALTER TABLE articles ADD COLUMN search_vector tsvector GENERATED ALWAYS AS (to_tsvector('english', coalesce(title, '') || ' ' || coalesce(content, ''))) STORED;
CREATE INDEX idx_search_vector ON articles USING GIN(search_vector);

这样每次插入或更新时,search_vector 会自动计算,无需手动维护。

执行全文检索查询

使用 @@ 操作符判断 tsvector 是否匹配 tsquery

Sencha touch 开发指南 中文WORD版
Sencha touch 开发指南 中文WORD版

本文档主要讲述的是Sencha touch 开发指南;主要介绍如何使用Sencha Touch为手持设备进行应用开发,主要是针对iPhone这样的高端手机,我们会通过一个详细的例子来介绍整个开发的流程。 Sencha Touch是专门为移动设备开发应用的Javascrt框架。通过Sencha Touch你可以创建非常像native app的web app,用户界面组件和数据管理全部基于HTML5和CSS3的web标准,全面兼容Android和Apple iOS。希望本文档会给有需要的朋友带来帮助;感兴趣的

下载

搜索包含 “postgresql” 和 “search” 的文章:

SELECT id, title FROM articles WHERE search_vector @@ to_tsquery('english', 'postgresql & search');

支持多种查询语法:

  • postgresql | mysql:匹配任一词
  • !windows:排除包含 “windows” 的文档
  • "full text":短语搜索(需使用 phraseto_tsquery() 或手动构造)
  • postgre*: 前缀匹配(注意冒号)

例如前缀搜索:

SELECT ... WHERE search_vector @@ to_tsquery('english', 'postgre:*');

提升搜索体验:权重与排序

你可以为不同字段赋予不同权重(A-D),标题通常比正文更重要。

修改生成逻辑:

to_tsvector('english', title) || setweight(to_tsvector('english', content), 'B')

其中 A 最高,D 最低。合并多个带权向量后,可用 ts_rank 排序:

SELECT title, ts_rank(search_vector, query) AS rank FROM articles, to_tsquery('english', 'search') query WHERE search_vector @@ query ORDER BY rank DESC;

还可以使用 ts_rank_cd,它考虑词位之间的距离,更适合短语匹配。

若想显示关键词高亮,使用 ts_headline

SELECT ts_headline('english', content, to_tsquery('search'), 'HighlightAll=TRUE') FROM articles WHERE search_vector @@ to_tsquery('search');

基本上就这些。掌握 tsvector 的构建、索引设置、查询语法和排序方法,就能在 PostgreSQL 中实现高效可靠的全文检索。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

662

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

245

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

528

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 793人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号