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

PostgreSQL 的全文检索功能强大且灵活,核心是 tsvector 和 tsquery 两个数据类型。通过合理使用它们,可以实现高效、精准的文本搜索。下面详细介绍如何使用 tsvector 构建和优化全文检索。
tsvector 是 PostgreSQL 中用于表示文档的数据类型。它将一段文本分解为词位(lexemes),去除停用词(如“the”、“and”等),并记录每个词位的位置信息。
tsquery 表示查询条件,也由词位组成,支持与(&)、或(|)、非(!)等逻辑操作符。
全文检索的本质就是将 tsvector 与 tsquery 进行匹配,返回匹配结果。
将句子 "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 开发指南;主要介绍如何使用Sencha Touch为手持设备进行应用开发,主要是针对iPhone这样的高端手机,我们会通过一个详细的例子来介绍整个开发的流程。 Sencha Touch是专门为移动设备开发应用的Javascrt框架。通过Sencha Touch你可以创建非常像native app的web app,用户界面组件和数据管理全部基于HTML5和CSS3的web标准,全面兼容Android和Apple iOS。希望本文档会给有需要的朋友带来帮助;感兴趣的
0
搜索包含 “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 中实现高效可靠的全文检索。以上就是postgresql全文检索如何使用_postgresqltsvector完整指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号