PostgreSQL如何对某行记录进行模糊查询
在某些场景下,我们可能需要对表的某行字段进行查询。
例如BI报表的下拉框,用户可能会勾选多个条件进行查询,那么我们查询会很麻烦。
例如:
bill@bill=>create table test1(c1 int,c2 text,c3 text,c4 text); CREATE TABLE bill@bill=>insert into test1 values(1,'post','china','bill'); INSERT 0 1
如果我们要查询该表某行包含china的记录,我们可能需要这么去写:
select * from test1 where c1 ~ 'china' or c2 ~ 'china' or ...
可以看到这样写会相当麻烦,而且性能也不尽人意。
那么我们有什么办法能解决这类问题呢?
全文检索,我们可以通过行级别的全文检索来处理这类问题。
例子:
这里我们以pg_scws分词插件来演示。
下载地址:https://github.com/jaiminpan/pg_scws
安装:
git clone https://github.com/jaiminpan/pg_scws
cd pg_scws
USE_PGXS=1 make && make install
以上面的表为例,我们可以将改行记录转成一个全文检索的文本:
bill@bill=>select to_tsvector('scwscfg',test1::text) from test1; to_tsvector --------------------------------------- '1':1 'bill':4 'china':3 'post':2 (1 row)
查询:
bill@bill=> select to_tsvector('scwscfg',test1::text) @@ to_tsquery('post & china') from test1; ?column? ---------- t (1 row)
至此,我们实现了对行级记录的全文检索查询,接着让我们再创建行级全文检索的索引来加速查询。
首先我们需要创建immutable类型的函数。
bill@bill=> create or replace function f1(regconfig,text) returns tsvector as $$ bill$# select to_tsvector($1,$2); bill$# $$ language sql immutable strict; CREATE FUNCTION
需要将record_out和textin函数转为immutable类型:
bill@bill=>alter function record_out(record) immutable; ALTER FUNCTION bill@bill=>alter function textin(cstring) immutable; ALTER FUNCTION
创建索引:
bill@bill=> create index idx_test1 on test1 using gin (f1('scwscfg'::regconfig,test1::text)) ; CREATE INDEX
查询测试:
bill@bill=>select * from test1 where f1('scwscfg'::regconfig,test1::text) @@ to_tsquery('china') ; c1 | c2 | c3 | c4 ----+------+-------+------ 1 | post | china | bill (1 row)
验证是否可以使用索引:
bill@bill=>set enable_seqscan = off; SET bill@bill=> explain select * from test1 where f1('scwscfg'::regconfig,test1::text) @@ to_tsquery('china') ; QUERY PLAN ------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on test1 (cost=2.85..4.67 rows=1 width=100) Recheck Cond: (to_tsvector('scwscfg'::regconfig, (test1.*)::text) @@ to_tsquery('china'::text)) -> Bitmap Index Scan on idx_test1 (cost=0.00..2.85 rows=1 width=0) Index Cond: (to_tsvector('scwscfg'::regconfig, (test1.*)::text) @@ to_tsquery('china'::text)) (4 rows)
参考链接:
https://github.com/jaiminpan/pg_scws
http://www.postgres.cn/docs/13/textsearch.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
恕我直言,微服务挺好,但不适合你
今天这篇文章我们继续说架构师大刘的故事。 故事纯属虚构,别对号入座哈。 前言 大刘日子最近还不错,经常午睡醒来,就继续拿着手机看小说摸鱼。大刘对当前所在的这家公司比较满意。大部分系统已经成熟稳定,用户量也中规中矩。虽然有些项目技术陈旧,但好处是没啥幺蛾子技术问题冒出来等着解决。 只是有时候大刘心里会打鼓,公司盈利在下降,巅峰不在,也不知道这家公司能撑多久。除了偶然会冒出些对工作稳定的担忧以外,大部分时候,大刘心情都是愉快的。直到他被领导叫到办公室分派新任务的那一刻…… 大刘的领导 CTO 老李,这些日子心情不是很好。他在的这家公司原本是个以传统业务为主的公司。为了跟上互联网时代,大老板拍脑袋成立了个技术部门搞互联网。虽说公司已经号称触网了,但是公司盈利基本还是靠传统业务,技术部门只是打辅助的。没有业务主动权,没有盈利点,部门员工的工资却都不低,老李的地位就可见一般了,经常受些冷言冷语的夹板气。再加上,最近公司的效益也有所下降,眼见技术部门面临着裁员的危险。老李危机意识被极大的刺激到了。 老李是个技术出身,但是离开一线编码已经快十年了,每天的工作其实就是管理加玩概念。这几年微服务的概念非...
- 下一篇
Proxy-Go 控制面板 v3.0 发布,新增版本参数,更新功能!
Proxy-Go 控制面板 ProxyAdmin是强大的代理服务工具snail007/goproxy的控制面板,运行了它,一秒让你的服务器变为强大的代理服务器,友好的交互界面,小白也能轻松上手,让你用起来得心应手,心情舒畅。 更新内容: 1.新增更新功能,执行`proxy-admin update`就可以更新了,升级更加方便。还能用`proxy-admin update -f`强制更新。 2.新增`proxy-admin -v`,`proxy-admin version`都可以显示当前版本号。 升级提示: 1.备份配置目录数据文件。 2.卸载旧版本,重新安装新版本。 3.使用备份的数据库文件覆盖配置目录的数据文件。 功能预览 展现客户端参数 实时日志 参数文件管理 调试模式 下载地址: Gitee Github
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker快速安装Oracle11G,搭建oracle11g学习环境