PostgreSQL 多重含义数组检索与条件过滤 (标签1:属性, 标签n:属性) - 包括UPSERT操作如何修改数组、追加数组元素

摘要: 标签 PostgreSQL , 多重函数数组 , UDF索引 , 过滤 , 文本处理 背景 PG的数组类型,被广泛应用于 画像系统 , 标签系统。 在一些业务重建中,对数组内容的定义往往包含了多重含义,例如即包含了标签本身,又包含了标签的属性(例如 标签值:权值,时间 等)。

点此查看原文

标签 
PostgreSQL , 多重函数数组 , UDF索引 , 过滤 , 文本处理

背景 
PG的数组类型,被广泛应用于 画像系统 , 标签系统。

在一些业务重建中,对数组内容的定义往往包含了多重含义,例如即包含了标签本身,又包含了标签的属性(例如 标签值:权值,时间 等)。

那么如何能高效的进行标签的检索,同时又过滤出符合标签加权值的记录呢?

例子 
1、建表

create table tbl(id int, info text[]); 
2、写入测试数据

insert into tbl values (1, array[‘a:100’, ‘b:10’]);

insert into tbl values (2, array[‘a:15’, ‘b:20’, ‘c:99’]);

insert into tbl values (3, array[‘c:78’, ‘b:100’]);

postgres=# select * from tbl; 
id | info 
—-+—————— 
1 | {a:100,b:10} 
2 | {a:15,b:20,c:99} 
3 | {c:78,b:100} 
(3 rows) 
3、创建UDF1,提取出要查询的标签值(用到了正则匹配)

create or replace function get_label(text[]) returns text[] as

select array(select substring(unnest($1), '(.*):'));
language sql strict immutable;

postgres=# select get_label(info) from tbl;

get_label

{a,b} 
{a,b,c} 
{c,b} 
(3 rows) 
4、创建UDF1索引

create index idx_tbl1 on tbl using gin (get_label(info));

postgres=# explain select * from tbl where get_label(info) @> array[‘a’];

QUERY PLAN

Bitmap Heap Scan on tbl (cost=2.40..3.86 rows=1 width=36) 
Recheck Cond: (get_label(info) @> ‘{a}’::text[]) 
-> Bitmap Index Scan on idx_tbl1 (cost=0.00..2.40 rows=1 width=0) 
Index Cond: (get_label(info) @> ‘{a}’::text[]) 
(4 rows) 
5、创建UDF2,提取指定标签的加权值(用到了正则匹配,数组下标计算,数组按位置取元素等操作)

create or replace function get_weight(text[], text) returns text as

select substring($1[array_position(get_label($1), $2)], ':(.*)');
language sql strict immutable;

postgres=# select info, get_weight(info, ‘a’) from tbl; 
info | get_weight 
——————+———— 
{a:100,b:10} | 100 
{a:15,b:20,c:99} | 15 
{c:78,b:100} | 
(3 rows) 
6、查询SQL如下

查询包含标签a,同时权值大于20的记录。

postgres=# select * from tbl where get_label(info) @> array[‘a’] and get_weight(info, ‘a’)::float8 >20; 
id | info 
—-+————– 
1 | {a:100,b:10} 
(1 row)

postgres=# explain select * from tbl where get_label(info) @> array[‘a’] and get_weight(info, ‘a’)::float8 >20;

QUERY PLAN

Bitmap Heap Scan on tbl (cost=2.40..4.12 rows=1 width=36) 
Recheck Cond: (get_label(info) @> ‘{a}’::text[]) 
Filter: ((get_weight(info, ‘a’::text))::double precision > ‘20’::double precision) 
-> Bitmap Index Scan on idx_tbl1 (cost=0.00..2.40 rows=1 width=0) 
Index Cond: (get_label(info) @> ‘{a}’::text[]) 
(5 rows) 
UDF功能是不是很赞呢?

UPSERT时,如何修改数组、追加数组元素 
https://www.postgresql.org/docs/10/static/functions-array.html

1、追加元素

array_append(anyarray, anyelement)

array_cat(anyarray, anyarray)

array_fill(anyelement, int[], [, int[]])

array_prepend(anyelement, anyarray) 
2、修改元素

array_replace(anyarray, anyelement, anyelement) 
3、删除元素

array_remove(anyarray, anyelement) 
用法举例

insert into tbl values (1, ?) on conflict (id) do update set info=func(tbl.info,?); 
create table tbl1(id int primary key, info int[]);

postgres=# insert into tbl1 values (1, array[1,2,3]) on conflict (id) do update set info=array_append(tbl1.info, 100) returning *; 
id | info 
—-+——— 
1 | {1,2,3} 
(1 row)

INSERT 0 1 
postgres=# insert into tbl1 values (1, array[1,2,3]) on conflict (id) do update set info=array_append(tbl1.info, 100) returning *; 
id | info 
—-+————- 
1 | {1,2,3,100} 
(1 row)

INSERT 0 1 
postgres=# insert into tbl1 values (1, null) on conflict (id) do update set info=array_append(tbl1.info, 100) returning *; 
id | info 
—-+—————– 
1 | {1,2,3,100,100} 
(1 row) 
INSERT 0 1

扫描二维码获取更多消息:

图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从MapReduce的执行来看如何优化MaxCompute(原ODPS) SQL

摘要: SQL基础有这些操作(按照执行顺序来排列): from join(left join, right join, inner join, outer join ,semi join) where group by select sum distinct count order by 如果我们能理解mapreduce是怎么实现这些SQL中的基本操…

flowable实战(十二)flowable 核心表ACT_RU_EXECUTION 详解(初学者误解的一张表)

一、ACT_RU_EXECUTION 表(很多初学者迷惑的一张表,以为是流程实例表,其实它叫执行实例表):这个表和act_run_task表,一起控制了用户任务的产生与完成等。 这个表是工作流程的核心表,这个表会体现主干与分支…

阿里云大数据MaxCompute计算资源分布以及LogView分析优化

摘要: MaxCompute(原ODPS)的概念 海量数据处理平台,服务于批量结构化数据的存储和计算,提供海量数据仓库的解决方案以及针对大数据的分析建模服务.(官方文档有这里就不多做介绍了)官方文档链接 优势 用户不必关心分布式计算细节&a…

计算机视觉领域还能耍什么花样?

从移动支付的自动贩卖机到刷脸支付的智能货柜;从亲自到柜台验证到人脸核身远程开卡;从排队买票、排队进门的糟糕旅游体验到提前预约,刷脸入园的智慧旅游;……从计算机视觉应用的产业板块上分析,以视频应用为基础的视频…

MaxCompute MapReduce

摘要: 大数据计算服务(MaxCompute)的功能详解和使用心得 点此查看原文:http://click.aliyun.com/m/41384/ 前言 MapReduce已经有文档,用户可以参考文档使用。本文是在文档的基础上做一些类似注解及细节解释上的工作。 功能介绍 MapReduce 说起…

Flowable springboot项目自定义中文字体

Flowable springboot项目自定义中文字体 摘要:在flowable框架中,当我们想要集成springboot框架的时候,可能要设置中文字体,flowable6.4之前的版本因为没有可以设置字体的属性,所以我们没法进行中文字体的设置&#xff…

漫画 | Kubernetes带你一帆风顺去远航

戳蓝字“CSDN云计算”关注我们哦!来源 | Google Cloud如果你是一个狂立学习flag却屡屡打脸的懒癌晚期,或者是一个对云计算方面云里雾里,不知所措的好学者,亦或是一位资深行业专家,都欢迎关注【CSDN云计算公众号】&…

Kubernetes与Docker基本概念与常用命令对照

摘要: Docker是众多用户上手入门的基础容器和编排工具,提供了良好的开发者体验。Kubernetes是强大的容器编排平台,功能丰富。它们有很多概念和操作都有类似之处。我们今天会和大家对比基本概念与常用命令,可以方便熟悉Docker的用户…

flowable 设置流程跟踪高亮线的颜色

背景:在实际情况下,很多人对这个红色的高亮有意见,所以这里我把我的修改颜色的代码分享出来,希望对大家有帮助。(如果有问题可以加QQ群:633168411 里面很多高手,人也都非常善良) 效果…

连续启动 crash 自修复技术实现与原理解析

摘要: 如果 app 连续 crash 两次无法启动,用户往往会选择卸载。本文介绍如何该类 crash 的自修复技术。 点此查看原文:http://click.aliyun.com/m/41487/ 作者:阿里云-移动云-大前端团队 前言 如果 app 连续 crash 两次无法启动…

舞动的桥 阿里云首个百万IOPS云盘的背后

摘要: 近日,阿里云推出了首个百万IOPS的ESSD云盘服务,性能上有50倍的飞跃,同时还具备超高吞吐、超低时延等特性,在真实业务场景中,PostgreSQL数据库的写入速度快了26倍。 如此超高的性能,有人会…

Kubernetes上的服务网格 Istio - 分布式追踪篇

摘要: 2017年5月,Google、IBM和Lyft发布了开源服务网格框架Istio,提供微服务的连接、管理、监控和安全保护。Istio提供了一个服务间通信的基础设施层,解耦了应用逻辑和服务访问中版本管理、安全防护、故障转移、监控遥测等切面的问…

flowable实现流程回退功能

此版本为旧的版本,建议参看新的版本6.4.0 前期项目要求实现流程回退(仅要求回退到上一节点),所使用的flowable版本是6.2.0-SANPSHOT。在网上收到的流程回退的例子都是activity的,然而activity的很多接口在flowable中都…

如何用ACM简化你的Spring Cloud微服务环境配置管理

摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境配置管理的方案,并会简单比较一下ACM与Spring Cloud Config方案的优…

flowable 新的驳回方式 ChangeActivityStateBuilder 多实例驳回 并行网关驳回 普通节点驳回

6.4.0 新增加了驳回的方式,真是对中国式流程的一种福音呀,感谢flowable创始人。 再也不为开发驳回流程发愁了,网上那些视频和修改源码真的是demo级别的,不能商业用。 只有心如流水的学习才是永远的发电机,不要幻想别…

解锁新姿势 |如何利用配置中心规范构建PaaS服务配置

摘要: 在上一篇文章中,我们以MQ和ACM为例,讨论了如何借助配置中心对消息进行限流管理的场景。在本文中,我们继续以该场景为例,讲述如何以规范的配置命名格式来进行限流设置。 点此查看原文:http://click.al…

flowable流程实例笔记(1)

RuntimeService 运行服务类 支持启动的方式 流程定义: 从这里获取资源文件. 执行实例: 流程实例中执行的每个环节.流程实例: 一个流程实例包括所有运行的节点,一个流程中流程实例只有一个.启动一个实例: public void startProcessInstanceByKey() {String processDefinitionK…

flowable6.4.2流程审批后涉及到的表

当流程全部走完后,act_ru_*表的数据清空了,全部移到了act_hi_*表

阿里云弹性高性能计算产品商业化正式发布

摘要: 来自全国500多家企业申请试用,结合客户的体验需求和反馈意见,不断地改善和打磨,弹性高性能计算商业版有了很大的优化,在产品性能和体验上都有全新的升级。 点此查看原文:http://click.aliyun.com/m/4…

php中 怎么去除,php如何去掉链接

php去掉链接的方法:1、删除内容中的超链接ereg_replace(]*)>([^,\\2,$content);ereg_replace("]*>|","",$content);2、消除包含特定词的超链接$find"this string is my find";$string替换掉了;//将超链接替换成的内容echo ereg…