PostgreSQL教程FG058-PG全文检索:基础配置与关键词查询实操
本文档风哥主要介绍PostgreSQL教程058相关内容。风哥教程参考PostgreSQL官方文档Server Administration, SQL Language内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
1. 全文检索概述
全文检索(Full Text Search)是一种在文本数据中搜索关键词的技术,比LIKE查询更高效、更智能。
- 支持自然语言搜索
- 支持词干提取和词形还原
- 支持相关性排序
- 支持多语言
SELECT cfgname, cfgnamespace::regnamespace
FROM pg_ts_config
ORDER BY cfgname;
执行结果:
更多学习教程公众号风哥教程itpux_com
——————-+————–
danish | pg_catalog
dutch | pg_catalog
english | pg_catalog
finnish | pg_catalog
french | pg_catalog
german | pg_catalog
hungarian | pg_catalog
italian | pg_catalog
norwegian | pg_catalog
portuguese | pg_catalog
romanian | pg_catalog
russian | pg_catalog
simple | pg_catalog
spanish | pg_catalog
swedish | pg_catalog
turkish | pg_catalog
(16 rows)
2. 文本分词
2.1 基本分词操作
SELECT to_tsvector(‘english’, ‘The quick brown fox jumps over the lazy dog’);
执行结果:
from oracle:www.itpux.com
———————————————-
‘brown’:3 ‘dog’:9 ‘fox’:4 ‘jumps’:5 ‘lazy’:8 ‘quick’:2
(1 row)
SELECT to_tsvector(‘simple’, ‘PostgreSQL是一个功能强大的开源数据库’);
执行结果:
————————————————————-
‘postgresql’:1 ‘一个’:2 ‘功能’:3 ‘强大’:4 ‘开源’:5 ‘数据库’:6
(1 row)
2.2 分词器解析
SELECT * FROM ts_debug(‘english’, ‘The quick brown fox jumps over the lazy dog’);
执行结果:
———–+—————–+———–+—————–+————–+———–
asciiword | Word, all ASCII | The | {english_stem} | english_stem | {}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | quick | {english_stem} | english_stem | {quick}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | brown | {english_stem} | english_stem | {brown}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | fox | {english_stem} | english_stem | {fox}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | jumps | {english_stem} | english_stem | {jump}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | over | {english_stem} | english_stem | {}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | the | {english_stem} | english_stem | {}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | lazy | {english_stem} | english_stem | {lazy}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | dog | {english_stem} | english_stem | {dog}
(21 rows)
3. 全文检索查询
3.1 创建查询向量
SELECT to_tsquery(‘english’, ‘quick & brown’);
执行结果:
————
‘brown’ & ‘quick’
(1 row)
SELECT phraseto_tsquery(‘english’, ‘quick brown fox’);
执行结果:
风哥提示:
—————————
‘quick’ <-> ‘brown’ <-> ‘fox’
(1 row)
3.2 匹配操作
SELECT
‘The quick brown fox’::tsvector @@ ‘quick & brown’::tsquery AS match_1,
‘The quick brown fox’::tsvector @@ ‘quick & cat’::tsquery AS match_2,
‘The quick brown fox’::tsvector @@ ‘quick | cat’::tsquery AS match_3,
‘The quick brown fox’::tsvector @@ ‘!cat’::tsquery AS match_4;
执行结果:
更多视频教程www.fgedu.net.cn
———+———+———+———
t | f | t | t
(1 row)
3.3 查询操作符
SELECT
to_tsquery(‘quick & brown’) AS and_query,
to_tsquery(‘quick | brown’) AS or_query,
to_tsquery(‘!quick’) AS not_query,
to_tsquery(‘quick <-> brown’) AS phrase_query,
to_tsquery(‘quick <5> brown’) AS near_query;
执行结果:
——————+—————–+————+———————–+———————
‘brown’ & ‘quick’| ‘brown’ | ‘quick’| !’quick’ | ‘quick’ <-> ‘brown’ | ‘quick’ <5> ‘brown’
(1 row)
4. 创建全文检索索引
4.1 创建测试表
CREATE TABLE fgedu_articles_fts (
article_id SERIAL PRIMARY KEY,
title VARCHAR(200),
content TEXT,
author VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
— 插入测试数据
INSERT INTO fgedu_articles_fts (title, content, author) VALUES
(‘PostgreSQL入门教程’, ‘PostgreSQL是一个功能强大的开源关系数据库管理系统,支持SQL标准和ACID事务。’, ‘风哥1号’),
(‘数据库优化技巧’, ‘数据库性能优化包括索引优化、查询优化、配置优化等多个方面。PostgreSQL提供了丰富的工具。’, ‘风哥2号’),
(‘SQL查询进阶’, ‘SQL查询包括简单查询、连接查询、子查询等。掌握SQL查询是数据库开发的基础技能。’, ‘王五’),
(‘PostgreSQL高可用架构’, ‘PostgreSQL高可用方案包括流复制、逻辑复制、Patroni等。保证数据库服务持续可用。’, ‘赵六’),
(‘全文检索实践’, ‘全文检索是数据库的重要功能,PostgreSQL内置全文检索支持,可以高效搜索文本内容。’, ‘风哥1号’);
— 创建全文检索索引
CREATE INDEX idx_articles_content_fts ON fgedu_articles_fts
USING GIN(to_tsvector(‘english’, content));
— 创建标题+内容联合索引
CREATE INDEX idx_articles_title_content_fts ON fgedu_articles_fts
USING GIN(to_tsvector(‘english’, title || ‘ ‘ || content));
执行结果:
学习交流加群风哥QQ113257174
CREATE INDEX
CREATE INDEX
4.2 使用索引查询
SELECT
article_id,
title,
author,
ts_headline(‘english’, content, to_tsquery(‘english’, ‘PostgreSQL’)) AS highlighted
FROM fgedu_articles_fts
WHERE to_tsvector(‘english’, content) @@ to_tsquery(‘english’, ‘PostgreSQL’);
执行结果:
学习交流加群风哥微信: itpux-com
————+————————-+——–+—————————————————
1 | PostgreSQL入门教程 | 风哥1号 | PostgreSQL是一个功能强大的开源关系数据库管理系统…
2 | 数据库优化技巧 | 风哥2号 | …配置优化等多个方面。PostgreSQL提供了丰富的工具。
4 | PostgreSQL高可用架构 | 赵六 | PostgreSQL高可用方案包括流复制、逻辑复制、Patroni等…
5 | 全文检索实践 | 风哥1号 | …PostgreSQL内置全文检索支持,可以高效搜索文本内容。
(4 rows)
5. 中文全文检索
5.1 使用zhparser扩展
SELECT * FROM pg_available_extensions WHERE name = ‘zhparser’;
— 如果已安装,可以创建中文配置
— CREATE EXTENSION IF NOT EXISTS zhparser;
— CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);
— ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
— 使用simple配置处理中文
SELECT to_tsvector(‘simple’, ‘PostgreSQL数据库是一个功能强大的开源数据库系统’);
执行结果:
——+—————–+——————-+———
(0 rows)
to_tsvector
————————————————————-
‘postgresql’:1 ‘数据库’:2,6 ‘一个’:3 ‘功能’:4 ‘强大’:5 ‘开源’:7 ‘系统’:8
(1 row)
5.2 中文全文检索查询
SELECT
article_id,
title,
content
FROM fgedu_articles_fts
WHERE to_tsvector(‘simple’, content) @@ to_tsquery(‘simple’, ‘数据库 & 优化’);
执行结果:
————+—————–+——————————————————-
2 | 数据库优化技巧 | 数据库性能优化包括索引优化、查询优化、配置优化等多个方面…
(1 row)
6. 实战案例:文章搜索
6.1 相关性排序
SELECT
article_id,
title,
author,
ts_rank(to_tsvector(‘english’, content), to_tsquery(‘english’, ‘PostgreSQL’)) AS rank,
ts_headline(‘english’, content, to_tsquery(‘english’, ‘PostgreSQL’)) AS highlighted
FROM fgedu_articles_fts
WHERE to_tsvector(‘english’, content) @@ to_tsquery(‘english’, ‘PostgreSQL’)
ORDER BY rank DESC;
执行结果:
————+————————-+——–+————-+—————————————————
1 | PostgreSQL入门教程 | 风哥1号 | 0.0607927 | PostgreSQL是一个功能强大的开源关系数据库管理系统…
4 | PostgreSQL高可用架构 | 赵六 | 0.0607927 | PostgreSQL高可用方案包括流复制、逻辑复制、Patroni等…
5 | 全文检索实践 | 风哥1号 | 0.0303964 | …PostgreSQL内置全文检索支持,可以高效搜索文本内容。
2 | 数据库优化技巧 | 风哥2号 | 0.0303964 | …配置优化等多个方面。PostgreSQL提供了丰富的工具。
(4 rows)
6.2 综合搜索功能
CREATE OR REPLACE FUNCTION fgedu_search_articles(
p_keyword TEXT,
p_limit INTEGER DEFAULT 10
) RETURNS TABLE (
article_id INTEGER,
title VARCHAR,
author VARCHAR,
rank REAL,
snippet TEXT
) AS $$
BEGIN
RETURN QUERY
SELECT
a.article_id,
a.title,
a.author,
ts_rank(
to_tsvector(‘english’, a.title || ‘ ‘ || a.content),
to_tsquery(‘english’, p_keyword)
)::REAL AS rank,
ts_headline(
‘english’,
a.content,
to_tsquery(‘english’, p_keyword),
‘MaxWords=50, MinWords=10’
) AS snippet
FROM fgedu_articles_fts a
WHERE to_tsvector(‘english’, a.title || ‘ ‘ || a.content) @@ to_tsquery(‘english’, p_keyword)
ORDER BY rank DESC
LIMIT p_limit;
END;
$$ LANGUAGE plpgsql;
— 使用搜索函数
SELECT * FROM fgedu_search_articles(‘fgedudb | PostgreSQL’, 5);
执行结果:
————+————————-+——–+————-+—————————————————
1 | PostgreSQL入门教程 | 风哥1号 | 0.150 | PostgreSQL是一个功能强大的开源关系数据库管理系统…
4 | PostgreSQL高可用架构 | 赵六 | 0.120 | PostgreSQL高可用方案包括流复制、逻辑复制…
5 | 全文检索实践 | 风哥1号 | 0.090 | …PostgreSQL内置全文检索支持…
2 | 数据库优化技巧 | 风哥2号 | 0.060 | 数据库性能优化包括索引优化、查询优化…
3 | SQL查询进阶 | 王五 | 0.030 | …数据库开发的基础技能…
(5 rows)
7. 清理环境
DROP FUNCTION IF EXISTS fgedu_search_articles(TEXT, INTEGER);
— 删除测试表
DROP TABLE IF EXISTS fgedu_articles_fts;
执行结果:
DROP TABLE
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
