From aba517f8976aa462c29b7a9c9960d64c2025e339 Mon Sep 17 00:00:00 2001 From: digoal zhou Date: Thu, 2 Feb 2023 18:07:09 +0800 Subject: [PATCH 1/4] [Docs] add practice documents for PolarDB --- docs/.vuepress/configs/navbar/zh.ts | 10 + docs/zh/practice/brin.md | 170 ++++++++++ docs/zh/practice/spgist.md | 467 ++++++++++++++++++++++++++++ 3 files changed, 647 insertions(+) create mode 100644 docs/zh/practice/brin.md create mode 100644 docs/zh/practice/spgist.md diff --git a/docs/.vuepress/configs/navbar/zh.ts b/docs/.vuepress/configs/navbar/zh.ts index 3a815188481..b5a6476a064 100644 --- a/docs/.vuepress/configs/navbar/zh.ts +++ b/docs/.vuepress/configs/navbar/zh.ts @@ -116,6 +116,16 @@ export const zh: NavbarConfig = [ }, ], }, + { + text: "应用实践", + link: "/zh/practice/", + children: [ + { + text: "最佳实践", + children: ["/zh/practice/brin.html", "/zh/practice/spgist.html"], + }, + ], + }, { text: "上手开发", link: "/zh/development/", diff --git a/docs/zh/practice/brin.md b/docs/zh/practice/brin.md new file mode 100644 index 00000000000..e1c356b6882 --- /dev/null +++ b/docs/zh/practice/brin.md @@ -0,0 +1,170 @@ +--- +author: digoal +date: 2023/02/01 +minute: 15 +--- + +# 通过 BRIN 索引实现千分之一的存储空间, 高效率检索时序数据 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的 +价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版通过 brin 索引实现千分之一的存储空间, 高效率检索时序数据 + +测试环境为 macOS+docker, PolarDB 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 原理 + +PolarDB 的普通表采用堆存储, 最小分配单位为 block, 不够了就在文件末尾追加 block. + +所以根据时序数据的 append only 、 时间字段递增特征. 一个 block 内的时间字段的值基本上是相邻的, 相邻的 block 时间值也相邻. + +时序数据通常是按片搜索, 例如分钟、小时、天等粒度的片搜索和统计. + +怎样高效、低成本的检索时序数据? PolarDB BRIN 块级别范围索引, 千分之一的存储, 实现 btree 同级别的片区搜索性能. + +brin 为什么省存储呢? 因为一片 blocks, 只存储其索引字段的 min,max,nullif 的统计值. 所以非常节省空间. + +## 模拟测试 + +1、建立时序表 + +``` +create table tbl (id int, v1 int, v2 int, crt_time timestamp(0)); +``` + +2、写入 500 万条时序数据 + +``` +insert into tbl select id, random()*10, random()*100, now()+(id||'second')::interval from generate_series(1,5000000) id; +``` + +3、查询时序字段的边界值 + +``` +postgres=# select min(crt_time), max(crt_time) from tbl; + min | max +---------------------+--------------------- + 2022-12-21 08:47:19 | 2023-02-17 05:40:38 +(1 row) +``` + +4、普通 btree 索引的测试, 占用空间等. + +``` +create index on tbl using btree (crt_time); +``` + +``` +postgres=# \dt+ + List of relations + Schema | Name | Type | Owner | Size | Description +--------+------+-------+----------+--------+------------- + public | tbl | table | postgres | 249 MB | +(1 row) + +postgres=# \di+ + List of relations + Schema | Name | Type | Owner | Table | Size | Description +--------+------------------+-------+----------+-------+--------+------------- + public | tbl_crt_time_idx | index | postgres | tbl | 107 MB | +(1 row) +``` + +``` +postgres=# explain (analyze,verbose,timing,costs,buffers) select count(*) from tbl where crt_time between '2022-12-30' and '2022-12-31'; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate (cost=32345.17..32345.18 rows=1 width=8) (actual time=19.311..19.317 rows=1 loops=1) + Output: count(*) + Buffers: shared hit=790 + -> Bitmap Heap Scan on public.tbl (cost=532.68..32282.67 rows=25000 width=0) (actual time=5.786..13.871 rows=86401 loops=1) + Recheck Cond: ((tbl.crt_time >= '2022-12-30 00:00:00'::timestamp without time zone) AND (tbl.crt_time <= '2022-12-31 00:00:00'::timestamp without time zone)) + Heap Blocks: exact=551 + Buffers: shared hit=790 + -> Bitmap Index Scan on tbl_crt_time_idx (cost=0.00..526.43 rows=25000 width=0) (actual time=5.723..5.724 rows=86401 loops=1) + Index Cond: ((tbl.crt_time >= '2022-12-30 00:00:00'::timestamp without time zone) AND (tbl.crt_time <= '2022-12-31 00:00:00'::timestamp without time zone)) + Buffers: shared hit=239 + Planning Time: 0.081 ms + Execution Time: 19.550 ms +(12 rows) +``` + +5、判断时间字段是否适合 brin 索引: 相关性为 1, 表明这个字段有自增属性、而且边界清晰. 非常适合 brin 索引. + +相关性的范围是-1 到 1, 越接近 1 或者-1 都适合 brin. + +``` +postgres=# select correlation from pg_stats where tablename='tbl' and attname='crt_time'; + correlation +------------- + 1 +(1 row) +``` + +6、测试 brin 索引, 观察其占用空间, 查询性能. + +``` +drop index tbl_crt_time_idx; + + +create index on tbl using brin (crt_time); + + +postgres=# explain (analyze,verbose,timing,costs,buffers) select count(*) from tbl where crt_time between '2022-12-30' and '2022-12-31'; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate (cost=33599.60..33599.61 rows=1 width=8) (actual time=26.022..26.025 rows=1 loops=1) + Output: count(*) + Buffers: shared hit=642 + -> Bitmap Heap Scan on public.tbl (cost=33.38..33387.41 rows=84878 width=0) (actual time=0.937..18.871 rows=86401 loops=1) + Recheck Cond: ((tbl.crt_time >= '2022-12-30 00:00:00'::timestamp without time zone) AND (tbl.crt_time <= '2022-12-31 00:00:00'::timestamp without time zone)) + Rows Removed by Index Recheck: 14079 + Heap Blocks: lossy=640 + Buffers: shared hit=642 + -> Bitmap Index Scan on tbl_crt_time_idx (cost=0.00..12.16 rows=100402 width=0) (actual time=0.420..0.421 rows=6400 loops=1) + Index Cond: ((tbl.crt_time >= '2022-12-30 00:00:00'::timestamp without time zone) AND (tbl.crt_time <= '2022-12-31 00:00:00'::timestamp without time zone)) + Buffers: shared hit=2 + Planning Time: 0.168 ms + Execution Time: 26.162 ms +(13 rows) + + + +postgres=# \di+ + List of relations + Schema | Name | Type | Owner | Table | Size | Description +--------+------------------+-------+----------+-------+-------+------------- + public | tbl_crt_time_idx | index | postgres | tbl | 48 kB | +(1 row) +``` + +结论符合预期: + +- brin 占用空间只有 btree 的 2000 分之一大小, 但是在进行范围条件搜索时, brin 索引性能相当于 btree, 扫描更少的数据块得到同级别的性能. + +## 参考 + +- [《重新发现 PostgreSQL 之美 - 13 brin 时序索引》](https://github.com/digoal/blog/blob/master/202106/20210605_02.md) +- [《PostGIS 空间索引(GiST、BRIN、R-Tree)选择、优化 - 2》](https://github.com/digoal/blog/blob/master/202105/20210507_05.md) +- [《PostgreSQL 14 preview - BRIN (典型 IoT 时序场景) 块级索引支持 bloom filter - 随机,大量 distinct value, 等值查询》](https://github.com/digoal/blog/blob/master/202103/20210326_02.md) +- [《PostgreSQL 14 preview - BRIN (典型 IoT 时序场景) 块级索引支持 multi-range min-max [s] - 分段范围索引》](https://github.com/digoal/blog/blob/master/202103/20210326_01.md) +- [《PostgreSQL 14 preview - brin 索引内存优化》](https://github.com/digoal/blog/blob/master/202103/20210324_01.md) +- [《PostgreSQL 11 preview - BRIN 索引接口功能扩展(BLOOM FILTER、min max 分段)》](https://github.com/digoal/blog/blob/master/201803/20180323_05.md) +- [《HTAP 数据库 PostgreSQL 场景与性能测试之 24 - (OLTP) 物联网 - 时序数据并发写入(含时序索引 BRIN)》](https://github.com/digoal/blog/blob/master/201711/20171107_25.md) +- [《PostgreSQL BRIN 索引的 pages_per_range 选项优化与内核代码优化思考》](https://github.com/digoal/blog/blob/master/201708/20170824_01.md) +- [《万亿级电商广告 - brin 黑科技带你(最低成本)玩转毫秒级圈人(视觉挖掘姊妹篇) - 阿里云 RDS PostgreSQL, HybridDB for PostgreSQL 最佳实践》](https://github.com/digoal/blog/blob/master/201708/20170823_01.md) +- [《PostGIS 空间索引(GiST、BRIN、R-Tree)选择、优化 - 阿里云 RDS PostgreSQL 最佳实践》](https://github.com/digoal/blog/blob/master/201708/20170820_01.md) +- [《自动选择正确索引访问接口(btree,hash,gin,gist,sp-gist,brin,bitmap...)的方法》](https://github.com/digoal/blog/blob/master/201706/20170617_01.md) +- [《PostgreSQL 并行写入堆表,如何保证时序线性存储 - BRIN 索引优化》](https://github.com/digoal/blog/blob/master/201706/20170611_02.md) +- [《PostgreSQL 10.0 preview 功能增强 - BRIN 索引更新 smooth 化》](https://github.com/digoal/blog/blob/master/201704/20170405_01.md) +- [《PostgreSQL 聚集存储 与 BRIN 索引 - 高并发行为、轨迹类大吞吐数据查询场景解说》](https://github.com/digoal/blog/blob/master/201702/20170219_01.md) +- [《PostgreSQL 物联网黑科技 - 瘦身几百倍的索引(BRIN index)》](https://github.com/digoal/blog/blob/master/201604/20160414_01.md) +- [《PostgreSQL 9.5 new feature - lets BRIN be used with R-Tree-like indexing strategies For "inclusion" opclasses》](https://github.com/digoal/blog/blob/master/201505/20150526_01.md) +- [《PostgreSQL 9.5 new feature - BRIN (block range index) index》](https://github.com/digoal/blog/blob/master/201504/20150419_01.md) diff --git a/docs/zh/practice/spgist.md b/docs/zh/practice/spgist.md new file mode 100644 index 00000000000..a14f3cdb7a9 --- /dev/null +++ b/docs/zh/practice/spgist.md @@ -0,0 +1,467 @@ +--- +author: digoal +date: 2023/02/02 +minute: 15 +--- + +# 采用 iprange 和 SPGiST index 加速全球化业务用户体验 - 根据来源 IP 智能路由就近机房降低访问延迟 + + + +## 背景 + +上一篇信息: [《如何获得 IP 地址对应的地理信息库, 实现智能 DNS 解析? 就近路由提升全球化部署业务的访问性能》](https://github.com/digoal/blog/blob/master/202211/20221124_09.md) 提到了如何获取 IP 地址段的地理信息库, 本篇信息将使用 PolarDB for PostgreSQL 来加速根据来源 IP 快速找到对应的 IP 地址段, 将用到 PolarDB for PostgreSQL 的 SPGiST 索引和 inet 数据类型. + +相比于把 IP 地址段存储为 2 个 int8 字段作 between and 的匹配, SPGiST 索引和 inet 数据类型至少可以提升 20 倍性能. + +用到的 inet 数据类型如下: + +https://www.postgresql.org/docs/15/functions-net.html + +``` +inet >>= inet → boolean +Does subnet contain or equal subnet? +inet '192.168.1/24' >>= inet '192.168.1/24' → t +``` + +## 实例讲解 + +1、将数据导入 PolarDB for PostgreSQL, 使用 inet 类型存储地址段, 并创建 spgist 索引. + +``` +create table ip2geo (id serial primary key, ip inet, province text, city text); + +copy ip2geo(ip,province,city) from '/Users/digoal/c.csv' (format csv); +COPY 8617 + +create index idx_1 on ip2geo using spgist (ip); +``` + +``` +postgres=# select ip,host(ip), masklen(ip) from ip2geo limit 10; + ip | host | masklen +-------------+----------+--------- + 1.0.1.0/24 | 1.0.1.0 | 24 + 1.0.2.0/23 | 1.0.2.0 | 23 + 1.0.8.0/21 | 1.0.8.0 | 21 + 1.0.32.0/19 | 1.0.32.0 | 19 + 1.1.0.0/24 | 1.1.0.0 | 24 + 1.1.2.0/23 | 1.1.2.0 | 23 + 1.1.4.0/22 | 1.1.4.0 | 22 + 1.1.8.0/24 | 1.1.8.0 | 24 + 1.1.9.0/24 | 1.1.9.0 | 24 + 1.1.10.0/23 | 1.1.10.0 | 23 +(10 rows) +``` + +2、IP 地址段包含查询例子 + +``` +postgres=# select * FROM ip2geo where ip >>= '1.88.0.10/32' ; + id | ip | province | city +----+-------------+----------+---------- + 53 | 1.88.0.0/14 | 北京市 | 歌华宽带 +(1 row) + +postgres=# select * FROM ip2geo where ip >>= '1.88.0.0/24' ; + id | ip | province | city +----+-------------+----------+---------- + 53 | 1.88.0.0/14 | 北京市 | 歌华宽带 +(1 row) +``` + +3、对比索引扫描的性能提升, 相比全表扫描性能相差 25 倍: + +``` +postgres=# explain (analyze,verbose,timing,costs,buffers) select * FROM ip2geo where ip >>= '1.88.0.0/24' ; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------- + Index Scan using idx_1 on public.ip2geo (cost=0.15..2.37 rows=1 width=35) (actual time=0.019..0.020 rows=1 loops=1) + Output: id, ip, province, city + Index Cond: (ip2geo.ip >>= '1.88.0.0/24'::inet) + Buffers: shared hit=4 + Planning Time: 0.057 ms + Execution Time: 0.031 ms +(6 rows) + +postgres=# set enable_indexscan=off; +SET +postgres=# set enable_bitmapscan=off; +SET +postgres=# explain (analyze,verbose,timing,costs,buffers) select * FROM ip2geo where ip >>= '1.88.0.0/24' ; + QUERY PLAN +---------------------------------------------------------------------------------------------------------- + Seq Scan on public.ip2geo (cost=0.00..175.71 rows=1 width=35) (actual time=0.013..0.783 rows=1 loops=1) + Output: id, ip, province, city + Filter: (ip2geo.ip >>= '1.88.0.0/24'::inet) + Rows Removed by Filter: 8616 + Buffers: shared hit=68 + Planning Time: 0.056 ms + Execution Time: 0.793 ms +(7 rows) +``` + +4、压力测试方法, 随机从地址库中取一条记录并生成这个地址段内的随机 IP 地址. + +``` +create or replace function getipaddr(int default ceil(8617*random())) returns inet as $$ + select ip + (floor(random()*(2^(32-masklen(ip)))))::int8 from ip2geo where id=$1; +$$ language sql strict immutable; +``` + +``` +postgres=# explain (analyze,verbose,timing,costs,buffers) select * FROM ip2geo where ip >>= getipaddr(); + QUERY PLAN +---------------------------------------------------------------------------------------------------------- + Seq Scan on public.ip2geo (cost=0.00..175.71 rows=1 width=35) (actual time=0.098..0.955 rows=1 loops=1) + Output: id, ip, province, city + Filter: (ip2geo.ip >>= '43.243.11.49/22'::inet) + Rows Removed by Filter: 8616 + Buffers: shared hit=68 + Planning: + Buffers: shared hit=14 + Planning Time: 0.370 ms + Execution Time: 0.962 ms +(9 rows) + +postgres=# explain (analyze,verbose,timing,costs,buffers) select * FROM ip2geo where ip >>= getipaddr(); + QUERY PLAN +---------------------------------------------------------------------------------------------------------- + Seq Scan on public.ip2geo (cost=0.00..175.71 rows=1 width=35) (actual time=0.087..1.285 rows=1 loops=1) + Output: id, ip, province, city + Filter: (ip2geo.ip >>= '43.236.136.57/22'::inet) + Rows Removed by Filter: 8616 + Buffers: shared hit=68 + Planning: + Buffers: shared hit=1 + Planning Time: 0.244 ms + Execution Time: 1.293 ms +(9 rows) + +postgres=# explain (analyze,verbose,timing,costs,buffers) select * FROM ip2geo where ip >>= getipaddr(); + QUERY PLAN +---------------------------------------------------------------------------------------------------------- + Seq Scan on public.ip2geo (cost=0.00..175.71 rows=1 width=35) (actual time=0.780..0.890 rows=1 loops=1) + Output: id, ip, province, city + Filter: (ip2geo.ip >>= '203.19.72.14/24'::inet) + Rows Removed by Filter: 8616 + Buffers: shared hit=68 + Planning: + Buffers: shared hit=1 + Planning Time: 0.199 ms + Execution Time: 0.899 ms +(9 rows) +``` + +5、使用 prepared statement, 随机地址段包含匹配查询 + +``` +alter function getipaddr(int) volatile; + +create or replace function dyn_pre() returns setof ip2geo as $$ +declare + v inet; +begin + v := getipaddr(); + return query execute format('execute p(%L)', v); + exception when others then + execute format('prepare p(inet) as select * from ip2geo where ip >>= $1'); + return query execute format('execute p(%L)', v); +end; +$$ language plpgsql strict; +``` + +``` +postgres=# select dyn_pre(); + dyn_pre +------------------------------------- + (43.227.192.0/22,浙江省杭州市,电信) +(1 row) + +postgres=# select dyn_pre(); + dyn_pre +------------------------------ + (103.25.64.0/22,上海市,电信) +(1 row) + +postgres=# select dyn_pre(); + dyn_pre +------------------------- + (45.119.232.0/22,中国,) +(1 row) + +postgres=# select dyn_pre(); + dyn_pre +-------------------------------------- + (103.205.252.0/22,江苏省宿迁市,联通) +(1 row) + +postgres=# select dyn_pre(); + dyn_pre +------------------------- + (103.87.4.0/22,北京市,) +(1 row) +``` + +6、压力测试 + +``` +vi test.sql +select dyn_pre(); + + +pgbench -M simple -n -r -P 1 -f ./test.sql -c 12 -j 12 -T 120 +``` + +除去获取随机 IP 的时间, 在 2018 款 macbook pro i5 的机器上, 实际约 8 万 qps. + +PolarDB for PostgreSQL 作为智能 DNS 的数据搜索引擎, 节省几十倍的成本, 同时提升终端用户就近访问的体验, 特别适合例如“社交、游戏、多媒体、云盘、多地办公等等全球化或者全国部署业务”. + +## 为什么 spgist 索引比 btree combine 2 字段索引范围搜索更高效? + +spgist 索引不管搜索什么范围, 搜索到目标数据基本上只需要扫描几个数据块. + +而使用 btree, 由于是 2 个字段符合搜索, 必然的会出现数据在驱动列大范围的匹配到后, 再通过第二个字段二次过滤的情况. 扫描的数据更多了, 效率立马就下降了. + +测试过程: + +1、创建 inet 转 int8 的函数 + +``` +create or replace function inet2int8 (inet) returns int8 as $$ + select (v[1]::bit(8)||v[2]::bit(8)||v[3]::bit(8)||v[4]::bit(8))::bit(32)::int8 from ( values ((regexp_split_to_array(host($1),'\.'))::int[]) ) t (v); +$$ language sql strict; + + +postgres=# select inet2int8('203.88.32.0'); + inet2int8 +------------ + 3411550208 +(1 row) +``` + +2、将 ip2geo 拆成 int8 存储 + +``` +create table ip2int8geo (id serial primary key, f int8,t int8, province text, city text); + +insert into ip2int8geo (f,t,province,city) select inet2int8(network(ip)), inet2int8(network(ip)) + 2^(32-masklen(ip)) - 1, province, city from ip2geo; +INSERT 0 8617 +``` + +3、创建 from to 两个字段的 combine 索引 + +``` +create index idx_2 on ip2int8geo (f,t); +``` + +4、创建获取随机 IP INT8 的函数用于测试 + +``` +create or replace function genrandomipint8(int) returns int8 as $$ + select f + ceil((t-f)*random()) from ip2int8geo where id=$1; +$$ language sql strict; + +-- 这个是驱动列靠前的值, 搜索较快 +postgres=# select genrandomipint8(10); + genrandomipint8 +----------------- + 16845351 +(1 row) + +-- 这个是驱动列靠后的值, 明显看出btree的大范围过滤 +postgres=# select genrandomipint8(8000); + genrandomipint8 +----------------- + 3411550659 +(1 row) +``` + +``` +postgres=# explain (analyze,verbose,timing,costs,buffers) select * from ip2int8geo where f <= 16845351 and t >= 16845351; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------- + Index Scan using idx_2 on public.ip2int8geo (cost=0.29..2.50 rows=1 width=44) (actual time=0.006..0.007 rows=1 loops=1) + Output: id, f, t, province, city + Index Cond: ((ip2int8geo.f <= 16845351) AND (ip2int8geo.t >= 16845351)) + Buffers: shared hit=3 + Planning: + Buffers: shared hit=3 + Planning Time: 0.114 ms + Execution Time: 0.018 ms +(8 rows) + + + +postgres=# explain (analyze,verbose,timing,costs,buffers) select * from ip2int8geo where f <= 3411550659 and t >= 3411550659; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------ + Index Scan using idx_2 on public.ip2int8geo (cost=0.29..167.31 rows=568 width=44) (actual time=0.438..0.440 rows=1 loops=1) + Output: id, f, t, province, city + Index Cond: ((ip2int8geo.f <= '3411550659'::bigint) AND (ip2int8geo.t >= '3411550659'::bigint)) + Buffers: shared hit=33 + Planning Time: 0.133 ms + Execution Time: 0.469 ms +(6 rows) + +postgres=# select * from ip2int8geo where f <= 3411550659 and t >= 3411550659; + id | f | t | province | city +------+------------+------------+--------------+--------------------- + 8000 | 3411550208 | 3411558399 | 广东省深圳市 | 天威有线宽带(关内)) +(1 row) +``` + +5、创建一个函数, 用于作 btree 索引的压力测试 + +``` +create or replace function test_getip2int8geo () returns setof ip2int8geo as $$ +declare + i int8; +begin + i := genrandomipint8( ceil(random()*8617)::int ); + return query select * from ip2int8geo where f <= i and t >= i; +end; +$$ language plpgsql strict; + + + +postgres=# select * from test_getip2int8geo(); + id | f | t | province | city +------+------------+------------+----------+-------- + 3798 | 1736744960 | 1736745983 | 台湾省 | 台北市 +(1 row) +Time: 1.058 ms + +postgres=# select * from test_getip2int8geo(); + id | f | t | province | city +------+-----------+-----------+----------+-------- + 1385 | 771539968 | 771540991 | 北京市 | 鹏博士 +(1 row) +Time: 0.615 ms +``` + +6、使用 spgist 索引, 数据不管靠前还是靠后, 扫描的数据块都差不多, 性能基本都一样. + +``` +postgres=# select * from ip2geo offset 7999 limit 1; + ip | province | city +----------------+--------------+--------------------- + 203.88.32.0/19 | 广东省深圳市 | 天威有线宽带(关内)) +(1 row) + + +postgres=# explain (analyze,verbose,timing,costs,buffers) select * FROM ip2geo where ip >>= '203.88.45.200/19' ; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------- + Index Scan using idx_1 on public.ip2geo (cost=0.15..4.60 rows=3 width=31) (actual time=0.031..0.031 rows=1 loops=1) + Output: ip, province, city + Index Cond: (ip2geo.ip >>= '203.88.45.200/19'::inet) + Buffers: shared hit=4 + Planning Time: 0.066 ms + Execution Time: 0.046 ms +(6 rows) + + +postgres=# select * FROM ip2geo where ip >>= '203.88.45.200/19' ; + ip | province | city +----------------+--------------+--------------------- + 203.88.32.0/19 | 广东省深圳市 | 天威有线宽带(关内)) +(1 row) +``` + +记录越多, btree combine 扫描过滤性越差, 与 spgist 索引的差距就会越大. 例如, 我们可以使用以下 100 万条测试 case 来证明这个结论. +扫描的数据块数量相差上百倍. + +``` +create sequence seq INCREMENT by 1000; + +create table test (f int, t int); + +insert into test select n , n+999 from (select nextval('seq') n from generate_series(1,1000000) ) t ; + +postgres=# select * from test limit 10; + f | t +------+------- + 1 | 1000 + 1001 | 2000 + 2001 | 3000 + 3001 | 4000 + 4001 | 5000 + 5001 | 6000 + 6001 | 7000 + 7001 | 8000 + 8001 | 9000 + 9001 | 10000 +(10 rows) + + +postgres=# select min(f), max(t) from test; + min | max +-----+------------ + 1 | 1000000000 +(1 row) + +create index idx_test on test (f,t); + +explain (analyze,verbose,timing,costs,buffers) select * from test where f <= 500000000 and t>=500000000; + +postgres=# explain (analyze,verbose,timing,costs,buffers) select * from test where f <= 500000000 and t>=500000000; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------- + Index Only Scan using idx_test on public.test (cost=0.42..9021.81 rows=250000 width=8) (actual time=16.605..16.608 rows=1 loops=1) + Output: f, t + Index Cond: ((test.f <= 500000000) AND (test.t >= 500000000)) + Heap Fetches: 0 + Buffers: shared hit=1370 + Planning Time: 0.098 ms + Execution Time: 16.629 ms +(7 rows) + + + +create index idx_test_1 on test using spgist (int4range(f,t+1)); +or +create index idx_test_2 on test using gist (int4range(f,t+1)); + +explain (analyze,verbose,timing,costs,buffers) select * from test where int4range(f,t+1) @> 500000000; + + +vi t1.sql +\set id random(1,1000000000) +select * from test where f <= :id and t >= :id; + +vi t2.sql +\set id random(1,1000000000) +select * from test where int4range(f,t+1) @> :id; + + +pgbench -M prepared -n -r -P 1 -f ./t1.sql -c 12 -j 12 -T 120 + +pgbench -M prepared -n -r -P 1 -f ./t2.sql -c 12 -j 12 -T 120 +``` + +## 参考 + +[《PostgreSQL 随机查询采样 - 既要真随机、又要高性能 - table sample 方法》](https://github.com/digoal/blog/blob/master/202105/20210527_01.md) + +[《如何获得 IP 地址对应的地理信息库, 实现智能 DNS 解析? 就近路由提升全球化部署业务的访问性能》](https://github.com/digoal/blog/blob/master/202211/20221124_09.md) + +[《PostgreSQL Oracle 兼容性之 - DBMS_SQL(存储过程动态 SQL 中使用绑定变量-DB 端 prepare statement)》](https://github.com/digoal/blog/blob/master/201803/20180323_02.md) + +[《PostgreSQL 黑科技 range 类型及 gist index 20x+ speedup than Mysql index combine query》](https://github.com/digoal/blog/blob/master/201206/20120607_01.md) + +[《PostgreSQL 黑科技 range 类型及 gist index 助力物联网(IoT)》](https://github.com/digoal/blog/blob/master/201205/20120517_01.md) + +[《PostgreSQL gist, spgist 索引的原理、差别、应用场景》](https://github.com/digoal/blog/blob/master/201906/20190604_03.md) + +[《PostgreSQL SP-GiST 索引原理》](https://github.com/digoal/blog/blob/master/202011/20201128_01.md) + +[《PostgreSQL 黑科技 - 空间聚集存储, 内窥 GIN, GiST, SP-GiST 索引》](https://github.com/digoal/blog/blob/master/201709/20170905_01.md) + +[《自动选择正确索引访问接口(btree,hash,gin,gist,sp-gist,brin,bitmap...)的方法》](https://github.com/digoal/blog/blob/master/201706/20170617_01.md) + +[《从难缠的模糊查询聊开 - PostgreSQL 独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》](https://github.com/digoal/blog/blob/master/201612/20161231_01.md) + +https://www.postgresql.org/docs/15/functions-net.html + +https://gis.stackexchange.com/questions/374091/when-to-use-gist-and-when-to-use-sp-gist-index From b4a1e3d10048ef4e0767aaf2ee896e82e48b04dd Mon Sep 17 00:00:00 2001 From: digoal zhou Date: Fri, 3 Feb 2023 11:25:55 +0800 Subject: [PATCH 2/4] [Docs]: add six practice documents. --- docs/.vuepress/configs/navbar/zh.ts | 11 +- docs/zh/imgs/madlib_1.png | Bin 0 -> 35523 bytes docs/zh/practice/age.md | 276 ++++++++++++++++++ docs/zh/practice/madlib.md | 385 ++++++++++++++++++++++++ docs/zh/practice/pg_jieba.md | 334 +++++++++++++++++++++ docs/zh/practice/pgcat.md | 368 +++++++++++++++++++++++ docs/zh/practice/rb.md | 438 ++++++++++++++++++++++++++++ docs/zh/practice/vector.md | 178 +++++++++++ 8 files changed, 1989 insertions(+), 1 deletion(-) create mode 100644 docs/zh/imgs/madlib_1.png create mode 100644 docs/zh/practice/age.md create mode 100644 docs/zh/practice/madlib.md create mode 100644 docs/zh/practice/pg_jieba.md create mode 100644 docs/zh/practice/pgcat.md create mode 100644 docs/zh/practice/rb.md create mode 100644 docs/zh/practice/vector.md diff --git a/docs/.vuepress/configs/navbar/zh.ts b/docs/.vuepress/configs/navbar/zh.ts index b5a6476a064..03660bcc1b9 100644 --- a/docs/.vuepress/configs/navbar/zh.ts +++ b/docs/.vuepress/configs/navbar/zh.ts @@ -122,7 +122,16 @@ export const zh: NavbarConfig = [ children: [ { text: "最佳实践", - children: ["/zh/practice/brin.html", "/zh/practice/spgist.html"], + children: [ + "/zh/practice/brin.html", + "/zh/practice/spgist.html", + "/zh/practice/vector.html", + "/zh/practice/age.html", + "/zh/practice/madlib.html", + "/zh/practice/pg_jieba.html", + "/zh/practice/rb.html", + "/zh/practice/pgcat.html", + ], }, ], }, diff --git a/docs/zh/imgs/madlib_1.png b/docs/zh/imgs/madlib_1.png new file mode 100644 index 0000000000000000000000000000000000000000..96bd12ad940aae89609015e2ab4a6f9acfc8c994 GIT binary patch literal 35523 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 kM*oeSOP?{Q + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 结合图式算法插件 age, 实现高效率的刑侦、社交、风控、族谱、推荐等业务图谱类关系数据搜索. + +## age 是什么 + +https://age.apache.org/age-manual/master/intro/overview.html + +Apache AGE is a PostgreSQL extension that provides graph database functionality. AGE is an acronym for A Graph Extension, and is inspired by Bitnine’s fork of PostgreSQL 10, AgensGraph, which is a multi-model database. The goal of the project is to create single storage that can handle both relational and graph model data so that users can use standard ANSI SQL along with openCypher, the Graph query language. + +age 是一个支持图式数据和搜索的多模数据库插件. + +## 将 age 整合到 PolarDB + +https://age.apache.org/age-manual/master/intro/setup.html +https://age.apache.org/download +https://github.com/apache/age +https://github.com/apache/age/tree/release/1.1.0 + +1、下载最新分支并安装 + +``` +git clone --branch release/1.1.0 --depth 1 https://github.com/apache/age + +cd age + +git branch +* release/1.1.0 + +which pg_config +~/tmp_basedir_polardb_pg_1100_bld/bin/pg_config +``` + +2、修复代码错误, 原因是 RTE 解析未兼容. + +``` +USE_PGXS=1 PG_CONFIG=~/tmp_basedir_polardb_pg_1100_bld/bin/pg_config make + +报错如下: +src/backend/parser/cypher_analyze.c: In function ‘convert_cypher_walker’: +src/backend/parser/cypher_analyze.c:178:17: error: ‘QTW_EXAMINE_RTES’ undeclared (first use in this function); did you mean ‘QTW_EXAMINE_RTES_AFTER’? + 178 | flags = QTW_EXAMINE_RTES | QTW_IGNORE_RT_SUBQUERIES | + | ^~~~~~~~~~~~~~~~ + | QTW_EXAMINE_RTES_AFTER +src/backend/parser/cypher_analyze.c:178:17: note: each undeclared identifier is reported only once for each function it appears in +make: *** [: src/backend/parser/cypher_analyze.o] Error 1 +``` + +原因如下: + +https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=18c0da88a5d9da566c3bfac444366b73bd0b57da + +``` +Split QTW_EXAMINE_RTES flag into QTW_EXAMINE_RTES_BEFORE/_AFTER. + +This change allows callers of query_tree_walker() to choose whether +to visit an RTE before or after visiting the contents of the RTE +(i.e., prefix or postfix tree order). All existing users of +QTW_EXAMINE_RTES want the QTW_EXAMINE_RTES_BEFORE behavior, but +an upcoming patch will want QTW_EXAMINE_RTES_AFTER, and it seems +like a potentially useful change on its own. + +Andreas Karlsson (extracted from CTE inlining patch) + +Discussion: https://postgr.es/m/8810.1542402910@sss.pgh.pa.us +``` + +https://git.postgresql.org/gitweb/?p=postgresql.git;a=blobdiff;f=src/include/nodes/nodeFuncs.h;h=a9f76bbb330a3a271363be317fd8caea3e09fe7d;hp=7739600db26e55628778d93d1e2a3833d90954d9;hb=18c0da88a5d9da566c3bfac444366b73bd0b57da;hpb=ff750ce2d82979e9588c629955e161a9379b05f3 + +``` +-#define QTW_EXAMINE_RTES 0x10 /* examine RTEs */ +-#define QTW_DONT_COPY_QUERY 0x20 /* do not copy top Query */ ++#define QTW_EXAMINE_RTES_BEFORE 0x10 /* examine RTE nodes before their ++ * contents */ ++#define QTW_EXAMINE_RTES_AFTER 0x20 /* examine RTE nodes after their ++ * contents */ ++#define QTW_DONT_COPY_QUERY 0x40 /* do not copy top Query */ +``` + +修复如下: + +``` +cd age +vi src/backend/parser/cypher_analyze.c + + + /* + * QTW_EXAMINE_RTES + * We convert RTE_FUNCTION (cypher()) to RTE_SUBQUERY (SELECT) + * in-place. + * + * QTW_IGNORE_RT_SUBQUERIES + * After the conversion, we don't need to traverse the resulting + * RTE_SUBQUERY. However, we need to traverse other RTE_SUBQUERYs. + * This is done manually by the RTE_SUBQUERY case above. + * + * QTW_IGNORE_JOINALIASES + * We are not interested in this. + */ + // flags = QTW_EXAMINE_RTES | QTW_IGNORE_RT_SUBQUERIES | + flags = QTW_EXAMINE_RTES_BEFORE | QTW_IGNORE_RT_SUBQUERIES | + QTW_IGNORE_JOINALIASES; +``` + +以上参考 12 分支: + +https://github.com/apache/age/blob/release/PG12/1.1.0/src/backend/parser/cypher_analyze.c + +``` + /* + * QTW_EXAMINE_RTES + * We convert RTE_FUNCTION (cypher()) to RTE_SUBQUERY (SELECT) + * in-place. + * + * QTW_IGNORE_RT_SUBQUERIES + * After the conversion, we don't need to traverse the resulting + * RTE_SUBQUERY. However, we need to traverse other RTE_SUBQUERYs. + * This is done manually by the RTE_SUBQUERY case above. + * + * QTW_IGNORE_JOINALIASES + * We are not interested in this. + */ + flags = QTW_EXAMINE_RTES_BEFORE | QTW_IGNORE_RT_SUBQUERIES | + QTW_IGNORE_JOINALIASES; +``` + +修复后继续安装即可 + +``` +USE_PGXS=1 PG_CONFIG=~/tmp_basedir_polardb_pg_1100_bld/bin/pg_config make +USE_PGXS=1 PG_CONFIG=~/tmp_basedir_polardb_pg_1100_bld/bin/pg_config make install +``` + +3、使用 age + +``` +postgres=# LOAD 'age'; +LOAD +postgres=# SET search_path = ag_catalog, "$user", public; +SET + +-- 以上也可以根据需要配置到数据库参数postgresql.conf 中, 即自动加载age: +-- #shared_preload_libraries = '' # (change requires restart) +-- #local_preload_libraries = '' +-- #session_preload_libraries = '' +-- #search_path = '"$user", public' # schema names + +postgres=# create extension age ; +CREATE EXTENSION +``` + +4、一些图式查询语法例子 + +``` +postgres=# SELECT * FROM ag_catalog.create_graph('graph_name'); +NOTICE: graph "graph_name" has been created + create_graph +-------------- + +(1 row) + +postgres=# SELECT * +postgres-# FROM cypher('graph_name', $$ +postgres$# RETURN 1 +postgres$# $$) AS (int_result agtype); + int_result +------------ + 1 +(1 row) + +postgres=# SELECT * +postgres-# FROM cypher('graph_name', $$ +postgres$# WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lst +postgres$# RETURN lst +postgres$# $$) AS (lst agtype); + lst +------------------------------------ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +(1 row) + +postgres=# SELECT * +postgres-# FROM cypher('graph_name', $$ +postgres$# WITH {listKey: [{inner: 'Map1'}, {inner: 'Map2'}], mapKey: {i: 0}} as m +postgres$# RETURN m.listKey[0] +postgres$# $$) AS (m agtype); + m +------------------- + {"inner": "Map1"} +(1 row) + +postgres=# SELECT * +postgres-# FROM cypher('graph_name', $$ +postgres$# WITH {id: 0, label: "label_name", properties: {i: 0}}::vertex as v +postgres$# RETURN v +postgres$# $$) AS (v agtype); + v +------------------------------------------------------------------ + {"id": 0, "label": "label_name", "properties": {"i": 0}}::vertex +(1 row) + +postgres=# SELECT * +postgres-# FROM cypher('graph_name', $$ +postgres$# WITH {id: 2, start_id: 0, end_id: 1, label: "label_name", properties: {i: 0}}::edge as e +postgres$# RETURN e +postgres$# $$) AS (e agtype); + e +-------------------------------------------------------------------------------------------- + {"id": 2, "label": "label_name", "end_id": 1, "start_id": 0, "properties": {"i": 0}}::edge +(1 row) + +postgres=# SELECT * +postgres-# FROM cypher('graph_name', $$ +postgres$# WITH [{id: 0, label: "label_name_1", properties: {i: 0}}::vertex, +postgres$# {id: 2, start_id: 0, end_id: 1, label: "edge_label", properties: {i: 0}}::edge, +postgres$# {id: 1, label: "label_name_2", properties: {}}::vertex +postgres$# ]::path as p +postgres$# RETURN p +postgres$# $$) AS (p agtype); + p + +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +---------------------------- + [{"id": 0, "label": "label_name_1", "properties": {"i": 0}}::vertex, {"id": 2, "label": "edge_label", "end_id": 1, "start_id": 0, "properties": {"i": 0}}::edge, {"id": 1, "label": "label_name_2", "prop +erties": {}}::vertex]::path +(1 row) + +postgres=# WITH graph_query as ( +postgres(# SELECT * +postgres(# FROM cypher('graph_name', $$ +postgres$# MATCH (n) +postgres$# RETURN n.name, n.age +postgres$# $$) as (name agtype, age agtype) +postgres(# ) +postgres-# SELECT * FROM graph_query; + name | age +------+----- +(0 rows) + +postgres=# SELECT * +postgres-# FROM cypher('graph_name', $$ +postgres$# MATCH (n) +postgres$# RETURN n.name +postgres$# ORDER BY n.name +postgres$# SKIP 3 +postgres$# $$) as (names agtype); + names +------- +(0 rows) +``` + +更多用法请参考 age 文档: + +https://age.apache.org/age-manual/master/intro/overview.html + +## 参考 + +- [《PostgreSQL 14 preview - SQL 标准增强, 递归(CTE)图式搜索增加广度优先、深度优先语法, 循环语法 - breadth- or depth-first search orders and detect cycles》](https://github.com/digoal/blog/blob/master/202102/20210201_03.md) +- [《PostgreSQL 家谱、族谱类应用实践 - 图式关系存储与搜索》](https://github.com/digoal/blog/blob/master/201804/20180408_03.md) +- [《PostgreSQL 图式搜索(graph search)实践 - 百亿级图谱,毫秒响应》](https://github.com/digoal/blog/blob/master/201801/20180102_04.md) +- [《PostgreSQL 实践 - 内容社区(如论坛)图式搜索应用》](https://github.com/digoal/blog/blob/master/201710/20171009_01.md) +- [《小微贷款、天使投资(风控助手)业务数据库设计(图式搜索\图谱分析) - 阿里云 RDS PostgreSQL, HybridDB for PostgreSQL 最佳实践》](https://github.com/digoal/blog/blob/master/201708/20170801_01.md) +- [《图数据库插件 AGE(apache a graph extension) 0.5 发布》](https://github.com/digoal/blog/blob/master/202108/20210828_03.md) +- [《PostgreSQL 图计算插件 AGE(a graph extension)发布 0.4 版本 - agensgraph extension 0.4》](https://github.com/digoal/blog/blob/master/202104/20210417_02.md) +- [《PostGIS 距离计算建议 - 投影 与 球 坐标系, geometry 与 geography 类型》](https://github.com/digoal/blog/blob/master/201710/20171018_02.md) diff --git a/docs/zh/practice/madlib.md b/docs/zh/practice/madlib.md new file mode 100644 index 00000000000..b53d45b653b --- /dev/null +++ b/docs/zh/practice/madlib.md @@ -0,0 +1,385 @@ +--- +author: digoal +date: 2023/02/03 +minute: 30 +--- + +# PolarDB 机器学习功能的使用 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 结合 madlib, 让 PolarDB 具备机器学习功能. + +madlib 库无疑是大而全的数据库机器学习库, + +- Deep Learning +- Graph +- Model Selection +- Sampling +- Statistics +- Supervised Learning +- Time Series Analysis +- Unsupervised Learning + +## 将 madlib 安装到 PolarDB, 让 PolarDB 具备机器学习功能 + +这个例子直接在 PolarDB 容器中部署 pgcat. + +PolarDB 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +进入 PolarDB 环境 + +``` +docker exec -it 67e1eed1b4b6 bash +``` + +下载 madlib rpm + +https://cwiki.apache.org/confluence/display/MADLIB/Installation+Guide + +``` +wget https://dist.apache.org/repos/dist/release/madlib/1.20.0/apache-madlib-1.20.0-CentOS7.rpm +``` + +安装 madlib + +``` +sudo rpm -ivh apache-madlib-1.20.0-CentOS7.rpm +``` + +加载 madlib 到 PolarDB 数据库对应 DB 中(非 extension 管理) + +``` +/usr/local/madlib/bin/madpack -s madlib -p postgres -c [user[/password]@][host][:port][/database] install + +or + +/usr/local/madlib/bin/madpack -s madlib -p postgres install +``` + +测试 madlib 安装正确性 + +``` +/usr/local/madlib/bin/madpack -s madlib -p postgres install-check +``` + +使用 madlib + +``` +[postgres@67e1eed1b4b6 ~]$ psql -h 127.0.0.1 +psql (11.9) +Type "help" for help. + +postgres=# set search_path =madlib, "$user", public; +SET + + +postgres=# \dT+ + List of data types + Schema | Name | Internal name | Size | Elements | Owner | Access privileges | Description +--------+-----------------------------------+-----------------------------------+-------+----------+----------+-------------------+------------- + madlib | args_and_value_double | args_and_value_double | tuple | | postgres | | + madlib | __arima_lm_result | __arima_lm_result | tuple | | postgres | | + madlib | __arima_lm_stat_result | __arima_lm_stat_result | tuple | | postgres | | + madlib | __arima_lm_sum_result | __arima_lm_sum_result | tuple | | postgres | | + madlib | assoc_rules_results | assoc_rules_results | tuple | | postgres | | + madlib | bytea8 | bytea8 | var | | postgres | | + madlib | _cat_levels_type | _cat_levels_type | tuple | | postgres | | + madlib | chi2_test_result | chi2_test_result | tuple | | postgres | | + madlib | closest_column_result | closest_column_result | tuple | | postgres | | + madlib | closest_columns_result | closest_columns_result | tuple | | postgres | | + madlib | __clustered_agg_result | __clustered_agg_result | tuple | | postgres | | + madlib | __clustered_lin_result | __clustered_lin_result | tuple | | postgres | | + madlib | __clustered_log_result | __clustered_log_result | tuple | | postgres | | + madlib | __clustered_mlog_result | __clustered_mlog_result | tuple | | postgres | | + madlib | complex | complex | tuple | | postgres | | + madlib | __coxph_a_b_result | __coxph_a_b_result | tuple | | postgres | | + madlib | __coxph_cl_var_result | __coxph_cl_var_result | tuple | | postgres | | + madlib | coxph_result | coxph_result | tuple | | postgres | | + madlib | coxph_step_result | coxph_step_result | tuple | | postgres | | + madlib | cox_prop_hazards_result | cox_prop_hazards_result | tuple | | postgres | | + madlib | __cox_resid_stat_result | __cox_resid_stat_result | tuple | | postgres | | + madlib | __dbscan_edge | __dbscan_edge | tuple | | postgres | | + madlib | __dbscan_losses | __dbscan_losses | tuple | | postgres | | + madlib | __dbscan_record | __dbscan_record | tuple | | postgres | | + madlib | dense_linear_solver_result | dense_linear_solver_result | tuple | | postgres | | + madlib | __elastic_net_result | __elastic_net_result | tuple | | postgres | | + madlib | _flattened_tree | _flattened_tree | tuple | | postgres | | + madlib | f_test_result | f_test_result | tuple | | postgres | | + madlib | __glm_result_type | __glm_result_type | tuple | | postgres | | + madlib | _grp_state_type | _grp_state_type | tuple | | postgres | | + madlib | heteroskedasticity_test_result | heteroskedasticity_test_result | tuple | | postgres | | + madlib | kmeans_result | kmeans_result | tuple | | postgres | | + madlib | kmeans_state | kmeans_state | tuple | | postgres | | + madlib | ks_test_result | ks_test_result | tuple | | postgres | | + madlib | lda_result | lda_result | tuple | | postgres | | + madlib | lincrf_result | lincrf_result | tuple | | postgres | | + madlib | linear_svm_result | linear_svm_result | tuple | | postgres | | + madlib | linregr_result | linregr_result | tuple | | postgres | | + madlib | lmf_result | lmf_result | tuple | | postgres | | + madlib | __logregr_result | __logregr_result | tuple | | postgres | | + madlib | marginal_logregr_result | marginal_logregr_result | tuple | | postgres | | + madlib | marginal_mlogregr_result | marginal_mlogregr_result | tuple | | postgres | | + madlib | margins_result | margins_result | tuple | | postgres | | + madlib | matrix_result | matrix_result | tuple | | postgres | | + madlib | __mlogregr_cat_coef | __mlogregr_cat_coef | tuple | | postgres | | + madlib | mlogregr_result | mlogregr_result | tuple | | postgres | | + madlib | mlogregr_summary_result | mlogregr_summary_result | tuple | | postgres | | + madlib | mlp_result | mlp_result | tuple | | postgres | | + madlib | __multinom_result_type | __multinom_result_type | tuple | | postgres | | + madlib | mw_test_result | mw_test_result | tuple | | postgres | | + madlib | one_way_anova_result | one_way_anova_result | tuple | | postgres | | + madlib | __ordinal_result_type | __ordinal_result_type | tuple | | postgres | | + madlib | path_match_result | path_match_result | tuple | | postgres | | + madlib | _pivotalr_lda_model | _pivotalr_lda_model | tuple | | postgres | | + madlib | _prune_result_type | _prune_result_type | tuple | | postgres | | + madlib | __rb_coxph_hs_result | __rb_coxph_hs_result | tuple | | postgres | | + madlib | __rb_coxph_result | __rb_coxph_result | tuple | | postgres | | + madlib | residual_norm_result | residual_norm_result | tuple | | postgres | | + madlib | robust_linregr_result | robust_linregr_result | tuple | | postgres | | + madlib | robust_logregr_result | robust_logregr_result | tuple | | postgres | | + madlib | robust_mlogregr_result | robust_mlogregr_result | tuple | | postgres | | + madlib | sparse_linear_solver_result | sparse_linear_solver_result | tuple | | postgres | | + madlib | summary_result | summary_result | tuple | | postgres | | + madlib | __svd_bidiagonal_matrix_result | __svd_bidiagonal_matrix_result | tuple | | postgres | | + madlib | __svd_lanczos_result | __svd_lanczos_result | tuple | | postgres | | + madlib | __svd_vec_mat_mult_result | __svd_vec_mat_mult_result | tuple | | postgres | | + madlib | svec | svec | var | | postgres | | + madlib | _tree_result_type | _tree_result_type | tuple | | postgres | | + madlib | t_test_result | t_test_result | tuple | | postgres | | + madlib | __utils_scales | __utils_scales | tuple | | postgres | | + madlib | wsr_test_result | wsr_test_result | tuple | | postgres | | + madlib | xgb_gridsearch_train_results_type | xgb_gridsearch_train_results_type | tuple | | postgres | | + public | vector | vector | var | | postgres | | +(73 rows) + +postgres=# \do+ + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Function | Description +--------+------+--------------------+--------------------+------------------+-------------------------------+------------- + madlib | %*% | double precision[] | double precision[] | double precision | madlib.svec_dot | + madlib | %*% | double precision[] | svec | double precision | madlib.svec_dot | + madlib | %*% | svec | double precision[] | double precision | madlib.svec_dot | + madlib | %*% | svec | svec | double precision | madlib.svec_dot | + madlib | * | double precision[] | double precision[] | svec | float8arr_mult_float8arr | + madlib | * | double precision[] | svec | svec | float8arr_mult_svec | + madlib | * | svec | double precision[] | svec | svec_mult_float8arr | + madlib | * | svec | svec | svec | svec_mult | + madlib | *|| | integer | svec | svec | svec_concat_replicate | + madlib | + | double precision[] | double precision[] | svec | float8arr_plus_float8arr | + madlib | + | double precision[] | svec | svec | float8arr_plus_svec | + madlib | + | svec | double precision[] | svec | svec_plus_float8arr | + madlib | + | svec | svec | svec | svec_plus | + madlib | - | double precision[] | double precision[] | svec | float8arr_minus_float8arr | + madlib | - | double precision[] | svec | svec | float8arr_minus_svec | + madlib | - | svec | double precision[] | svec | svec_minus_float8arr | + madlib | - | svec | svec | svec | svec_minus | + madlib | / | double precision[] | double precision[] | svec | float8arr_div_float8arr | + madlib | / | double precision[] | svec | svec | float8arr_div_svec | + madlib | / | svec | double precision[] | svec | svec_div_float8arr | + madlib | / | svec | svec | svec | svec_div | + madlib | < | svec | svec | boolean | svec_lt | + madlib | <= | svec | svec | boolean | svec_le | + madlib | <> | svec | svec | boolean | svec_ne | + madlib | = | svec | svec | boolean | svec_eq | + madlib | == | svec | svec | boolean | svec_eq | + madlib | > | svec | svec | boolean | svec_gt | + madlib | >= | svec | svec | boolean | svec_ge | + madlib | ^ | svec | svec | svec | svec_pow | + madlib | || | svec | svec | svec | svec_concat | + public | + | vector | vector | vector | vector_add | + public | - | vector | vector | vector | vector_sub | + public | < | vector | vector | boolean | vector_lt | + public | <#> | vector | vector | double precision | vector_negative_inner_product | + public | <-> | vector | vector | double precision | l2_distance | + public | <= | vector | vector | boolean | vector_le | + public | <=> | vector | vector | double precision | cosine_distance | + public | <> | vector | vector | boolean | vector_ne | + public | = | vector | vector | boolean | vector_eq | + public | > | vector | vector | boolean | vector_gt | + public | >= | vector | vector | boolean | vector_ge | +(41 rows) +``` + +## madlib 例子: 通过多元回归预测股价 + +内置的回归函数仅仅支持一元回归,也就是说只用了 1 个自变量。例如用昨天的收盘价预测今天的收盘价,但是元素太单一的话,除非自变量的影响因素非常大,否则容易不准。 + +多元回归考虑的因素更多,例如,昨天的成交量+收盘价+开盘价三组数据预测下一天的收盘价。 + +PolarDB for PostgreSQL 可以通过 MADlib 库来实现多元回归。 + +举例: + +p 元线性回归公式 + +``` +y1=b0+b1x11+b2x12+…+bpx1p+ε1 +y2=b0+b1x21+b2x22+…+bpx2p+ε2 +……………… +``` + +1\. 求截距,斜率。 + +2\. 预测 yn + +``` +yn=b0+b1xn1+b2xn2+…+bpxnp+εn +``` + +R 公式 + +``` +lm(y: 收盘价 ~ x1: 昨日收盘价 + x2: 昨日成交量, $DATA) +``` + +![多元回归](../imgs/madlib_1.png) + +用法举例: + +http://doc.madlib.net/latest/group__grp__linreg.html + +``` +Create an input data set. +CREATE TABLE houses (id INT, tax INT, bedroom INT, bath FLOAT, price INT, + size INT, lot INT); +COPY houses FROM STDIN WITH DELIMITER '|'; + 1 | 590 | 2 | 1 | 50000 | 770 | 22100 + 2 | 1050 | 3 | 2 | 85000 | 1410 | 12000 + 3 | 20 | 3 | 1 | 22500 | 1060 | 3500 + 4 | 870 | 2 | 2 | 90000 | 1300 | 17500 + 5 | 1320 | 3 | 2 | 133000 | 1500 | 30000 + 6 | 1350 | 2 | 1 | 90500 | 820 | 25700 + 7 | 2790 | 3 | 2.5 | 260000 | 2130 | 25000 + 8 | 680 | 2 | 1 | 142500 | 1170 | 22000 + 9 | 1840 | 3 | 2 | 160000 | 1500 | 19000 + 10 | 3680 | 4 | 2 | 240000 | 2790 | 20000 + 11 | 1660 | 3 | 1 | 87000 | 1030 | 17500 + 12 | 1620 | 3 | 2 | 118600 | 1250 | 20000 + 13 | 3100 | 3 | 2 | 140000 | 1760 | 38000 + 14 | 2070 | 2 | 3 | 148000 | 1550 | 14000 + 15 | 650 | 3 | 1.5 | 65000 | 1450 | 12000 +\. +``` + +预测模型 + +``` +linregr_train( source_table, + out_table, + dependent_varname, + independent_varname, + grouping_cols, -- 可选 + heteroskedasticity_option -- 可选 + ) + +Train a regression model. First, a single regression for all the data. +``` + +houses 中包含了历史数据,有自变量,有因变量。 + +其中 price 是因变量,tax, bath, size 是自变量。即三元回归。 + +houses_linregr 存放线性回归的统计值。包括相关性,R2,标准差,P 值等。 + +``` +SELECT madlib.linregr_train( 'houses', + 'houses_linregr', + 'price', + 'ARRAY[1, tax, bath, size]' + ); +``` + +当需要根据来源数据分组预测时,你可以加入分组字段。 + +``` +Generate three output models, one for each value of "bedroom". + +SELECT madlib.linregr_train( 'houses', + 'houses_linregr_bedroom', + 'price', + 'ARRAY[1, tax, bath, size]', + 'bedroom' + ); + +Examine the resulting models. + +-- Set extended display on for easier reading of output + +\x ON + +SELECT * FROM houses_linregr; +Result: +-[ RECORD 1 ]+--------------------------------------------------------------------------- +coef | {-12849.4168959872,28.9613922651765,10181.6290712648,50.516894915354} +r2 | 0.768577580597443 +std_err | {33453.0344331391,15.8992104963997,19437.7710925923,32.928023174087} +t_stats | {-0.38410317968819,1.82156166004184,0.523806408809133,1.53416118083605} +p_values | {0.708223134615422,0.0958005827189772,0.610804093526536,0.153235085548186} +condition_no | 9002.50457085737 +``` + +这个 r2 只有 0.76,相关性不太好,所以依旧需要用我之前提到的方法来获得好的相关性,即动态数据段计算。 + +``` +View the results grouped by bedroom. +SELECT * FROM houses_linregr_bedroom; +Result: +-[ RECORD 1 ]+-------------------------------------------------------------------------- +bedroom | 2 +coef | {-84242.0345406597,55.4430144648696,-78966.9753675319,225.611910021192} +r2 | 0.968809546465313 +std_err | {35018.9991665742,19.5731125320686,23036.8071292552,49.0448678148784} +t_stats | {-2.40560942761235,2.83261103077151,-3.42786111480046,4.60011251070697} +p_values | {0.250804617665239,0.21605133377602,0.180704400437373,0.136272031474122} +condition_no | 10086.1048721726 +-[ RECORD 2 ]+-------------------------------------------------------------------------- +bedroom | 4 +coef | {0.0112536020318378,41.4132554771633,0.0225072040636757,31.3975496688276} +r2 | 1 +std_err | {0,0,0,0} +t_stats | {Infinity,Infinity,Infinity,Infinity} +p_values | +condition_no | Infinity +-[ RECORD 3 ]+-------------------------------------------------------------------------- +bedroom | 3 +coef | {-88155.8292501601,27.1966436294429,41404.0293363612,62.637521075324} +r2 | 0.841699901311252 +std_err | {57867.9999702625,17.8272309154689,43643.1321511114,70.8506824863954} +t_stats | {-1.52339512849005,1.52556747362508,0.948695185143966,0.884077878676067} +p_values | {0.188161432894871,0.187636685729869,0.386340032374927,0.417132778705789} +condition_no | 11722.6225642147 + +Alternatively you can unnest the results for easier reading of output. +\x OFF +SELECT unnest(ARRAY['intercept','tax','bath','size']) as attribute, + unnest(coef) as coefficient, + unnest(std_err) as standard_error, + unnest(t_stats) as t_stat, + unnest(p_values) as pvalue +FROM houses_linregr; +Use the prediction function to evaluate residuals. +SELECT houses.*, + madlib.linregr_predict( ARRAY[1,tax,bath,size], + m.coef + ) as predict, + price - + madlib.linregr_predict( ARRAY[1,tax,bath,size], + m.coef + ) as residual +FROM houses, houses_linregr m; +``` + +在获得了好的 R2 之后,就可以拿这组数据预测下一组数据了。 + +## 参考 + +https://madlib.apache.org/docs/latest/index.html + +https://cwiki.apache.org/confluence/display/MADLIB/Installation+Guide diff --git a/docs/zh/practice/pg_jieba.md b/docs/zh/practice/pg_jieba.md new file mode 100644 index 00000000000..07872a2f8bb --- /dev/null +++ b/docs/zh/practice/pg_jieba.md @@ -0,0 +1,334 @@ +--- +author: digoal +date: 2023/02/03 +minute: 30 +--- + +# 高性能文本分词搜索 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 结合 jieba 分词, 实现高效率的中文分词以及中文分词搜索. + +测试环境为 macos+docker, polardb 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 部署 pg_jieba on PolarDB + +编译 pg_jieba + +``` +git clone --depth=1 https://github.com/jaiminpan/pg_jieba + +cd pg_jieba + +# initilized sub-project +git submodule update --init --recursive + +mkdir build +cd build + +cmake -DCMAKE_PREFIX_PATH=/home/postgres/tmp_basedir_polardb_pg_1100_bld .. + +make +make install +``` + +安装 pg_jieba 插件: + +``` +create extension pg_jieba ; +``` + +测试中文分词: + +``` +select * from to_tsquery('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); +select * from to_tsvector('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); +select * from ts_token_type('jieba'); +select * from ts_debug('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); + + +postgres=# create extension pg_jieba ; +CREATE EXTENSION +postgres=# select * from to_tsquery('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); + to_tsquery +---------------------------------------------------------------------------------------------------------------------------------- + '拖拉机' & '学院' & '手扶拖拉机' & '专业' & '不用' & '多久' & '会' & '升职' & '加薪' & '当上' & 'ceo' & '走上' & '人生' & '巅峰' +(1 row) + +postgres=# select * from to_tsvector('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); + to_tsvector +-------------------------------------------------------------------------------------------------------------------------------------------- + 'ceo':18 '不用':8 '专业':5 '人生':21 '会':13 '加薪':15 '升职':14 '多久':9 '学院':3 '巅峰':22 '当上':17 '手扶拖拉机':4 '拖拉机':2 '走上':20 +(1 row) + +postgres=# select * from ts_token_type('jieba'); + tokid | alias | description +-------+-------+----------------------------- + 1 | eng | letter + 2 | nz | other proper noun + 3 | n | noun + 4 | m | numeral + 5 | i | idiom + 6 | l | temporary idiom + 7 | d | adverb + 8 | s | space + 9 | t | time + 10 | mq | numeral-classifier compound + 11 | nr | person's name + 12 | j | abbreviate + 13 | a | adjective + 14 | r | pronoun + 15 | b | difference + 16 | f | direction noun + 17 | nrt | nrt + 18 | v | verb + 19 | z | z + 20 | ns | location + 21 | q | quantity + 22 | vn | vn + 23 | c | conjunction + 24 | nt | organization + 25 | u | auxiliary + 26 | o | onomatopoeia + 27 | zg | zg + 28 | nrfg | nrfg + 29 | df | df + 30 | p | prepositional + 31 | g | morpheme + 32 | y | modal verbs + 33 | ad | ad + 34 | vg | vg + 35 | ng | ng + 36 | x | unknown + 37 | ul | ul + 38 | k | k + 39 | ag | ag + 40 | dg | dg + 41 | rr | rr + 42 | rg | rg + 43 | an | an + 44 | vq | vq + 45 | e | exclamation + 46 | uv | uv + 47 | tg | tg + 48 | mg | mg + 49 | ud | ud + 50 | vi | vi + 51 | vd | vd + 52 | uj | uj + 53 | uz | uz + 54 | h | h + 55 | ug | ug + 56 | rz | rz +(56 rows) + +postgres=# select * from ts_debug('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); + alias | description | token | dictionaries | dictionary | lexemes +-------+---------------+------------+--------------+------------+-------------- + v | verb | 是 | {jieba_stem} | jieba_stem | {} + n | noun | 拖拉机 | {jieba_stem} | jieba_stem | {拖拉机} + n | noun | 学院 | {jieba_stem} | jieba_stem | {学院} + n | noun | 手扶拖拉机 | {jieba_stem} | jieba_stem | {手扶拖拉机} + n | noun | 专业 | {jieba_stem} | jieba_stem | {专业} + uj | uj | 的 | {jieba_stem} | jieba_stem | {} + x | unknown | 。 | {jieba_stem} | jieba_stem | {} + v | verb | 不用 | {jieba_stem} | jieba_stem | {不用} + m | numeral | 多久 | {jieba_stem} | jieba_stem | {多久} + x | unknown | , | {jieba_stem} | jieba_stem | {} + r | pronoun | 我 | {jieba_stem} | jieba_stem | {} + d | adverb | 就 | {jieba_stem} | jieba_stem | {} + v | verb | 会 | {jieba_stem} | jieba_stem | {会} + v | verb | 升职 | {jieba_stem} | jieba_stem | {升职} + nr | person's name | 加薪 | {jieba_stem} | jieba_stem | {加薪} + x | unknown | , | {jieba_stem} | jieba_stem | {} + t | time | 当上 | {jieba_stem} | jieba_stem | {当上} + eng | letter | CEO | {jieba_stem} | jieba_stem | {ceo} + x | unknown | , | {jieba_stem} | jieba_stem | {} + v | verb | 走上 | {jieba_stem} | jieba_stem | {走上} + n | noun | 人生 | {jieba_stem} | jieba_stem | {人生} + n | noun | 巅峰 | {jieba_stem} | jieba_stem | {巅峰} + x | unknown | 。 | {jieba_stem} | jieba_stem | {} +(23 rows) +``` + +## 分词索引测试 + +GIN + +生成 10 万条随机分词数据 + +``` +create or replace function gen_rand_ts(tslen int) returns tsvector as $$ + select array_to_tsvector(array_agg(substring(md5(random()::text),1,8))) from generate_series(1,$1); +$$ language sql strict; + +create unlogged table test (id int, vec tsvector); + +insert into test select generate_series(1,100000), gen_rand_ts(24); +``` + +创建索引 + +``` +create index on test using gin (vec); +``` + +查询测试: + +``` +postgres=# select * from test limit 10; + id | vec + +----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-------------------------------------------------------------------- + 1 | '0eed2ca6' '149ae774' '260d6cae' '2bde3230' '38ce089c' '3fdfb67c' '40bf233a' '41825567' '52de4ebb' '5708b49d' '63bdd9ea' '650f2dbf' '6d35d142' '7c711c0d' '7e4e028f' '913802bf' 'a8a14013' 'b6aa8ba4 +' 'd9f595e6' 'dc054607' 'dee1a2f7' 'e5b6d7e8' 'eacb6356' 'eee81aaf' + 2 | '00bf8fbc' '117b7b5c' '1e4c8295' '2d379ff7' '2e263dcb' '48967fe5' '4f20db40' '5f7aefcd' '616cbb8e' '81d4e152' '876b2318' '8c18f4c3' '8e732b6f' '94f6b13b' '9c53cb8e' 'aedca11c' 'b56c7ed4' 'c5008853 +' 'cc407ea8' 'd4f3d5a1' 'd63ca731' 'd87514ec' 'f9626af4' 'fa5b7458' + 3 | '0e3b6147' '13674c4d' '16463e9b' '32894aca' '3a15d964' '453c9a26' '54664d82' '5cb0e40d' '62c8ca30' '6d0ebc3a' '6ee0a517' '71ccfeb5' '7e75a9d5' '7f61f401' '87b5f2cb' '8f1c6274' '976dff7f' '9b7a6758 +' 'af9c624e' 'e5422d57' 'ed7bb9d4' 'edc039a2' 'efe1e5fa' 'f9db8132' + 4 | '118bf21c' '2087d303' '2579c220' '3733357a' '503b50ec' '56104ea2' '573b9ea9' '58a665af' '59250bad' '86abf8a9' '8a3b5a72' '8d8bb478' 'a16b8bd8' 'ac966a06' 'af4eabd8' 'b09ccbb5' 'b2d7aac4' 'b5134f1b +' 'b5228857' 'b6836add' 'bcafbce0' 'd1ca5a3a' 'e8588e37' 'f6ffe6b0' + 5 | '01876ad5' '07a8a579' '0a33ce9e' '0b5bbdd4' '10b00efe' '118fae91' '1c12acee' '2d74f4eb' '2d99481c' '41483d1c' '6864b85e' '7ba1937f' '8a6ccb01' '9c1ae58b' 'a251fd3d' 'a936eecd' 'b560d231' 'baa6927f +' 'd78f04c6' 'dabff656' 'e5d975c0' 'f0598071' 'f819b029' 'fb202c1a' + 6 | '1c6eea85' '23f37dd9' '28151030' '319fa87f' '447ddc9d' '45dcc30a' '5269c7c2' '77184ff9' '792793c2' '81f63a78' '87b67199' '8ddc346f' '9dbc6f02' 'a4130ee7' 'a4b21300' 'a8ae9afe' 'ae54596a' 'b01e580a +' 'c17caa99' 'c7784bd5' 'd27a19ce' 'df21c10f' 'e383a9d0' 'fde1f572' + 7 | '1c6e6d6e' '209c45cf' '23415a93' '292ba393' '3d64d313' '49cf134a' '4a1a1f0d' '4c7e54a7' '4e74180a' '5054e77e' '5882f01f' '59c25e04' '69eb2f87' '6f2ed6bb' '7c830771' '81c415f5' '975f413a' 'a3dc8375 +' 'a5a38d13' 'b1f83c28' 'bb62f740' 'c8bab4d1' 'd947163c' 'f3a81f80' + 8 | '0800c7b2' '0ffbe32e' '19f84945' '1c001bd3' '1f3f5826' '2e13cca1' '36ca5372' '3abc8149' '516878e9' '534357fc' '67cb7af9' '69a7849d' '8c134ad3' '8d87ed42' '96069ef5' '98bfcdbe' 'b4b0ffa1' 'bc61912a +' 'ddf1d8e6' 'e07722ea' 'e68ffbbf' 'f0751b01' 'f12cb4b9' 'fe0a7c4c' + 9 | '14588466' '1b16dfff' '25339aa7' '4874dc00' '4c6bb5bf' '510c8f7b' '59cbfb21' '70372c94' '7db5e3c2' '85f68385' '8b0e7746' '9596e2d0' '997ca4d3' '9f4df7dc' 'b1726109' 'c42ae6e4' 'dc759b2d' 'e378d2d5 +' 'e956bc2b' 'ea5c6ed2' 'f0e58f77' 'f24f74b1' 'fa6df884' 'fa8edffb' + 10 | '0188c7ac' '09a75236' '15fb2eee' '1dc80e6e' '2f543594' '3559f46a' '4369adcd' '477410ed' '5df678d0' '799bc453' '80ad7901' '81871ec1' '92faa899' '94c9cf0f' '971d699f' 'a002241a' 'a1636465' 'aee34bbb +' 'b08f2f0c' 'b697c161' 'b8f290b9' 'd0acf8b4' 'd3beb05b' 'f8ca2a66' +(10 rows) + +postgres=# explain select * from test where vec @@ '52de4ebb & 41825567'::tsquery ; + QUERY PLAN +---------------------------------------------------------------------------- + Bitmap Heap Scan on test (cost=36.02..43.91 rows=2 width=300) + Recheck Cond: (vec @@ '''52de4ebb'' & ''41825567'''::tsquery) + -> Bitmap Index Scan on test_vec_idx (cost=0.00..36.02 rows=2 width=0) + Index Cond: (vec @@ '''52de4ebb'' & ''41825567'''::tsquery) +(4 rows) + +postgres=# select * from test where vec @@ '52de4ebb & 41825567'::tsquery ; + id | vec + +----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-------------------------------------------------------------------- + 1 | '0eed2ca6' '149ae774' '260d6cae' '2bde3230' '38ce089c' '3fdfb67c' '40bf233a' '41825567' '52de4ebb' '5708b49d' '63bdd9ea' '650f2dbf' '6d35d142' '7c711c0d' '7e4e028f' '913802bf' 'a8a14013' 'b6aa8ba4 +' 'd9f595e6' 'dc054607' 'dee1a2f7' 'e5b6d7e8' 'eacb6356' 'eee81aaf' +(1 row) + +Time: 0.768 ms + + +postgres=# set enable_bitmapscan =off; +SET +Time: 0.887 ms +postgres=# explain select * from test where vec @@ '52de4ebb & 41825567'::tsquery ; + QUERY PLAN +----------------------------------------------------------- + Seq Scan on test (cost=0.00..5417.00 rows=2 width=300) + Filter: (vec @@ '''52de4ebb'' & ''41825567'''::tsquery) +(2 rows) + +Time: 1.136 ms + + +postgres=# select * from test where vec @@ '52de4ebb & 41825567'::tsquery ; + id | vec + +----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-------------------------------------------------------------------- + 1 | '0eed2ca6' '149ae774' '260d6cae' '2bde3230' '38ce089c' '3fdfb67c' '40bf233a' '41825567' '52de4ebb' '5708b49d' '63bdd9ea' '650f2dbf' '6d35d142' '7c711c0d' '7e4e028f' '913802bf' 'a8a14013' 'b6aa8ba4 +' 'd9f595e6' 'dc054607' 'dee1a2f7' 'e5b6d7e8' 'eacb6356' 'eee81aaf' +(1 row) + +Time: 51.815 ms +postgres=# select * from test where vec @@ '52de4ebb & 41825567'::tsquery ; + id | vec + +----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-------------------------------------------------------------------- + 1 | '0eed2ca6' '149ae774' '260d6cae' '2bde3230' '38ce089c' '3fdfb67c' '40bf233a' '41825567' '52de4ebb' '5708b49d' '63bdd9ea' '650f2dbf' '6d35d142' '7c711c0d' '7e4e028f' '913802bf' 'a8a14013' 'b6aa8ba4 +' 'd9f595e6' 'dc054607' 'dee1a2f7' 'e5b6d7e8' 'eacb6356' 'eee81aaf' +(1 row) + +Time: 49.055 ms +``` + +10 万条文本向量, 搜索命中 1 条. 性能参考: + +- GIN 索引 0.768 ms VS 全表扫描 49.055 ms + +## 参数配置 + +配置 PolarDB 所有计算节点, 重启 polardb 即可: + +``` +shared_preload_libraries = 'pg_jieba.so, ... 其他已预加载lib' # (change requires restart) + +# default_text_search_config='pg_catalog.simple' # default value + +default_text_search_config='jiebacfg' # uncomment to make 'jiebacfg' as default +``` + +``` +cd ~ +vi tmp_master_dir_polardb_pg_1100_bld/postgresql.conf +vi tmp_replica_dir_polardb_pg_1100_bld1/postgresql.conf +vi tmp_replica_dir_polardb_pg_1100_bld2/postgresql.conf +``` + +``` +重启polardb, 检查是否加载 + +postgres=# show shared_preload_libraries ; + shared_preload_libraries +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + pg_jieba.so,$libdir/polar_px,$libdir/polar_vfs,$libdir/polar_worker,$libdir/pg_stat_statements,$libdir/auth_delay,$libdir/auto_explain,$libdir/polar_monitor_preload,$libdir/polar_stat_sql +(1 row) + +select * from to_tsvector('是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); + +postgres=# select * from to_tsvector('是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); + to_tsvector +-------------------------------------------------------------------------------------------------------------------------------------------- + 'ceo':18 '不用':8 '专业':5 '人生':21 '会':13 '加薪':15 '升职':14 '多久':9 '学院':3 '巅峰':22 '当上':17 '手扶拖拉机':4 '拖拉机':2 '走上':20 +(1 row) +``` + +感谢志铭贡献的中文分词插件 pg_jieba. + +## 参考 + +https://github.com/jaiminpan/pg_jieba + +- [《PostgreSQL 应用开发解决方案最佳实践系列课程 - 1. 中文分词与模糊查询》](https://github.com/digoal/blog/blob/master/202105/20210502_01.md) +- [《PostgreSQL 一种高性能中文分词器 - friso》](https://github.com/digoal/blog/blob/master/202003/20200324_17.md) +- [《PostgreSQL 芬兰语 分词插件 - dict_voikko》](https://github.com/digoal/blog/blob/master/202003/20200324_06.md) +- [《PostgreSQL+MySQL 联合解决方案 - 第 12 课视频 - 全文检索、中文分词、模糊查询、相似文本查询》](https://github.com/digoal/blog/blob/master/202001/20200116_01.md) +- [《PostgreSQL 中英文混合分词特殊规则(中文单字、英文单词) - 中英分明》](https://github.com/digoal/blog/blob/master/201711/20171104_03.md) +- [《如何解决数据库分词的拼写纠正问题 - PostgreSQL Hunspell 字典 复数形容词动词等变异还原》](https://github.com/digoal/blog/blob/master/201612/20161206_01.md) +- [《聊一聊双十一背后的技术 - 毫秒分词算啥, 试试正则和相似度》](https://github.com/digoal/blog/blob/master/201611/20161118_01.md) +- [《聊一聊双十一背后的技术 - 分词和搜索》](https://github.com/digoal/blog/blob/master/201611/20161115_01.md) +- [《PostgreSQL 如何高效解决 按任意字段分词检索的问题 - case 1》](https://github.com/digoal/blog/blob/master/201607/20160725_05.md) +- [《如何加快 PostgreSQL 结巴分词 pg_jieba 加载速度》](https://github.com/digoal/blog/blob/master/201607/20160725_02.md) +- [《使用阿里云 PostgreSQL zhparser 中文分词时不可不知的几个参数》](https://github.com/digoal/blog/blob/master/201603/20160310_01.md) +- [《PostgreSQL Greenplum 结巴分词(by plpython)》](https://github.com/digoal/blog/blob/master/201508/20150824_01.md) +- [《NLPIR 分词准确率接近 98.23%》](https://github.com/digoal/blog/blob/master/201508/20150821_01.md) +- [《PostgreSQL 使用 nlpbamboo chinesecfg 中文分词》](https://github.com/digoal/blog/blob/master/201206/20120621_01.md) + +如果想了解 GIN 索引的原理请参考: + +- [《PostgreSQL GIN 索引实现原理》](https://github.com/digoal/blog/blob/master/201702/20170204_01.md) +- [《从难缠的模糊查询聊开 - PostgreSQL 独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》](https://github.com/digoal/blog/blob/master/201612/20161231_01.md) diff --git a/docs/zh/practice/pgcat.md b/docs/zh/practice/pgcat.md new file mode 100644 index 00000000000..3aca65cbbcc --- /dev/null +++ b/docs/zh/practice/pgcat.md @@ -0,0 +1,368 @@ +--- +author: digoal +date: 2023/02/03 +minute: 20 +--- + +# PolarDB 读写分离连接池配置 - pgcat + + + +## 背景 + +PolarDB 开源数据库支持云原生存算分离分布式架构, 一份存储支持多个计算节点, 目前是一写多读的架构. 内核已经很强大了, 怎么实现业务透明的读写分离, 还缺一个连接池, pgcat 是不错的选择. + +pgcat 支持连接池、sharding、读写负载均衡等, 更多功能请参考其官网 https://github.com/levkk/pgcat + +## pgcat 部署例子 + +这个例子直接在 PolarDB 容器中部署 pgcat. + +PolarDB 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +进入 PolarDB 环境 + +``` +docker exec -it 67e1eed1b4b6 bash +``` + +安装 rust + +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +source "$HOME/.cargo/env" +``` + +下载 pgcat + +``` +git clone --depth=1 https://github.com/levkk/pgcat +``` + +安装 pgcat + +``` +cd pgcat/ + + +cargo build --release +``` + +配置 pgcat, 修改为 PolarDB 数据库连接串 + +``` +vi pgcat.toml + +pgcat.toml +# +# PgCat config example. +# + +# +# General pooler settings +[general] +# What IP to run on, 0.0.0.0 means accessible from everywhere. +host = "0.0.0.0" + +# Port to run on, same as PgBouncer used in this example. +port = 6432 + +# Whether to enable prometheus exporter or not. +enable_prometheus_exporter = true + +# Port at which prometheus exporter listens on. +prometheus_exporter_port = 9930 + +# How long to wait before aborting a server connection (ms). +connect_timeout = 5000 + +# How much time to give the health check query to return with a result (ms). +healthcheck_timeout = 1000 + +# How long to keep connection available for immediate re-use, without running a healthcheck query on it +healthcheck_delay = 30000 + +# How much time to give clients during shutdown before forcibly killing client connections (ms). +shutdown_timeout = 60000 + +# For how long to ban a server if it fails a health check (seconds). +ban_time = 60 # seconds + +# If we should log client connections +log_client_connections = false + +# If we should log client disconnections +log_client_disconnections = false + +# Reload config automatically if it changes. +autoreload = false + +# TLS +# tls_certificate = "server.cert" +# tls_private_key = "server.key" + +# Credentials to access the virtual administrative database (pgbouncer or pgcat) +# Connecting to that database allows running commands like `SHOW POOLS`, `SHOW DATABASES`, etc.. +admin_username = "admin_user" +admin_password = "admin_pass" + +# pool +# configs are structured as pool. +# the pool_name is what clients use as database name when connecting +# For the example below a client can connect using "postgres://sharding_user:sharding_user@pgcat_host:pgcat_port/sharded_db" +[pools.sharded_db] +# Pool mode (see PgBouncer docs for more). +# session: one server connection per connected client +# transaction: one server connection per client transaction +pool_mode = "transaction" + +# If the client doesn't specify, route traffic to +# this role by default. +# +# any: round-robin between primary and replicas, +# replica: round-robin between replicas only without touching the primary, +# primary: all queries go to the primary unless otherwise specified. +default_role = "any" + +# Query parser. If enabled, we'll attempt to parse +# every incoming query to determine if it's a read or a write. +# If it's a read query, we'll direct it to a replica. Otherwise, if it's a write, +# we'll direct it to the primary. +query_parser_enabled = true + +# If the query parser is enabled and this setting is enabled, the primary will be part of the pool of databases used for +# load balancing of read queries. Otherwise, the primary will only be used for write +# queries. The primary can always be explicitly selected with our custom protocol. +primary_reads_enabled = true + +# So what if you wanted to implement a different hashing function, +# or you've already built one and you want this pooler to use it? +# +# Current options: +# +# pg_bigint_hash: PARTITION BY HASH (Postgres hashing function) +# sha1: A hashing function based on SHA1 +# +sharding_function = "pg_bigint_hash" + +# Automatically parse this from queries and route queries to the right shard! +automatic_sharding_key = "id" + +# Credentials for users that may connect to this cluster +[pools.sharded_db.users.0] +username = "sharding_user" +password = "sharding_user" +# Maximum number of server connections that can be established for this user +# The maximum number of connection from a single Pgcat process to any database in the cluster +# is the sum of pool_size across all users. +pool_size = 9 + +# Maximum query duration. Dangerous, but protects against DBs that died in a non-obvious way. +statement_timeout = 0 + +[pools.sharded_db.users.1] +username = "other_user" +password = "other_user" +pool_size = 21 +statement_timeout = 15000 + +# Shard 0 +[pools.sharded_db.shards.0] +# [ host, port, role ] +servers = [ + [ "127.0.0.1", 5432, "primary" ], + [ "localhost", 5433, "replica" ], + [ "localhost", 5434, "replica" ] +] +# Database name (e.g. "postgres") +database = "shard0" + +[pools.sharded_db.shards.1] +servers = [ + [ "127.0.0.1", 5432, "primary" ], + [ "localhost", 5433, "replica" ], + [ "localhost", 5434, "replica" ] +] +database = "shard1" + +[pools.sharded_db.shards.2] +servers = [ + [ "127.0.0.1", 5432, "primary" ], + [ "localhost", 5433, "replica" ], + [ "localhost", 5434, "replica" ] +] +database = "shard2" + + +[pools.simple_db] +pool_mode = "transaction" +default_role = "primary" +query_parser_enabled = true +primary_reads_enabled = true +sharding_function = "pg_bigint_hash" + +[pools.simple_db.users.0] +username = "simple_user" +password = "simple_user" +pool_size = 5 +statement_timeout = 0 + +[pools.simple_db.shards.0] +servers = [ + [ "127.0.0.1", 5432, "primary" ], + [ "localhost", 5433, "replica" ], + [ "localhost", 5434, "replica" ] +] +database = "some_db" +``` + +直接连接 polardb primary, 安装 pgcat 配置文件中设置的数据库、路由关系等. + +``` +psql -h 127.0.0.1 -f tests/sharding/query_routing_setup.sql +``` + +启动 pgcat + +``` +[postgres@67e1eed1b4b6 pgcat]$ RUST_LOG=info cargo run --release + Finished release [optimized] target(s) in 0.12s + Running `target/release/pgcat` +[2022-12-02T06:30:23.280411Z INFO pgcat] Welcome to PgCat! Meow. (Version 0.6.0-alpha1) +[2022-12-02T06:30:23.284527Z INFO pgcat] Running on 0.0.0.0:6432 +[2022-12-02T06:30:23.284572Z INFO pgcat::config] Ban time: 60s +[2022-12-02T06:30:23.284580Z INFO pgcat::config] Healthcheck timeout: 1000ms +[2022-12-02T06:30:23.284585Z INFO pgcat::config] Connection timeout: 5000ms +[2022-12-02T06:30:23.284590Z INFO pgcat::config] Log client connections: false +[2022-12-02T06:30:23.284594Z INFO pgcat::config] Log client disconnections: false +[2022-12-02T06:30:23.284599Z INFO pgcat::config] Shutdown timeout: 60000ms +[2022-12-02T06:30:23.284603Z INFO pgcat::config] Healthcheck delay: 30000ms +[2022-12-02T06:30:23.284608Z INFO pgcat::config] TLS support is disabled +[2022-12-02T06:30:23.284613Z INFO pgcat::config] [pool: sharded_db] Maximum user connections: 30 +[2022-12-02T06:30:23.284618Z INFO pgcat::config] [pool: sharded_db] Pool mode: Transaction +[2022-12-02T06:30:23.284624Z INFO pgcat::config] [pool: sharded_db] Connection timeout: 5000ms +[2022-12-02T06:30:23.284629Z INFO pgcat::config] [pool: sharded_db] Sharding function: pg_bigint_hash +[2022-12-02T06:30:23.284634Z INFO pgcat::config] [pool: sharded_db] Primary reads: true +[2022-12-02T06:30:23.284804Z INFO pgcat::config] [pool: sharded_db] Query router: true +[2022-12-02T06:30:23.284879Z INFO pgcat::config] [pool: sharded_db] Number of shards: 3 +[2022-12-02T06:30:23.285156Z INFO pgcat::config] [pool: sharded_db] Number of users: 2 +[2022-12-02T06:30:23.285171Z INFO pgcat::config] [pool: sharded_db][user: sharding_user] Pool size: 9 +[2022-12-02T06:30:23.285204Z INFO pgcat::config] [pool: sharded_db][user: sharding_user] Statement timeout: 0 +[2022-12-02T06:30:23.285345Z INFO pgcat::config] [pool: sharded_db][user: other_user] Pool size: 21 +[2022-12-02T06:30:23.285353Z INFO pgcat::config] [pool: sharded_db][user: other_user] Statement timeout: 15000 +[2022-12-02T06:30:23.285359Z INFO pgcat::config] [pool: simple_db] Maximum user connections: 5 +[2022-12-02T06:30:23.285364Z INFO pgcat::config] [pool: simple_db] Pool mode: Transaction +[2022-12-02T06:30:23.285369Z INFO pgcat::config] [pool: simple_db] Connection timeout: 5000ms +[2022-12-02T06:30:23.285374Z INFO pgcat::config] [pool: simple_db] Sharding function: pg_bigint_hash +[2022-12-02T06:30:23.285379Z INFO pgcat::config] [pool: simple_db] Primary reads: true +[2022-12-02T06:30:23.285383Z INFO pgcat::config] [pool: simple_db] Query router: true +[2022-12-02T06:30:23.285388Z INFO pgcat::config] [pool: simple_db] Number of shards: 1 +[2022-12-02T06:30:23.285392Z INFO pgcat::config] [pool: simple_db] Number of users: 1 +[2022-12-02T06:30:23.285397Z INFO pgcat::config] [pool: simple_db][user: simple_user] Pool size: 5 +[2022-12-02T06:30:23.285402Z INFO pgcat::config] [pool: simple_db][user: simple_user] Statement timeout: 0 +[2022-12-02T06:30:23.284609Z INFO pgcat::prometheus] Exposing prometheus metrics on http://0.0.0.0:9930/metrics. +[2022-12-02T06:30:23.285516Z INFO pgcat::pool] [pool: sharded_db][user: sharding_user] creating new pool +[2022-12-02T06:30:23.285883Z INFO pgcat::pool] Creating a new server connection Address { id: 0, host: "127.0.0.1", port: 5432, shard: 0, database: "shard0", role: Primary, replica_number: 0, address_index: 0, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.292142Z INFO pgcat::pool] Creating a new server connection Address { id: 1, host: "localhost", port: 5433, shard: 0, database: "shard0", role: Replica, replica_number: 0, address_index: 1, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.316973Z INFO pgcat::pool] Creating a new server connection Address { id: 2, host: "localhost", port: 5434, shard: 0, database: "shard0", role: Replica, replica_number: 1, address_index: 2, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.337804Z INFO pgcat::pool] Creating a new server connection Address { id: 3, host: "127.0.0.1", port: 5432, shard: 1, database: "shard1", role: Primary, replica_number: 0, address_index: 0, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.342340Z INFO pgcat::pool] Creating a new server connection Address { id: 4, host: "localhost", port: 5433, shard: 1, database: "shard1", role: Replica, replica_number: 0, address_index: 1, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.357989Z INFO pgcat::pool] Creating a new server connection Address { id: 5, host: "localhost", port: 5434, shard: 1, database: "shard1", role: Replica, replica_number: 1, address_index: 2, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.369388Z INFO pgcat::pool] Creating a new server connection Address { id: 6, host: "127.0.0.1", port: 5432, shard: 2, database: "shard2", role: Primary, replica_number: 0, address_index: 0, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.374910Z INFO pgcat::pool] Creating a new server connection Address { id: 7, host: "localhost", port: 5433, shard: 2, database: "shard2", role: Replica, replica_number: 0, address_index: 1, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.394223Z INFO pgcat::pool] Creating a new server connection Address { id: 8, host: "localhost", port: 5434, shard: 2, database: "shard2", role: Replica, replica_number: 1, address_index: 2, username: "sharding_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.405927Z INFO pgcat::pool] [pool: sharded_db][user: other_user] creating new pool +[2022-12-02T06:30:23.406268Z INFO pgcat::pool] Creating a new server connection Address { id: 9, host: "127.0.0.1", port: 5432, shard: 0, database: "shard0", role: Primary, replica_number: 0, address_index: 0, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.412445Z INFO pgcat::pool] Creating a new server connection Address { id: 10, host: "localhost", port: 5433, shard: 0, database: "shard0", role: Replica, replica_number: 0, address_index: 1, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.417602Z INFO pgcat::pool] Creating a new server connection Address { id: 11, host: "localhost", port: 5434, shard: 0, database: "shard0", role: Replica, replica_number: 1, address_index: 2, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.422787Z INFO pgcat::pool] Creating a new server connection Address { id: 12, host: "127.0.0.1", port: 5432, shard: 1, database: "shard1", role: Primary, replica_number: 0, address_index: 0, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.429330Z INFO pgcat::pool] Creating a new server connection Address { id: 13, host: "localhost", port: 5433, shard: 1, database: "shard1", role: Replica, replica_number: 0, address_index: 1, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.438427Z INFO pgcat::pool] Creating a new server connection Address { id: 14, host: "localhost", port: 5434, shard: 1, database: "shard1", role: Replica, replica_number: 1, address_index: 2, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.445699Z INFO pgcat::pool] Creating a new server connection Address { id: 15, host: "127.0.0.1", port: 5432, shard: 2, database: "shard2", role: Primary, replica_number: 0, address_index: 0, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.452223Z INFO pgcat::pool] Creating a new server connection Address { id: 16, host: "localhost", port: 5433, shard: 2, database: "shard2", role: Replica, replica_number: 0, address_index: 1, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.458212Z INFO pgcat::pool] Creating a new server connection Address { id: 17, host: "localhost", port: 5434, shard: 2, database: "shard2", role: Replica, replica_number: 1, address_index: 2, username: "other_user", pool_name: "sharded_db" } +[2022-12-02T06:30:23.464638Z INFO pgcat::pool] [pool: simple_db][user: simple_user] creating new pool +[2022-12-02T06:30:23.464848Z INFO pgcat::pool] Creating a new server connection Address { id: 18, host: "127.0.0.1", port: 5432, shard: 0, database: "some_db", role: Primary, replica_number: 0, address_index: 0, username: "simple_user", pool_name: "simple_db" } +[2022-12-02T06:30:23.472276Z INFO pgcat::pool] Creating a new server connection Address { id: 19, host: "localhost", port: 5433, shard: 0, database: "some_db", role: Replica, replica_number: 0, address_index: 1, username: "simple_user", pool_name: "simple_db" } +[2022-12-02T06:30:23.484090Z INFO pgcat::pool] Creating a new server connection Address { id: 20, host: "localhost", port: 5434, shard: 0, database: "some_db", role: Replica, replica_number: 1, address_index: 2, username: "simple_user", pool_name: "simple_db" } +[2022-12-02T06:30:23.496559Z INFO pgcat] Config autoreloader: false +[2022-12-02T06:30:23.496816Z INFO pgcat] Waiting for clients +[2022-12-02T06:30:23.496611Z INFO pgcat::stats] Events reporter started +``` + +新开一个容器 bash, 测试 pgcat 的连接 + +``` +docker exec -it 67e1eed1b4b6 bash + +[postgres@67e1eed1b4b6 pgcat]$ export PGPASSWORD=simple_user +[postgres@67e1eed1b4b6 pgcat]$ psql -h 127.0.0.1 -p 6432 -U simple_user simple_db +psql (11.9) +Type "help" for help. + +simple_db=> \q + +pgbench -i -s 10 -h 127.0.0.1 -p 6432 -U simple_user simple_db + +pgbench -M prepared -n -r -P 1 -c 4 -j 4 -T 120 -S -h 127.0.0.1 -p 6432 -U simple_user simple_db + +pgbench -M extended -n -r -P 1 -c 12 -j 12 -T 120 -S -h 127.0.0.1 -p 6432 -U simple_user simple_db +progress: 1.0 s, 15276.8 tps, lat 0.782 ms stddev 0.388 +progress: 2.0 s, 14739.9 tps, lat 0.814 ms stddev 0.417 +progress: 3.0 s, 13652.3 tps, lat 0.879 ms stddev 0.483 +progress: 4.0 s, 13377.7 tps, lat 0.897 ms stddev 0.483 + +pgbench -M extended -n -r -P 1 -c 120 -j 1200 -T 1200 -S -h 127.0.0.1 -p 6432 -U simple_user simple_db +progress: 1.0 s, 14764.8 tps, lat 7.635 ms stddev 4.248 +progress: 2.0 s, 15562.4 tps, lat 7.704 ms stddev 4.211 +progress: 3.0 s, 15672.1 tps, lat 7.646 ms stddev 5.242 +progress: 4.0 s, 16104.7 tps, lat 7.448 ms stddev 5.672 +progress: 5.0 s, 15078.6 tps, lat 7.965 ms stddev 6.022 +``` + +读写分离测试: + +``` +psql -h 127.0.0.1 -p 6432 -U simple_user simple_db +psql (11.9) +Type "help" for help. + +simple_db=> select pg_is_in_recovery(); + pg_is_in_recovery +------------------- + t +(1 row) + +simple_db=> select pg_is_in_recovery(); + pg_is_in_recovery +------------------- + t +(1 row) + +simple_db=> begin; +BEGIN +simple_db=> select pg_is_in_recovery(); + pg_is_in_recovery +------------------- + f +(1 row) + +simple_db=> select pg_is_in_recovery(); + pg_is_in_recovery +------------------- + f +(1 row) +``` + +## 参考 + +[《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +https://github.com/levkk/pgcat + +[《PostgreSQL sharding+pool+读写分离 中间件 - PGcat》](https://github.com/digoal/blog/blob/master/202211/20221116_01.md) + +https://www.rust-lang.org/tools/install diff --git a/docs/zh/practice/rb.md b/docs/zh/practice/rb.md new file mode 100644 index 00000000000..28e500237c8 --- /dev/null +++ b/docs/zh/practice/rb.md @@ -0,0 +1,438 @@ +--- +author: digoal +date: 2023/02/03 +minute: 30 +--- + +# 通过 roaringbitmap 实现用户画像等基于标签的数据圈选操作 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版通过 roaringbitmap 支持用户画像等标签操作场景。. + +测试环境为 macos+docker, polardb 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + + +## roaringbitmap for PolarDB + +roaringbitmap 是 roaring bitmap 库在 PG 数据库中的一种类型实现,支持 roaring bitmap 的存取、集合操作,聚合等运算。 + +通常被用在用户画像等标签操作场景。 + +例如, + +- 包含某些标签的人群集合, +- 某些人的共同点、不同点, +- 某人是否包含某标签。 +- 某标签中是否包含某人。 +- 同时包含某些标签的有多少人 +- 某个标签有多少人 + +1、部署 + +``` +git clone --depth 1 https://github.com/ChenHuajun/pg_roaringbitmap + +cd pg_roaringbitmap/ +USE_PGXS=1 make +USE_PGXS=1 make install +``` + +2、加载插件成功 + +``` +[postgres@67e1eed1b4b6 pg_roaringbitmap]$ psql -h 127.0.0.1 +psql (11.9) +Type "help" for help. + +postgres=# create extension roaringbitmap ; +CREATE EXTENSION +postgres=# \q +``` + +3、插件自测 + +``` +export PGHOST=127.0.0.1 + +[postgres@67e1eed1b4b6 pg_roaringbitmap]$ psql +psql (11.9) +Type "help" for help. + +postgres=# \q + + + +[postgres@67e1eed1b4b6 pg_roaringbitmap]$ USE_PGXS=1 make installcheck +/home/postgres/tmp_basedir_polardb_pg_1100_bld/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress --inputdir=./ --bindir='/home/postgres/tmp_basedir_polardb_pg_1100_bld/bin' --dbname=contrib_regression roaringbitmap +(using postmaster on 127.0.0.1, default port) +============== dropping database "contrib_regression" ============== +DROP DATABASE +============== creating database "contrib_regression" ============== +CREATE DATABASE +ALTER DATABASE +============== running regression test queries ============== +test roaringbitmap ... ok + + +========================================================== + All 1 tests passed. + + POLARDB: + All 1 tests, 0 tests in ignore, 0 tests in polar ignore. +========================================================== +``` + +## 例子: 存取、集合操作、聚合运算等例子 + +### 类型 + +roaringbitmap + +### 操作符 + +与、或、疑惑、加、减、包含、相等、不相等、相交等 + +### 函数 + +加、减、包含、提取、剪切、转换等 + +### 聚合 + +与、或、异或、集合数量 + +### 限制 + +一个 roaring bitmap 可以存储 40 亿个元素,不能超出 int32 范畴。 + +范围超过 40 亿怎么办,offset 分段。例如使用多个字段表示。 + +``` +create table tags(uid int, tag_off0 roaringbitmap, tag_off1 roaringbitmap) +``` + +## 设计举例 + +### 正向关系 + +user, tags + +``` +create table t1 (userid int, tags roaringbitmap); +``` + +### 反向 + +tag, users + +``` +create table t2 (tag int, uids roaringbitmap); +``` + +### 操作 + +1、roaringbitmap 类型输出形态 + +``` +postgres=# show roaringbitmap.output_format ; + roaringbitmap.output_format +----------------------------- + bytea +(1 row) + +postgres=# set roaringbitmap.output_format ='a'; +psql: ERROR: 22023: invalid value for parameter "roaringbitmap.output_format": "a" +HINT: Available values: array, bytea. +LOCATION: parse_and_validate_value, guc.c:6682 + +postgres=# set roaringbitmap.output_format ='array'; +SET +``` + +2、build roaringbitmap + +``` +postgres=# select roaringbitmap('{1,2,-1,-10000}'); + roaringbitmap +----------------- + {1,2,-10000,-1} +(1 row) +``` + +3、增 + +``` +postgres=# select roaringbitmap('{1,2,-1,-10000}') | 123; + ?column? +--------------------- + {1,2,123,-10000,-1} +(1 row) + +或 + +postgres=# select rb_add(roaringbitmap('{1,2,-1,-10000}') , 123); + rb_add +--------------------- + {1,2,123,-10000,-1} +(1 row) +``` + +4、删 + +``` +postgres=# select roaringbitmap('{1,2,3}') - 3; + ?column? +---------- + {1,2} +(1 row) + + +或 + + +postgres=# select rb_remove(roaringbitmap('{1,2,3}'),1); + rb_remove +----------- + {2,3} +(1 row) + +postgres=# select rb_remove(roaringbitmap('{1,2,3}'),4); + rb_remove +----------- + {1,2,3} +(1 row) + +``` + +5、判断(包含,相交,相等,不相等) + +``` +postgres=# select roaringbitmap('{1,2,3,4,5}') @> 3; + ?column? +---------- + t +(1 row) + +postgres=# select roaringbitmap('{1,2,3,4,5}') @> 30; + ?column? +---------- + f +(1 row) + +postgres=# select roaringbitmap('{1,2,3,4,5}') @> roaringbitmap('{1,2,3}'); + ?column? +---------- + t +(1 row) + +postgres=# select roaringbitmap('{1,2,3,4,5}') @> roaringbitmap('{1,2,3,9}'); + ?column? +---------- + f +(1 row) + +postgres=# select roaringbitmap('{1,2,3,4,5}') && roaringbitmap('{1,2,3,9}'); + ?column? +---------- + t +(1 row) + +postgres=# select roaringbitmap('{1,2,3,4,5}') = roaringbitmap('{1,2,3,9}'); + ?column? +---------- + f +(1 row) + +postgres=# select roaringbitmap('{1,2,3,4,5}') = roaringbitmap('{1,5,4,3,2,1,1}'); + ?column? +---------- + t +(1 row) + +postgres=# select roaringbitmap('{1,2,3,4,5}') <> roaringbitmap('{1}'); + ?column? +---------- + t +(1 row) +``` + +6、取值 + +``` +postgres=# SELECT rb_iterate('{1,2,3}'::roaringbitmap); + rb_iterate +------------ + 1 + 2 + 3 +(3 rows) + +postgres=# SELECT unnest(rb_to_array('{1,2,3}'::roaringbitmap)); + unnest +-------- + 1 + 2 + 3 +(3 rows) + +postgres=# SELECT unnest(rb_to_array('{1,2,3,3,3}'::roaringbitmap)); + unnest +-------- + 1 + 2 + 3 +(3 rows) +``` + +值的索引(从 0 开始 offset)。顺序: + +``` +0, 1, ..., 2147483647, -2147483648, -2147483647,..., -1 +``` + +返回有序值存放的 index + +``` +Return the 0-based index of element in this roaringbitmap, or -1 if do not exsits + +postgres=# select rb_index('{-1,1,2,3}',3); + rb_index +---------- + 2 +(1 row) + +postgres=# select rb_index('{100,-1,1,2,3}',3); + rb_index +---------- + 2 +(1 row) + +postgres=# select rb_index('{0,100,-1,1,2,3}',3); + rb_index +---------- + 3 +(1 row) + +postgres=# select rb_index('{0,100,-1,1,2,3}',-1); + rb_index +---------- + 5 +(1 row) + +postgres=# select rb_index('{0,100,-1,1,2,3,-2}',-1); + rb_index +---------- + 6 +(1 row) +``` + +按索引取值(从 0 开始 offset) + +顺序: + +``` +0, 1, ..., 2147483647, -2147483648, -2147483647,..., -1 +``` + +``` +Return subset [bitset_offset,bitset_offset+bitset_limit) of bitmap between range [range_start,range_end) + +从index 5开始取数,取2个。 +postgres=# select rb_select('{-1,-999,100,1,2,3,102,5,6,7,8,9}',2,5); + rb_select +----------- + {7,8} +(1 row) + +从index 2开始取数,取5个。 +postgres=# select rb_select('{-1,-999,100,1,2,3,102,5,6,7,8,9}',5,2); + rb_select +------------- + {3,5,6,7,8} +(1 row) +``` + +### 聚合计算 + +1、多个 rb 共同点集合 + +``` +select rb_and_agg(bitmap) + from (values (roaringbitmap('{1,2,3}')), + (roaringbitmap('{2,3,4}')) + ) t(bitmap) +``` + +2、多个 rb 不同点集合 + +``` +select rb_xor_agg(bitmap) + from (values (roaringbitmap('{1,2,3}')), + (roaringbitmap('{2,3,4}')) + ) t(bitmap) +``` + +3、多个 rb 集合点 + +``` +select rb_or_agg(bitmap) + from (values (roaringbitmap('{1,2,3}')), + (roaringbitmap('{2,3,4}')) + ) t(bitmap) +``` + +4、两个 rb 的差值 + +``` +roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}') +``` + +5、集合有多大 + +``` +select rb_or_cardinality_agg(bitmap) + from (values (roaringbitmap('{1,2,3}')), + (roaringbitmap('{2,3,4}')) + ) t(bitmap) +``` + +6、有多少共同点 + +``` +select rb_and_cardinality_agg(bitmap) + from (values (roaringbitmap('{1,2,3}')), + (roaringbitmap('{2,3,4}')) + ) t(bitmap) +``` + +7、有多少不同点 + +``` +select rb_xor_cardinality_agg(bitmap) + from (values (roaringbitmap('{1,2,3}')), + (roaringbitmap('{2,3,4}')) + ) t(bitmap) +``` + +8、将多个值聚合为 roaringbitmap + +``` +select rb_build_agg(id) + from (values (1),(2),(3)) t(id) +``` + +## 参考 + +https://github.com/ChenHuajun/pg_roaringbitmap + +- [《PostgreSQL roaringbitmap UID 溢出(超出 int4(32 字节))时的处理方法 - offset》](https://github.com/digoal/blog/blob/master/202001/20200110_03.md) +- [《画像系统标准化设计 - PostgreSQL roaringbitmap, varbitx , 正向关系, 反向关系, 圈选, 相似扩选(向量相似扩选)》](https://github.com/digoal/blog/blob/master/201911/20191128_02.md) +- [《PostgreSQL pg_roaringbitmap - 用户画像、标签、高效检索》](https://github.com/digoal/blog/blob/master/201911/20191118_01.md) +- [《Greenplum roaring bitmap 与业务场景 (类阿里云 RDS PG varbitx, 应用于海量用户 实时画像和圈选、透视)》](https://github.com/digoal/blog/blob/master/201801/20180127_01.md) +- [《PostgreSQL (varbit, roaring bitmap) VS pilosa(bitmap 库)》](https://github.com/digoal/blog/blob/master/201706/20170612_01.md) diff --git a/docs/zh/practice/vector.md b/docs/zh/practice/vector.md new file mode 100644 index 00000000000..0aabc0a0d2f --- /dev/null +++ b/docs/zh/practice/vector.md @@ -0,0 +1,178 @@ +--- +author: digoal +date: 2023/02/03 +minute: 15 +--- + +# 向量搜索实践,在不确定世界寻找确定答案 - 例如图像相似、特征相似 + + + +## 背景 + +世界是确定的吗? 不 + +就好像我们拍照, 同一个相机, 同一个地点, 同一个时间连拍几张, 结果都不一样. 更不用说时间地点不一样了. + +真正确定的数据并不多, 世界充满的是不确定的数据. + +例如人脸识别, 存在数据库中的数据可能是曾经的照片, 但是你去比对人脸时是实时的, 角度、化妆、发型都可能不一样. + +未来的数据库一定要解决一个问题, 如何在不确定的世界寻找确定的答案? + +PolarDB 早几年就发布了 pase 插件, 解决高性能图像识别的问题, 通过将非结构化数据根据特征提取成为一串向量, 然后根据向量进行距离计算, 得到最相似的向量, 从而解决不确定数据的确定性搜索. + +后来开源社区也发了一个插件 vector, 知识支持的算法只有 ivfflat. + +本文将介绍如何在开源 polardb 中安装和使用 vector 插件, 解决向量数据相似搜索的问题. + +## vector on PolarDB + +1、启动并进入 polardb 实例 + +``` +IT-C02YW2EFLVDL:~ digoal$ docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +67e1eed1b4b6 polardb/polardb_pg_local_instance:htap "/bin/sh -c '~/tmp_b…" 2 months ago Exited (137) 10 minutes ago polardb_pg_htap + +IT-C02YW2EFLVDL:~ digoal$ docker start 67e1eed1b4b6 +67e1eed1b4b6 + +IT-C02YW2EFLVDL:~ digoal$ docker exec -it 67e1eed1b4b6 bash +[postgres@67e1eed1b4b6 ~]$ which git +/usr/bin/git +``` + +2、下载 vector 插件 + +``` +[postgres@67e1eed1b4b6 ~]$ git clone --branch v0.3.2 --depth 1 https://github.com/pgvector/pgvector.git +Cloning into 'pgvector'... +remote: Enumerating objects: 80, done. +remote: Counting objects: 100% (80/80), done. +remote: Compressing objects: 100% (62/62), done. +remote: Total 80 (delta 33), reused 29 (delta 15), pack-reused 0 +Unpacking objects: 100% (80/80), done. +Note: checking out 'a7f712b5a4724cfe55e2793dd1a4b7d48257fa1e'. + +You are in 'detached HEAD' state. You can look around, make experimental +changes and commit them, and you can discard any commits you make in this +state without impacting any branches by performing another checkout. + +If you want to create a new branch to retain commits you create, you may +do so (now or later) by using -b with the checkout command again. Example: + + git checkout -b new_branch_name +``` + +3、安装 vector 插件 + +``` +[postgres@67e1eed1b4b6 ~]$ cd pgvector/ +[postgres@67e1eed1b4b6 pgvector]$ ll +total 48 +-rw-rw-r-- 1 postgres postgres 1877 Dec 1 09:34 CHANGELOG.md +-rw-rw-r-- 1 postgres postgres 482 Dec 1 09:34 Dockerfile +-rw-rw-r-- 1 postgres postgres 1104 Dec 1 09:34 LICENSE +-rw-rw-r-- 1 postgres postgres 1760 Dec 1 09:34 Makefile +-rw-rw-r-- 1 postgres postgres 1105 Dec 1 09:34 META.json +-rw-rw-r-- 1 postgres postgres 9495 Dec 1 09:34 README.md +drwxrwxr-x 2 postgres postgres 4096 Dec 1 09:34 sql +drwxrwxr-x 2 postgres postgres 4096 Dec 1 09:34 src +drwxrwxr-x 6 postgres postgres 4096 Dec 1 09:34 test +-rw-rw-r-- 1 postgres postgres 135 Dec 1 09:34 vector.control + + +[postgres@67e1eed1b4b6 pgvector]$ which pg_config +~/tmp_basedir_polardb_pg_1100_bld/bin/pg_config + +[postgres@67e1eed1b4b6 pgvector]$ USE_PGXS=1 make +[postgres@67e1eed1b4b6 pgvector]$ USE_PGXS=1 make install +``` + +4、加载 vector 插件 + +``` +[postgres@67e1eed1b4b6 pgvector]$ psql -h 127.0.0.1 +psql (11.9) +Type "help" for help. + +postgres=# create extension vector ; +CREATE EXTENSION +``` + +5、测试向量数据搜索、以及索引加速搜索. + +``` +postgres=# CREATE TABLE items (embedding vector(3)); +CREATE TABLE +postgres=# INSERT INTO items VALUES ('[1,2,3]'), ('[4,5,6]'); +INSERT 0 2 +postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1; + embedding +----------- + [1,2,3] +(1 row) + +postgres=# CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100); +CREATE INDEX + +postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1; + embedding +----------- + [1,2,3] +(1 row) + +postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1; + QUERY PLAN +------------------------------------------------------------------ + Limit (cost=1.03..1.04 rows=1 width=40) + -> Sort (cost=1.03..1.04 rows=2 width=40) + Sort Key: ((embedding <-> '[3,1,2]'::vector)) + -> Seq Scan on items (cost=0.00..1.02 rows=2 width=40) +(4 rows) + +postgres=# set enable_seqscan=off; +SET +postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1; + QUERY PLAN +---------------------------------------------------------------------------------------- + Limit (cost=4.08..6.09 rows=1 width=40) + -> Index Scan using items_embedding_idx on items (cost=4.08..8.11 rows=2 width=40) + Order By: (embedding <-> '[3,1,2]'::vector) +(3 rows) + +postgres=# SET ivfflat.probes = 10; +SET +postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1; + embedding +----------- + [1,2,3] +(1 row) + +postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1; + QUERY PLAN +------------------------------------------------------------------------------------------ + Limit (cost=40.80..42.81 rows=1 width=40) + -> Index Scan using items_embedding_idx on items (cost=40.80..44.83 rows=2 width=40) + Order By: (embedding <-> '[3,1,2]'::vector) +(3 rows) +``` + +## 参考 + +[《PostgreSQL + FDW + vector 插件加速向量检索 - 在不确定世界寻找确定答案 (例如图像相似)》](https://github.com/digoal/blog/blob/master/202203/20220302_01.md) + +[《PostgreSQL 开源 高维向量相似搜索插件 vector - 关联阿里云 rds pg pase, cube, 人脸识别》](https://github.com/digoal/blog/blob/master/202105/20210514_03.md) + +[《PostgreSQL 在资源搜索中的设计 - pase, smlar, pg_trgm - 标签+权重相似排序 - 标签的命中率排序》](https://github.com/digoal/blog/blob/master/202009/20200930_01.md) + +[《社交、电商、游戏等 推荐系统 (相似推荐) - 阿里云 pase smlar 索引方案对比》](https://github.com/digoal/blog/blob/master/202004/20200421_01.md) + +[《PostgreSQL 向量相似推荐设计 - pase》](https://github.com/digoal/blog/blob/master/202004/20200424_01.md) + +[《PostgreSQL 阿里云 rds pg 发布高维向量索引,支持图像识别、人脸识别 - pase 插件》](https://github.com/digoal/blog/blob/master/201912/20191219_02.md) + +[《如何用 PolarDB 证明巴菲特的投资理念》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +https://github.com/pgvector/pgvector From b696631c6efce6a8387f54a1adf6e3e2c796f86f Mon Sep 17 00:00:00 2001 From: digoal zhou Date: Fri, 3 Feb 2023 11:29:46 +0800 Subject: [PATCH 3/4] [Docs]: add six practice documents. --- docs/zh/practice/rb.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/zh/practice/rb.md b/docs/zh/practice/rb.md index 28e500237c8..32740fe80c9 100644 --- a/docs/zh/practice/rb.md +++ b/docs/zh/practice/rb.md @@ -16,8 +16,7 @@ PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩 测试环境为 macos+docker, polardb 部署请参考: -- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) - +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) ## roaringbitmap for PolarDB From 63d4a4d32fea46897a6aa6184b939c9de30054ec Mon Sep 17 00:00:00 2001 From: digoal zhou Date: Fri, 3 Feb 2023 15:06:25 +0800 Subject: [PATCH 4/4] [Docs]: add 10 practice documents --- docs/.vuepress/configs/navbar/zh.ts | 17 + docs/zh/imgs/postgis_2_1.jpg | Bin 0 -> 69036 bytes docs/zh/imgs/postgis_2_2.jpg | Bin 0 -> 184196 bytes docs/zh/imgs/postgis_2_3.jpg | Bin 0 -> 156256 bytes docs/zh/imgs/postgis_2_4.jpg | Bin 0 -> 237080 bytes docs/zh/imgs/postgis_2_5.jpg | Bin 0 -> 456501 bytes docs/zh/imgs/postgis_2_6.jpg | Bin 0 -> 46772 bytes docs/zh/practice/bloom.md | 155 ++++++ docs/zh/practice/gin.md | 194 +++++++ docs/zh/practice/hll.md | 788 ++++++++++++++++++++++++++++ docs/zh/practice/imgsmlr.md | 463 ++++++++++++++++ docs/zh/practice/parray.md | 272 ++++++++++ docs/zh/practice/pg_trgm.md | 104 ++++ docs/zh/practice/pgpool.md | 312 +++++++++++ docs/zh/practice/pgrouting.md | 101 ++++ docs/zh/practice/pointcloud.md | 435 +++++++++++++++ docs/zh/practice/postgis.md | 184 +++++++ docs/zh/practice/postgis_1.md | 151 ++++++ docs/zh/practice/postgis_2.md | 256 +++++++++ docs/zh/practice/rdkit.md | 530 +++++++++++++++++++ docs/zh/practice/rum.md | 364 +++++++++++++ docs/zh/practice/similarity.md | 405 ++++++++++++++ docs/zh/practice/smlar.md | 418 +++++++++++++++ docs/zh/practice/tsdb.md | 308 +++++++++++ 24 files changed, 5457 insertions(+) create mode 100644 docs/zh/imgs/postgis_2_1.jpg create mode 100644 docs/zh/imgs/postgis_2_2.jpg create mode 100644 docs/zh/imgs/postgis_2_3.jpg create mode 100644 docs/zh/imgs/postgis_2_4.jpg create mode 100644 docs/zh/imgs/postgis_2_5.jpg create mode 100644 docs/zh/imgs/postgis_2_6.jpg create mode 100644 docs/zh/practice/bloom.md create mode 100644 docs/zh/practice/gin.md create mode 100644 docs/zh/practice/hll.md create mode 100644 docs/zh/practice/imgsmlr.md create mode 100644 docs/zh/practice/parray.md create mode 100644 docs/zh/practice/pg_trgm.md create mode 100644 docs/zh/practice/pgpool.md create mode 100644 docs/zh/practice/pgrouting.md create mode 100644 docs/zh/practice/pointcloud.md create mode 100644 docs/zh/practice/postgis.md create mode 100644 docs/zh/practice/postgis_1.md create mode 100644 docs/zh/practice/postgis_2.md create mode 100644 docs/zh/practice/rdkit.md create mode 100644 docs/zh/practice/rum.md create mode 100644 docs/zh/practice/similarity.md create mode 100644 docs/zh/practice/smlar.md create mode 100644 docs/zh/practice/tsdb.md diff --git a/docs/.vuepress/configs/navbar/zh.ts b/docs/.vuepress/configs/navbar/zh.ts index 03660bcc1b9..f3ab166edad 100644 --- a/docs/.vuepress/configs/navbar/zh.ts +++ b/docs/.vuepress/configs/navbar/zh.ts @@ -126,11 +126,28 @@ export const zh: NavbarConfig = [ "/zh/practice/brin.html", "/zh/practice/spgist.html", "/zh/practice/vector.html", + "/zh/practice/parray.html", + "/zh/practice/gin.html", + "/zh/practice/rum.html", + "/zh/practice/bloom.html", + "/zh/practice/pg_trgm.html", "/zh/practice/age.html", "/zh/practice/madlib.html", "/zh/practice/pg_jieba.html", "/zh/practice/rb.html", + "/zh/practice/hll.html", + "/zh/practice/imgsmlr.html", + "/zh/practice/similarity.html", + "/zh/practice/smlar.html", + "/zh/practice/rdkit.html", + "/zh/practice/tsdb.html", + "/zh/practice/postgis.html", + "/zh/practice/postgis_1.html", + "/zh/practice/postgis_2.html", + "/zh/practice/pgrouting.html", + "/zh/practice/pointcloud.html", "/zh/practice/pgcat.html", + "/zh/practice/pgpool.html", ], }, ], diff --git a/docs/zh/imgs/postgis_2_1.jpg b/docs/zh/imgs/postgis_2_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93928c3350f115b753638797a7f906e5d64dcb14 GIT binary patch literal 69036 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

LbMcqYSiHBR_w6k;NKNU|yVBq-KU~}R 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 NV{u+$ueq06{~z-c%rgK0 literal 0 HcmV?d00001 diff --git a/docs/zh/imgs/postgis_2_3.jpg b/docs/zh/imgs/postgis_2_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37b1a0d97ed4e4d35ba223e8d8fe6e8658c6d8c0 GIT binary patch literal 156256 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

  • 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 literal 0 HcmV?d00001 diff --git a/docs/zh/imgs/postgis_2_5.jpg b/docs/zh/imgs/postgis_2_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f635d7d1209affe5098c8a9e8f90459b2602d8f1 GIT binary patch literal 456501 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�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 z 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⋙#ay1VJ#l`i#oaY67>`6Xg@;@{(-|XIubl7Yi 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%0Ay=W`26H`gN6{SyN6< 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⪼}tdjbidt~JX#%6nkel$(YT{O~vB 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

    }Y4NJ{ny_norST6?NF5q9}Zw$`+xXGwMGvqzV= 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

    jsFj-~|7Rr>| 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 literal 0 HcmV?d00001 diff --git a/docs/zh/imgs/postgis_2_6.jpg b/docs/zh/imgs/postgis_2_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c03b41fc01360282e21965f87e1a1f60c71def5 GIT binary patch literal 46772 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 literal 0 HcmV?d00001 diff --git a/docs/zh/practice/bloom.md b/docs/zh/practice/bloom.md new file mode 100644 index 00000000000..908fd8ecec2 --- /dev/null +++ b/docs/zh/practice/bloom.md @@ -0,0 +1,155 @@ +--- +author: digoal +date: 2023/02/03 +minute: 10 +--- + +# bloom index 实现任意字段组合条件过滤 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍使用 PolarDB 开源版 bloom filter index 实现任意字段组合条件过滤 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 原理 + +任意字段组合条件过滤, 这种操作通常出现在数据分析场景, 例如 BI 分析师, 根据需要过滤数, 但是通常需要大量试错, 所以需求就变成了任意组合. + +为了加速任意字段过滤, 需要对每一种组合创建索引, 当然 PolarDB PG 也支持多个 btree index 的 bitmap scan, 所以只需要在每个字段上都创建一个索引即可. 但是即使是这样, 弊端依旧存在: + +- 每列索引加起来占用空间也是比较大的, +- 而且索引越多, 对 dml 操作带来的 rt 就越大, 影响写入吞吐. + +为了解决这个问题, bloom filter 应运而生, 一个索引, 支持所有字段任意组合条件过滤, (注意, bloom filter 仅支持等值组合(原理见下面)). + +- bloom filter 为 N bit 的 hash value, +- 每个值经过 hash 后, 映射到 hash value 中的 n 个 bit 内. 例如 2 个 bit, hello (11)映射到 1,8, world (11)映射到 2,8. + +查询 hello 是否存在时, 只需要判断对应 bit 上的值是否和 hash value 一致, 即可. + +bloom 的 lossy 特性: +不存在 一定 不存在, 表示有 map bit=0 的, 不存在表示这条记录不包含这个 value. +存在 不一定 存在, 表示 map bits=1, 但是这些 bits 可能有其他 columns value 映射过去的 1(你也可以理解为 bit 冲突), 所以需要二次 recheck 才能判断一定存在. + +为什么会产生 bit 冲突? + +- 例如 80 个 bit, 存储 32 列的值, 每列 2 个 bit. hash 时, 不同 column value 可能会同时 mapping 到某一个位置的 bit. 字段越多, 冲突概率越大. + +不管怎么样, bloom filter 这种方法在任意字段组合查询的使用中还是非常廉价高效的. + +## 场景模拟和架构设计实践 + +创建测试表, 写入 1000 万条记录 + +``` +=# CREATE TABLE tbloom AS + SELECT + (random() * 1000000)::int as i1, + (random() * 1000000)::int as i2, + (random() * 1000000)::int as i3, + (random() * 1000000)::int as i4, + (random() * 1000000)::int as i5, + (random() * 1000000)::int as i6 + FROM + generate_series(1,10000000); +SELECT 10000000 +``` + +全表扫描性能 + +``` +=# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; + QUERY PLAN +-------------------------------------------------------------------​----------------------------------- + Seq Scan on tbloom (cost=0.00..2137.14 rows=3 width=24) (actual time=16.971..16.971 rows=0 loops=1) + Filter: ((i2 = 898732) AND (i5 = 123451)) + Rows Removed by Filter: 100000 + Planning Time: 0.346 ms + Execution Time: 16.988 ms +(5 rows) +``` + +创建 bloom index, 覆盖 6 个字段, 仅仅消耗 1.5MB. 查询性能提升近 50 倍. + +``` +create extension bloom ; + +=# CREATE INDEX bloomidx ON tbloom USING bloom (i1, i2, i3, i4, i5, i6); +CREATE INDEX +=# SELECT pg_size_pretty(pg_relation_size('bloomidx')); + pg_size_pretty +---------------- + 1584 kB +(1 row) +=# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; + QUERY PLAN +-------------------------------------------------------------------​-------------------------------------------------- + Bitmap Heap Scan on tbloom (cost=1792.00..1799.69 rows=2 width=24) (actual time=0.388..0.388 rows=0 loops=1) + Recheck Cond: ((i2 = 898732) AND (i5 = 123451)) + Rows Removed by Index Recheck: 29 + Heap Blocks: exact=28 + -> Bitmap Index Scan on bloomidx (cost=0.00..1792.00 rows=2 width=0) (actual time=0.356..0.356 rows=29 loops=1) + Index Cond: ((i2 = 898732) AND (i5 = 123451)) + Planning Time: 0.099 ms + Execution Time: 0.408 ms +(8 rows) +``` + +改成普通 btree 索引, 每个字段创建 1 个, 总共 6 个索引. 多个字段组合查询会采用 bitmap and|or scan. 效率最高, 但是占用空间巨大, 同时对写入吞吐性能影响较大. + +``` +=# CREATE INDEX btreeidx1 ON tbloom (i1); +CREATE INDEX +=# CREATE INDEX btreeidx2 ON tbloom (i2); +CREATE INDEX +=# CREATE INDEX btreeidx3 ON tbloom (i3); +CREATE INDEX +=# CREATE INDEX btreeidx4 ON tbloom (i4); +CREATE INDEX +=# CREATE INDEX btreeidx5 ON tbloom (i5); +CREATE INDEX +=# CREATE INDEX btreeidx6 ON tbloom (i6); +CREATE INDEX +=# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; + QUERY PLAN +-------------------------------------------------------------------​-------------------------------------------------------- + Bitmap Heap Scan on tbloom (cost=24.34..32.03 rows=2 width=24) (actual time=0.028..0.029 rows=0 loops=1) + Recheck Cond: ((i5 = 123451) AND (i2 = 898732)) + -> BitmapAnd (cost=24.34..24.34 rows=2 width=0) (actual time=0.027..0.027 rows=0 loops=1) + -> Bitmap Index Scan on btreeidx5 (cost=0.00..12.04 rows=500 width=0) (actual time=0.026..0.026 rows=0 loops=1) + Index Cond: (i5 = 123451) + -> Bitmap Index Scan on btreeidx2 (cost=0.00..12.04 rows=500 width=0) (never executed) + Index Cond: (i2 = 898732) + Planning Time: 0.491 ms + Execution Time: 0.055 ms +(9 rows) +``` + +## 参考 + +- [《重新发现 PostgreSQL 之美 - 14 bloom 布隆过滤器索引》](https://github.com/digoal/blog/blob/master/202106/20210605_07.md) +- [《PostgreSQL 14 preview - BRIN (典型 IoT 时序场景) 块级索引支持 bloom filter - 随机,大量 distinct value, 等值查询》](https://github.com/digoal/blog/blob/master/202103/20210326_02.md) +- [《PostgreSQL bloom 索引原理》](https://github.com/digoal/blog/blob/master/202011/20201128_04.md) +- [《UID 编码优化 - 用户画像前置规则 (bloom, 固定算法等)》](https://github.com/digoal/blog/blob/master/201911/20191130_01.md) +- [《PostgreSQL bloom filter index 扩展 for bigint》](https://github.com/digoal/blog/blob/master/201810/20181003_02.md) +- [《PostgreSQL 11 preview - bloom filter 误报率评估测试及如何降低误报 - 暨 bloom filter 应用于 HEAP 与 INDEX 的一致性检测》](https://github.com/digoal/blog/blob/master/201804/20180409_01.md) +- [《PostgreSQL 11 preview - BRIN 索引接口功能扩展(BLOOM FILTER、min max 分段)》](https://github.com/digoal/blog/blob/master/201803/20180323_05.md) +- [《PostgreSQL 9.6 黑科技 bloom 算法索引,一个索引支撑任意列组合查询》](https://github.com/digoal/blog/blob/master/201605/20160523_01.md) +- [《PostgreSQL 应用开发解决方案最佳实践系列课程 - 7. 标签搜索和圈选、相似搜索和圈选、任意字段组合搜索和圈选系统》](https://github.com/digoal/blog/blob/master/202105/20210510_01.md) +- [《PostgreSQL 任意字段组合搜索 - rum 或 多字段 bitmapscan 对比》](https://github.com/digoal/blog/blob/master/202005/20200520_02.md) +- [《PostgreSQL+MySQL 联合解决方案 - 第 10 课视频 - 任意字段、维度组合搜索(含 GIS、数组、全文检索等属性)》](https://github.com/digoal/blog/blob/master/202001/20200114_01.md) +- [《PostgreSQL 任意字段组合查询 - 含 128 字段,1 亿记录,任意组合查询,性能》](https://github.com/digoal/blog/blob/master/201903/20190320_02.md) +- [《PostgreSQL 任意字段数组合 AND\OR 条件,指定返回结果条数,构造测试数据算法举例》](https://github.com/digoal/blog/blob/master/201809/20180905_03.md) +- [《PostgreSQL 设计优化 case - 大宽表任意字段组合查询索引如何选择(btree, gin, rum) - (含单个索引列数超过 32 列的方法)》](https://github.com/digoal/blog/blob/master/201808/20180803_01.md) +- [《PostgreSQL ADHoc(任意字段组合)查询(rums 索引加速) - 非字典化,普通、数组等组合字段生成新数组》](https://github.com/digoal/blog/blob/master/201805/20180518_02.md) +- [《PostgreSQL 实践 - 实时广告位推荐 2 (任意字段组合、任意维度组合搜索、输出 TOP-K)》](https://github.com/digoal/blog/blob/master/201804/20180424_04.md) +- [《PostgreSQL 实践 - 实时广告位推荐 1 (任意字段组合、任意维度组合搜索、输出 TOP-K)》](https://github.com/digoal/blog/blob/master/201804/20180420_03.md) +- [《PostgreSQL ADHoc(任意字段组合)查询 与 字典化 (rum 索引加速) - 实践与方案 1 - 菜鸟 某仿真系统》](https://github.com/digoal/blog/blob/master/201802/20180228_01.md) +- [《PostgreSQL 如何高效解决 按任意字段分词检索的问题 - case 1》](https://github.com/digoal/blog/blob/master/201607/20160725_05.md) diff --git a/docs/zh/practice/gin.md b/docs/zh/practice/gin.md new file mode 100644 index 00000000000..9a68269aade --- /dev/null +++ b/docs/zh/practice/gin.md @@ -0,0 +1,194 @@ +--- +author: digoal +date: 2023/02/03 +minute: 20 +--- + +# 用户画像、实时精准营销业务加速实践 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍使用 PolarDB 开源版高效率解决用户画像、实时精准营销类业务需求 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 原理 + +1、场景介绍: + +用户画像通常被用于精准营销场景, 根据用户的行为分析并给用户打标签, 充分了解用户属性的诉求可以更好的实现供需连, 例如推送用户之所需, 根据市场需求进行备货等等. + +数据分析时解决供需问题, 节省社会成本, 提升社会效率的有力手段. + +2、难点: + +- 标签多, 标签的多少动态增减, 需要大量 DDL, 不适合大宽表 +- 标签过滤需要全表扫描, 非常慢 +- 标签组合(包含、不包含等等), 过滤效率低 +- 每个用户的标签数量可能不一样, 不适合结构化存储 + +3、PolarDB 如何解决这个问题: + +- 画像存储: 采用数组, 解决了动态增减标签, 个性化标签的需求, 不涉及结构变更. +- GIN 索引: 解决高效率组合搜索过滤问题 +- fast update: 解决实时打标的效率问题. (后台异步 merge gin index) + +## 场景模拟和架构设计实践 + +1、创建模拟生成标签的函数 + +``` +create or replace function gen_arr(normal int, hot int) returns int[] as $$ + select array(select (100000*random())::int+500 from generate_series(1,$1)) || array(select (500*random())::int from generate_series(1,$2)); +$$ language sql strict; +``` + +体现个性标签+热门标签, 个性标签 10 万个, 热门标签 500 个. + +例如 20 个个性标签+10 个热门标签, 组成了某个人的画像. + +``` +postgres=# select gen_arr(22,10); + gen_arr +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {84735,45437,35238,71110,22339,86790,89232,8340,851,50577,6600,53760,63854,95377,28505,12781,34180,56262,10835,53417,42865,67843,235,401,265,372,304,132,309,140,38,254} +(1 row) +``` + +2、创建测试表, 生产 500 万用户画像数据, 并创建 gin 索引 + +``` +create table tbl (uid int8, tag int[]); + +insert into tbl select uid, gen_arr(22,10) from generate_series(1,5000000) uid; + +create index on tbl using gin (tag); +``` + +3、圈选用户测试, 使用 GIN 倒排索引. + +``` +postgres=# explain select count(*) from tbl where tag @> '{100}'::int[]; + QUERY PLAN +-------------------------------------------------------------------------------------- + Aggregate (cost=24422.02..24422.03 rows=1 width=8) + -> Bitmap Heap Scan on tbl (cost=210.25..24359.52 rows=25000 width=0) + Recheck Cond: (tag @> '{100}'::integer[]) + -> Bitmap Index Scan on tbl_tag_idx (cost=0.00..204.00 rows=25000 width=0) + Index Cond: (tag @> '{100}'::integer[]) +(5 rows) +``` + +圈选某个热门标签 + +``` +postgres=# select count(*) from tbl where tag @> '{100}'::int[]; + count +------- + 99427 +(1 row) + +Time: 693.697 ms +``` + +圈选某些热门标签 + +``` +postgres=# select count(*) from tbl where tag @> '{100,50}'::int[]; + count +------- + 1841 +(1 row) + +Time: 19.100 ms +``` + +圈选某个个性标签 + +``` +postgres=# select count(*) from tbl where tag @> '{600}'::int[]; + count +------- + 1042 +(1 row) + +Time: 69.772 ms +``` + +圈选某些个性标签 + +``` +postgres=# select count(*) from tbl where tag @> '{600,700}'::int[]; + count +------- + 0 +(1 row) + +Time: 11.029 ms + +postgres=# select count(*) from tbl where tag @> '{600,680}'::int[]; + count +------- + 0 +(1 row) + +Time: 1.050 ms +``` + +圈选某个个性标签, 并排除某个热门标签 + +``` +postgres=# explain select count(*) from tbl where tag @> '{600}'::int[] and not (tag @> '{60}'::int[]); + QUERY PLAN +-------------------------------------------------------------------------------------- + Aggregate (cost=23537.17..23537.18 rows=1 width=8) + -> Bitmap Heap Scan on tbl (cost=200.64..23478.51 rows=23463 width=0) + Recheck Cond: (tag @> '{600}'::integer[]) + Filter: (NOT (tag @> '{60}'::integer[])) + -> Bitmap Index Scan on tbl_tag_idx (cost=0.00..194.78 rows=23917 width=0) + Index Cond: (tag @> '{600}'::integer[]) +(6 rows) + +Time: 0.570 ms + +postgres=# select count(*) from tbl where tag @> '{600}'::int[] and not (tag @> '{60}'::int[]); + count +------- + 1018 +(1 row) + +Time: 3.715 ms +``` + +圈选某个热门标签, 并排除某个个性标签 + +``` +postgres=# explain select count(*) from tbl where tag @> '{60}'::int[] and not (tag @> '{600}'::int[]); + QUERY PLAN +-------------------------------------------------------------------------------------- + Aggregate (cost=109198.79..109198.80 rows=1 width=8) + -> Bitmap Heap Scan on tbl (cost=778.85..108962.84 rows=94380 width=0) + Recheck Cond: (tag @> '{60}'::integer[]) + Filter: (NOT (tag @> '{600}'::integer[])) + -> Bitmap Index Scan on tbl_tag_idx (cost=0.00..755.26 rows=94834 width=0) + Index Cond: (tag @> '{60}'::integer[]) +(6 rows) + +Time: 1.714 ms + +postgres=# select count(*) from tbl where tag @> '{60}'::int[] and not (tag @> '{600}'::int[]); + count +------- + 98930 +(1 row) + +Time: 693.436 ms +``` + +在笔记本上, 性能已经起飞, 何况是高端机器? diff --git a/docs/zh/practice/hll.md b/docs/zh/practice/hll.md new file mode 100644 index 00000000000..f6ffaa4a2fd --- /dev/null +++ b/docs/zh/practice/hll.md @@ -0,0 +1,788 @@ +--- +author: digoal +date: 2023/02/03 +minute: 30 +--- + +# 通过 HLL 实现滑动分析、实时推荐已读列表过滤 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版通过 postgresql_hll 实现高效率 UV 滑动分析、实时推荐已读列表过滤 + +测试环境为 macos+docker, polardb 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## postgresql_hll 简单介绍 + +postgresql_hll 是高效率存储一堆唯一值的"hash value"的插件: +可以 + +- 往这个"hash value"里面追加内容. +- 有多少唯一值 +- 两个 hash value 的差值个数 +- 两个 hash value 的 union +- 多个 hash value 的 union + +一个 hll 可能使用十几 KB 存储数亿唯一值. + +常见场景: + +1、 + +- UV +- 滑动窗口 UV +- 新增 UV +- 同比, 环比 + +2、短视频推荐业务, 只推荐未读的短视频. 使用 postgresql_hll 可以高效率记录和过滤已读列表. + +hll 也有点类似 bloom filter: + +- 如果判断结果为 val 在 hll 里面, 实际 val 可能不在 hll 里面. 因为是失真存储, 那么多个 val 的占位 bitmask 可能覆盖其他 val 的 bitmask. +- 如果判断结果为 val 不在 hll 里面, 则一定不在. + +## postgresql_hll for PolarDB + +1、安装部署 postgresql_hll for polardb + +``` +git clone --depth 1 https://github.com/citusdata/postgresql-hll + +export PGHOST=localhost +[postgres@67e1eed1b4b6 ~]$ psql +psql (11.9) +Type "help" for help. + +postgres=# \q + + +cd postgresql-hll/ + +USE_PGXS=1 make + +USE_PGXS=1 make install + +USE_PGXS=1 make installcheck +``` + +2、使用例子 + +建表, 写入大量 UID 的行为数据. 生成按天的 UV 数据, 使用 hll 存储 uid hash. + +``` +create table t1 (id int, uid int, info text, crt_time timestamp); +create table t1_hll (dt date, hllval hll); +insert into t1 select id, random()*100000, random()::text, now() from generate_series(1,1000000) id; +insert into t1 select id, random()*100000, random()::text, now()+interval '1 day' from generate_series(1,1000000) id; +insert into t1_hll select date(crt_time), hll_add_agg(hll_hash_integer(uid)) from t1 group by 1; +``` + +判断 UID 是否在 hll hash 内, 检查 hll 精确性. + +``` +postgres=# select t1.uid, t2.hllval=hll_add(t2.hllval, hll_hash_integer(t1.uid)) from t1 , t1_hll t2 where t2.dt=date(now()) and t1.crt_time < date(now())+1 limit 10; + uid | ?column? +-------+---------- + 95912 | t + 69657 | t + 53722 | t + 95821 | t + 2836 | t + 66298 | t + 68466 | t + 10122 | t + 27861 | t + 6824 | t +(10 rows) + + +select * from + (select t1.uid, t2.hllval=hll_add(t2.hllval, hll_hash_integer(t1.uid)) as yesorno from t1 , t1_hll t2 where t2.dt=date(now()) and t1.crt_time < date(now())+1) t +where t.yesorno=false; + + uid | yesorno +-----+--------- +(0 rows) + +-- 完全正确. +``` + +划窗分析, 例如直接在 hll 的统计表中, 统计任意 7 天的划窗口 uv. 如果没有 HLL, 划窗分析必须去基表进行统计, 性能极差. 而有了 hll, 只需要访问 7 条记录, 聚合即可. + +``` +## What if you wanted to this week's uniques? + +SELECT hll_cardinality(hll_union_agg(users)) FROM daily_uniques WHERE date >= '2012-01-02'::date AND date <= '2012-01-08'::date; + +## Or the monthly uniques for this year? + +SELECT EXTRACT(MONTH FROM date) AS month, hll_cardinality(hll_union_agg(users)) +FROM daily_uniques +WHERE date >= '2012-01-01' AND + date < '2013-01-01' +GROUP BY 1; + +## Or how about a sliding window of uniques over the past 6 days? + +SELECT date, #hll_union_agg(users) OVER seven_days +FROM daily_uniques +WINDOW seven_days AS (ORDER BY date ASC ROWS 6 PRECEDING); + +## Or the number of uniques you saw yesterday that you didn't see today? + +SELECT date, (#hll_union_agg(users) OVER two_days) - #users AS lost_uniques +FROM daily_uniques +WINDOW two_days AS (ORDER BY date ASC ROWS 1 PRECEDING); +``` + +## 例子 1: hll 加速短视频推荐 + +场景: + +- 短视频、电商、社交等基于标签的动态推荐. + +挑战: + +- 标签多, 按标签权重比例每个标签取 N 条, 与数据库的交互次数多. +- 已读列表巨大, 过滤已读采用传统 not in 资源消耗大. +- 效率低下. + +解决方案: + +- 效率提升 1000 倍, 可能价值 1 个亿. +- 技术点: 数组、自定义 type、partial index 降低无效过滤、hash subplan 优化 not in、array agg, jsonb, hll 压缩存储已读视频 ID + +### DEMO + +1、视频资源池 + +1\.1、全国资源池 + +``` +create unlogged table pool_global ( -- 全国资源池 + vid int8, -- 视频ID + tag int, -- 标签 + score float4 -- 标签权重 +); +``` + +写入数据: 1000 万条记录: 100 万个视频, 每个视频 10 个标签, 标签取值空间 1-100. + +``` +insert into pool_global select generate_series(1,1000000), random()*100, random()*10 from generate_series(1,10); +``` + +1\.2、省份资源池 + +``` +create unlogged table pool_province ( -- 省份资源池 + pid int, -- 省份ID + vid int8, -- 视频ID + tag int, -- 标签 + score float4 -- 标签权重 +); +``` + +写入数据: 1000 万条记录: 100 万个视频, 每个视频 10 个标签, 标签取值空间 1-100. +pid 取值空间 1-36 + +``` +insert into pool_province select ceil(random()*36), generate_series(1000001,2000000), random()*100, random()*10 from generate_series(1,10); +``` + +1\.3、城市资源池 + +``` +create unlogged table pool_city ( -- 城市资源池 + cid int, -- 城市ID + vid int8, -- 视频ID + tag int, -- 标签 + score float4 -- 标签权重 +); +``` + +写入数据: 1000 万条记录: 100 万个视频, 每个视频 10 个标签, 标签取值空间 1-100. +cid 取值空间 1-10000 + +``` +insert into pool_city select ceil(random()*10000), generate_series(2000001,3000000), random()*100, random()*10 from generate_series(1,10); +``` + +1\.4、partial index(分区索引), 避免过滤列表巨大带来巨大的无效扫描, 之前已经讲过 +[《重新发现 PostgreSQL 之美 - 23 彭祖的长寿秘诀》](https://github.com/digoal/blog/blob/master/202106/20210613_02.md) + +``` +do language plpgsql $$ +declare +begin + for i in 0..49 loop + execute format('create index idx_pool_global_%s on pool_global (tag,score desc) include (vid) where abs(mod(hashint8(vid),50))=%s', i,i); + execute format('create index idx_pool_province_%s on pool_province (pid,tag,score desc) include (vid) where abs(mod(hashint8(vid),50))=%s', i,i); + execute format('create index idx_pool_city_%s on pool_city (cid,tag,score desc) include (vid) where abs(mod(hashint8(vid),50))=%s', i,i); + end loop; +end; +$$; +``` + +2、用户标签类型 + +``` +create type tag_score as ( + tag int, -- 标签 + score float4, -- 标签权重 + limits int -- 用这个标签获取多少条VID +); +``` + +3、用户表 + +``` +create unlogged table users ( + uid int8 primary key, -- 用户ID + pid int, -- 省份ID + cid int, -- 城市ID + tag_scores1 tag_score[], -- 标签、权重、对应标签获取多少条. 也可以使用jsonb存储 + tag_scores2 tag_score[], -- 标签、权重、对应标签获取多少条 limit = 0的放这个字段. 业务更新tag_scores根据两个字段的结果来计算. 主要是减少PG计算量. + readlist jsonb -- 已读VID, 和分区索引的分区数匹配, 用jsonb数组表示. jsonb[0]表示abs(mod(hashint8(vid),50))=0的vid数组 +); +``` + +写入数据: 1000 万个用户, 每个用户 20 个标签(标签取值空间 1-100), limit 大于 0 的标签 5 个(和为 100). vid 已读列表 5 万条(1-300 万取值空间). +pid 取值空间 1-36 +cid 取值空间 1-10000 + +``` +insert into users +select generate_series(1,10000000), ceil(random()*36), ceil(random()*10000), +array( + select row(ceil(random()*100), random()*10, 40)::tag_score + union all + select row(ceil(random()*100), random()*10, 20)::tag_score + union all + select row(ceil(random()*100), random()*10, 15)::tag_score + union all + select row(ceil(random()*100), random()*10, 15)::tag_score + union all + select row(ceil(random()*100), random()*10, 10)::tag_score +), +array ( + select row(ceil(random()*100), random()*10, 0)::tag_score from generate_series(1,15) +), +( +select jsonb_agg(x) as readlist from + ( + select array (select x from + (select ceil(random()*3000000)::int8 x from generate_series(1,50000)) t + where mod(x,50)=i + ) x + from generate_series(0,49) i + ) t +) ; +``` + +4、如何更新用户的标签权重, 对应标签获取多少条? +原则: 可以在程序中计算并且不会增加程序和数据库交互的, 放在程序内计算. +取出 UID, 在应用程序中计算的到 tag_scores 结果, 存入数据库 users 表. + +5、获取推荐视频 vids SQL: + +``` +select + ( + select array_agg(vid) from + ( + select vid from pool_global t1 + where t1.tag=t.tag + and t1.vid not in (select jsonb_array_elements_text( readlist[0] )::int8 from users where uid=1) + and abs(mod(hashint8(vid),50)) = 0 + order by t1.score desc + limit ceil(t.limits*0.5) + ) x -- 全国池 50% + ) as global_pool, + ( + select array_agg(vid) from + ( + select vid from pool_province t1 + where t1.tag=t.tag + and t1.pid=(select pid from users where uid=1) + and t1.vid not in (select jsonb_array_elements_text( readlist[0] )::int8 from users where uid=1) + and abs(mod(hashint8(vid),50)) = 0 + order by t1.score desc + limit ceil(t.limits*0.3) + ) x -- 省份池 30% + ) as province_pool, + ( + select array_agg(vid) from + ( + select vid from pool_city t1 + where t1.tag=t.tag + and t1.cid=(select cid from users where uid=1) + and t1.vid not in (select jsonb_array_elements_text( readlist[0] )::int8 from users where uid=1) + and abs(mod(hashint8(vid),50)) = 0 + order by t1.score desc + limit ceil(t.limits*0.2) + ) x -- 城市池 20% + ) as city_pool +from +( + select (unnest(tag_scores1)).tag as tag, (unnest(tag_scores1)).limits as limits from + users where uid=1 +) t; +``` + +``` +-[ RECORD 1 ]-+------------------------------------------------------------------------------------------------------------------------------------------- +global_pool | {555234,30783,44877,893039,274638,811324,743142,233694,503619,977097,263781,350882,15000,961863,705252,823857,302978,919950,864090,633682} +province_pool | {1381822,1570117,1733796,1802258,1757745,1308796,1296608,1958019,1637076,1626698,1369964,1501167} +city_pool | +-[ RECORD 2 ]-+------------------------------------------------------------------------------------------------------------------------------------------- +global_pool | {41356,470712,453025,997172,997806,520315,512094,523652,714477,526433} +province_pool | {1246470,1582571,1154589,1213147,1144821,1498216} +city_pool | +-[ RECORD 3 ]-+------------------------------------------------------------------------------------------------------------------------------------------- +global_pool | {951192,518459,830710,34429,113691,362024,578173,574309} +province_pool | {1831028,1060594,1871276,1365273,1092971} +city_pool | {2100388} +-[ RECORD 4 ]-+------------------------------------------------------------------------------------------------------------------------------------------- +global_pool | {235601,950720,269682,452868,622511,590893,602110,104605} +province_pool | {1791516,1039665,1669258,1663575,1126127} +city_pool | +-[ RECORD 5 ]-+------------------------------------------------------------------------------------------------------------------------------------------- +global_pool | {738016,548948,600423,559686,483213} +province_pool | {1185880,1916542,1336231} +city_pool | +``` + +``` + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Subquery Scan on t (cost=0.29..246.06 rows=10 width=96) (actual time=2.508..3.754 rows=5 loops=1) + -> Result (cost=0.29..2.71 rows=10 width=8) (actual time=0.020..0.023 rows=5 loops=1) + -> ProjectSet (cost=0.29..2.56 rows=10 width=32) (actual time=0.019..0.020 rows=5 loops=1) + -> Index Scan using users_pkey on users (cost=0.29..2.50 rows=1 width=224) (actual time=0.017..0.018 rows=1 loops=1) + Index Cond: (uid = 1) + SubPlan 2 + -> Aggregate (cost=7.08..7.09 rows=1 width=32) (actual time=0.261..0.261 rows=1 loops=5) + -> Limit (cost=5.43..6.76 rows=25 width=12) (actual time=0.254..0.258 rows=10 loops=5) + -> Index Only Scan using idx_pool_global_0 on pool_global t1 (cost=5.43..18.63 rows=248 width=12) (actual time=0.254..0.257 rows=10 loops=5) + Index Cond: (tag = t.tag) + Filter: (NOT (hashed SubPlan 1)) + Heap Fetches: 0 + SubPlan 1 + -> Result (cost=0.29..4.76 rows=100 width=8) (actual time=0.851..1.074 rows=1001 loops=1) + -> ProjectSet (cost=0.29..3.01 rows=100 width=32) (actual time=0.850..0.938 rows=1001 loops=1) + -> Index Scan using users_pkey on users users_1 (cost=0.29..2.50 rows=1 width=18) (actual time=0.006..0.006 rows=1 loops=1) + Index Cond: (uid = 1) + SubPlan 5 + -> Aggregate (cost=8.15..8.16 rows=1 width=32) (actual time=0.247..0.247 rows=1 loops=5) + -> Limit (cost=7.93..8.13 rows=1 width=12) (actual time=0.242..0.245 rows=6 loops=5) + InitPlan 3 (returns $3) + -> Index Scan using users_pkey on users users_2 (cost=0.29..2.50 rows=1 width=4) (actual time=0.003..0.003 rows=1 loops=1) + Index Cond: (uid = 1) + -> Index Only Scan using idx_pool_province_0 on pool_province t1_1 (cost=5.43..6.85 rows=7 width=12) (actual time=0.241..0.243 rows=6 loops=5) + Index Cond: ((pid = $3) AND (tag = t.tag)) + Filter: (NOT (hashed SubPlan 4)) + Heap Fetches: 0 + SubPlan 4 + -> Result (cost=0.29..4.76 rows=100 width=8) (actual time=0.813..1.027 rows=1001 loops=1) + -> ProjectSet (cost=0.29..3.01 rows=100 width=32) (actual time=0.812..0.896 rows=1001 loops=1) + -> Index Scan using users_pkey on users users_3 (cost=0.29..2.50 rows=1 width=18) (actual time=0.005..0.005 rows=1 loops=1) + Index Cond: (uid = 1) + SubPlan 8 + -> Aggregate (cost=9.07..9.08 rows=1 width=32) (actual time=0.236..0.237 rows=1 loops=5) + -> Limit (cost=7.93..9.05 rows=1 width=12) (actual time=0.235..0.235 rows=0 loops=5) + InitPlan 6 (returns $7) + -> Index Scan using users_pkey on users users_4 (cost=0.29..2.50 rows=1 width=4) (actual time=0.002..0.003 rows=1 loops=1) + Index Cond: (uid = 1) + -> Index Only Scan using idx_pool_city_0 on pool_city t1_2 (cost=5.43..6.55 rows=1 width=12) (actual time=0.234..0.234 rows=0 loops=5) + Index Cond: ((cid = $7) AND (tag = t.tag)) + Filter: (NOT (hashed SubPlan 7)) + Heap Fetches: 0 + SubPlan 7 + -> Result (cost=0.29..4.76 rows=100 width=8) (actual time=0.793..1.011 rows=1001 loops=1) + -> ProjectSet (cost=0.29..3.01 rows=100 width=32) (actual time=0.792..0.876 rows=1001 loops=1) + -> Index Scan using users_pkey on users users_5 (cost=0.29..2.50 rows=1 width=18) (actual time=0.006..0.006 rows=1 loops=1) + Index Cond: (uid = 1) + Planning Time: 0.999 ms + Execution Time: 3.825 ms +(49 rows) +``` + +6、压测 + +``` +vi test.sql + +\set uid random(1,10000000) +\set mod random(0,49) + +select + ( + select array_agg(vid) from + ( + select vid from pool_global t1 + where t1.tag=t.tag + and t1.vid not in (select jsonb_array_elements_text( readlist[:mod] )::int8 from users where uid=:uid) + and abs(mod(hashint8(vid),50)) = :mod + order by t1.score desc + limit ceil(t.limits*0.5) + ) x -- 全国池 50% + ) as global_pool, + ( + select array_agg(vid) from + ( + select vid from pool_province t1 + where t1.tag=t.tag + and t1.pid=(select pid from users where uid=:uid) + and t1.vid not in (select jsonb_array_elements_text( readlist[:mod] )::int8 from users where uid=:uid) + and abs(mod(hashint8(vid),50)) = :mod + order by t1.score desc + limit ceil(t.limits*0.3) + ) x -- 省份池 30% + ) as province_pool, + ( + select array_agg(vid) from + ( + select vid from pool_city t1 + where t1.tag=t.tag + and t1.cid=(select cid from users where uid=:uid) + and t1.vid not in (select jsonb_array_elements_text( readlist[:mod] )::int8 from users where uid=:uid) + and abs(mod(hashint8(vid),50)) = :mod + order by t1.score desc + limit ceil(t.limits*0.2) + ) x -- 城市池 20% + ) as city_pool +from +( + select (unnest(tag_scores1)).tag as tag, (unnest(tag_scores1)).limits as limits from + users where uid=:uid +) t; +``` + +``` +pgbench -M prepared -n -r -P 1 -f ./test.sql -c 12 -j 12 -T 120 + +pgbench (PostgreSQL) 14.0 +transaction type: ./test.sql +scaling factor: 1 +query mode: prepared +number of clients: 12 +number of threads: 12 +duration: 120 s +number of transactions actually processed: 99824 +latency average = 14.426 ms +latency stddev = 12.608 ms +initial connection time = 13.486 ms +tps = 831.235738 (without initial connection time) +``` + +2018 款 macbook pro i5 系列, 每秒可以推荐多少个视频 ID? + +- 83100 + +### 压缩方法: + +使用 roaringbitmap | hll 代替 array 存储已读列表. + +## 例子 2: hll 加速滑动窗口分析 + +场景: + +- 游戏、社交、电商场景. +- 流失用户、新增用户、UV 计算. +- 滑动计算, 任意窗口. + +挑战: + +- 数据量大、计算量大 +- 传统方案需要记录明细, 才能支持滑动计算 + +解决方案: + +- 采用 HLL 类型不需要存储明细, 支持滑动, 交、并、差计算. + +### DEMO + +#### 传统方案: + +数据构造: + +``` +create unlogged table t ( + ts date, -- 日期 + gid int, -- 维度1 , 例如城市 + uid int8 -- 用户ID +); +``` + +写入 1 亿条记录, 跨度 15 天: + +``` +insert into t +select current_date+(random()*15)::int, random()*100, random()*800000000 +from generate_series(1,100000000); + + + public | t | table | postgres | unlogged | heap | 4224 MB | +``` + +1、查询某一天的 UV + +``` +postgres=# select count(distinct uid) from t where ts=current_date; + count +--------- + 3326250 +(1 row) + +Time: 7268.339 ms (00:07.268) +``` + +2、查询某连续 7 天的 UV + +``` +postgres=# select count(distinct uid) from t where ts >= current_date and ts < current_date+7; + count +---------- + 42180699 +(1 row) + +Time: 25291.414 ms (00:25.291) +``` + +3、查询某一天相比前一天的新增用户数 + +``` +postgres=# select count(distinct uid) from (select uid from t where ts=current_date+1 except select uid from t where ts=current_date) t; + count +--------- + 6610943 +(1 row) + +Time: 19969.067 ms (00:19.969) +``` + +4、查询某一天相比前一天的流失用户数 + +``` +postgres=# select count(distinct uid) from (select uid from t where ts=current_date except select uid from t where ts=current_date+1) t; + count +--------- + 3298421 +(1 row) + +Time: 19434.652 ms (00:19.435) +``` + +5、查询某 7 天相比前 7 天的新增用户数 + +``` +postgres=# select count(distinct uid) from (select uid from t where ts>=current_date+7 and ts=current_date and ts=current_date and ts=current_date+7 and ts= current_date and ts < current_date+14; + count +---------- + 85126669 +(1 row) + +Time: 48258.861 ms (00:48.259) +``` + +#### hll 解决方案 + +数据构造: + +``` +create unlogged table pt ( + ts date, -- 日期 + gid int, -- 维度1 , 例如城市 + uid hll -- 用户IDs +); +``` + +每天每个 GID 一条. 不需要原始数据. + +``` +create extension hll; + +insert into pt +select ts, gid, hll_add_agg(hll_hash_bigint(uid)) from +t group by ts,gid; + +INSERT 0 1616 +Time: 37344.032 ms (00:37.344) + + public | pt | table | postgres | unlogged | heap | 2208 kB | +``` + +1、查询某一天的 UV + +``` +postgres=# select # hll_union_agg(uid) from pt where ts=current_date; + ?column? +-------------------- + 3422975.3781066863 +(1 row) + +Time: 1.530 ms +``` + +2、查询某连续 7 天的 UV + +``` +postgres=# select # hll_union_agg(uid) from pt where ts>=current_date and ts=current_date+7 and ts=current_date and ts=current_date+7 and ts=current_date and ts=current_date and ts + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍使用 PolarDB 开源版 和 imgsmlr 存储图像特征值以及快速的进行图像相似搜索 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 原理 + +- [《弱水三千,只取一瓢,当图像搜索遇见 PostgreSQL(Haar wavelet)》](https://github.com/digoal/blog/blob/master/201607/20160726_01.md) + +图像数字化的方法很多, 例如将图像划分为`N^2`的宫格, 每个宫格由几个三原色和灰度进行表述, 然后层层缩小(例如从 81 宫格缩小到 9 宫格), 把全副图像再压缩到一个格子, 形成另一个更小的`N^2`宫格数组. + +在进行图像相似搜索时, 实际上是比对 2 个`N^2`宫格数组的向量距离. + +使用 GIST 索引接口, 可以实现这种向量相似搜索的快速收敛, 例如以中心点为桶的数据划分, 多图层缩略图的压缩搜索算法等. (参考本文后半部分 pase) + +本文将介绍使用 PolarDB 开源版 和 imgsmlr 存储图像特征值以及快速的进行图像相似搜索. + +1、新增 2 个数据类型, 一个是详图向量, 一个是签名向量(占用空间更小, 查询效率更高). 通常先使用签名向量过滤第一道, 然后再使用详图向量精筛. + +| Datatype | Storage length | Description | +| --------- | -------------- | ------------------------------------------------------------------ | +| pattern | 16388 bytes | Result of Haar wavelet transform on the image | +| signature | 64 bytes | Short representation of pattern for fast search using GiST indexes | + +2、新增几个图像转换函数接口 + +| Function | Return type | Description | +| -------------------------- | ----------- | --------------------------------------------------- | +| jpeg2pattern(bytea) | pattern | Convert jpeg image into pattern | +| png2pattern(bytea) | pattern | Convert png image into pattern | +| gif2pattern(bytea) | pattern | Convert gif image into pattern | +| pattern2signature(pattern) | signature | Create signature from pattern | +| shuffle_pattern(pattern) | pattern | Shuffle pattern for less sensitivity to image shift | + +3、新增 2 个向量距离计算操作符和索引排序支持 + +| Operator | Left type | Right type | Return type | Description | +| -------- | --------- | ---------- | ----------- | ----------------------------------------- | +| `<->` | pattern | pattern | float8 | Eucledian distance between two patterns | +| `<->` | signature | signature | float8 | Eucledian distance between two signatures | + +## 部署 imgsmlr on PolarDB + +1、安装 png 和 jpeg 的图像库依赖 + +``` +sudo yum install -y libpng-devel +sudo yum install -y libjpeg-turbo-devel + + + +sudo vi /etc/ld.so.conf +# add +/usr/lib64 + +sudo ldconfig +``` + +2、安装 gd 库, 用于将 jpeg,png,gif 等图像的序列化转换. + +``` +git clone --depth 1 https://github.com/libgd/libgd + +cd libgd/ + +mkdir build + +cd build + +cmake -DENABLE_PNG=1 -DENABLE_JPEG=1 .. + +make + +sudo make install + +... +-- Installing: /usr/local/lib64/libgd.so.3.0.16 +-- Installing: /usr/local/lib64/libgd.so.3 +... + + + +sudo vi /etc/ld.so.conf +# add +/usr/local/lib64 + +sudo ldconfig + + +export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH +``` + +3、安装 imgsmlr + +``` +git clone --depth 1 https://github.com/postgrespro/imgsmlr + + +cd imgsmlr/ +USE_PGXS=1 make + +USE_PGXS=1 make install +``` + +``` +ldd /home/postgres/tmp_basedir_polardb_pg_1100_bld/lib/imgsmlr.so + linux-vdso.so.1 => (0x00007ffc25d52000) + libgd.so.3 => /usr/local/lib64/libgd.so.3 (0x00007fd7a4463000) + libc.so.6 => /lib64/libc.so.6 (0x00007fd7a3ee5000) + libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fd7a3bdd000) + libm.so.6 => /lib64/libm.so.6 (0x00007fd7a38db000) + libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fd7a36c5000) + /lib64/ld-linux-x86-64.so.2 (0x00007fd7a42b3000) +``` + +4、加载插件 + +``` +psql + +create extension imgsmlr ; +``` + +## 场景模拟和架构设计实践 + +生成测试图像 + +``` +cd imgsmlr +USE_PGXS=1 make installcheck +``` + +图像导入、向量化、图像相似搜索测试 + +``` +psql + + +-- 创建插件 +CREATE EXTENSION imgsmlr; + +-- 创建存储原始图像二进制的表 +CREATE TABLE image (id integer PRIMARY KEY, data bytea); + +-- 创建临时表用于导入 +CREATE TABLE tmp (data text); + +-- 导入图像 +\copy tmp from 'data/1.jpg.hex' +INSERT INTO image VALUES (1, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/2.png.hex' +INSERT INTO image VALUES (2, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/3.gif.hex' +INSERT INTO image VALUES (3, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/4.jpg.hex' +INSERT INTO image VALUES (4, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/5.png.hex' +INSERT INTO image VALUES (5, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/6.gif.hex' +INSERT INTO image VALUES (6, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/7.jpg.hex' +INSERT INTO image VALUES (7, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/8.png.hex' +INSERT INTO image VALUES (8, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/9.gif.hex' +INSERT INTO image VALUES (9, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/10.jpg.hex' +INSERT INTO image VALUES (10, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/11.png.hex' +INSERT INTO image VALUES (11, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; +\copy tmp from 'data/12.gif.hex' +INSERT INTO image VALUES (12, (SELECT decode(string_agg(data, ''), 'hex') FROM tmp)); +TRUNCATE tmp; + +-- 将原始图像转换为图像特征向量和图像签名, 导入新表中 + +CREATE TABLE pat AS ( + SELECT + id, + shuffle_pattern(pattern)::text::pattern AS pattern, + pattern2signature(pattern)::text::signature AS signature + FROM ( + SELECT + id, + (CASE WHEN id % 3 = 1 THEN jpeg2pattern(data) + WHEN id % 3 = 2 THEN png2pattern(data) + WHEN id % 3 = 0 THEN gif2pattern(data) + ELSE NULL END) AS pattern + FROM + image + ) x +); + +-- 添加PK +ALTER TABLE pat ADD PRIMARY KEY (id); + +-- 在图像签名字段创建索引 +CREATE INDEX pat_signature_idx ON pat USING gist (signature); + +-- 自关联, 查询图像相似性(欧氏距离) +SELECT p1.id, p2.id, round((p1.pattern <-> p2.pattern)::numeric, 4) FROM pat p1, pat p2 ORDER BY p1.id, p2.id; +SELECT p1.id, p2.id, round((p1.signature <-> p2.signature)::numeric, 4) FROM pat p1, pat p2 ORDER BY p1.id, p2.id; + + +-- 使用索引, 快速搜索相似图像 +SET enable_seqscan = OFF; + +SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 1) LIMIT 3; +SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 4) LIMIT 3; +SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 7) LIMIT 3; +SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 10) LIMIT 3; +``` + +结果截取: + +``` +SELECT p1.id, p2.id, round((p1.signature <-> p2.signature)::numeric, 4) FROM pat p1, pat p2 ORDER BY p1.id, p2.id; + id | id | round +----+----+-------- + 1 | 1 | 0.0000 + 1 | 2 | 0.5914 + 1 | 3 | 0.6352 + 1 | 4 | 1.1431 + 1 | 5 | 1.3843 + 1 | 6 | 1.5245 + 1 | 7 | 3.1489 + 1 | 8 | 3.4192 + 1 | 9 | 3.4571 + 1 | 10 | 4.0683 + 1 | 11 | 3.3551 + 1 | 12 | 2.4814 + 2 | 1 | 0.5914 + 2 | 2 | 0.0000 + 2 | 3 | 0.7785 + 2 | 4 | 1.1414 + 2 | 5 | 1.2839 + 2 | 6 | 1.4373 + 2 | 7 | 3.2969 + 2 | 8 | 3.5381 + 2 | 9 | 3.5788 + 2 | 10 | 4.4256 + 2 | 11 | 3.6138 + 2 | 12 | 2.7975 + 3 | 1 | 0.6352 + 3 | 2 | 0.7785 + 3 | 3 | 0.0000 + 3 | 4 | 1.0552 + 3 | 5 | 1.3885 + 3 | 6 | 1.4925 + 3 | 7 | 3.0224 + 3 | 8 | 3.2555 + 3 | 9 | 3.2907 + 3 | 10 | 4.0521 + 3 | 11 | 3.2095 + 3 | 12 | 2.4304 + 4 | 1 | 1.1431 + 4 | 2 | 1.1414 + 4 | 3 | 1.0552 + 4 | 4 | 0.0000 + 4 | 5 | 0.5904 + 4 | 6 | 0.7594 + 4 | 7 | 2.6952 + 4 | 8 | 2.9019 + 4 | 9 | 2.9407 + 4 | 10 | 3.8655 + 4 | 11 | 2.9710 + 4 | 12 | 2.1766 + 5 | 1 | 1.3843 + 5 | 2 | 1.2839 + 5 | 3 | 1.3885 + 5 | 4 | 0.5904 + 5 | 5 | 0.0000 + 5 | 6 | 0.7044 + 5 | 7 | 2.9206 + 5 | 8 | 3.1147 + 5 | 9 | 3.1550 + 5 | 10 | 4.0454 + 5 | 11 | 3.2023 + 5 | 12 | 2.3612 + 6 | 1 | 1.5245 + 6 | 2 | 1.4373 + 6 | 3 | 1.4925 + 6 | 4 | 0.7594 + 6 | 5 | 0.7044 + 6 | 6 | 0.0000 + 6 | 7 | 2.8572 + 6 | 8 | 3.0659 + 6 | 9 | 3.1054 + 6 | 10 | 3.7803 + 6 | 11 | 2.7595 + 6 | 12 | 2.0282 + 7 | 1 | 3.1489 + 7 | 2 | 3.2969 + 7 | 3 | 3.0224 + 7 | 4 | 2.6952 + 7 | 5 | 2.9206 + 7 | 6 | 2.8572 + 7 | 7 | 0.0000 + 7 | 8 | 0.6908 + 7 | 9 | 0.7082 + 7 | 10 | 4.3939 + 7 | 11 | 3.5039 + 7 | 12 | 3.2914 + 8 | 1 | 3.4192 + 8 | 2 | 3.5381 + 8 | 3 | 3.2555 + 8 | 4 | 2.9019 + 8 | 5 | 3.1147 + 8 | 6 | 3.0659 + 8 | 7 | 0.6908 + 8 | 8 | 0.0000 + 8 | 9 | 0.0481 + 8 | 10 | 4.6824 + 8 | 11 | 3.7398 + 8 | 12 | 3.5689 + 9 | 1 | 3.4571 + 9 | 2 | 3.5788 + 9 | 3 | 3.2907 + 9 | 4 | 2.9407 + 9 | 5 | 3.1550 + 9 | 6 | 3.1054 + 9 | 7 | 0.7082 + 9 | 8 | 0.0481 + 9 | 9 | 0.0000 + 9 | 10 | 4.6921 + 9 | 11 | 3.7523 + 9 | 12 | 3.5913 + 10 | 1 | 4.0683 + 10 | 2 | 4.4256 + 10 | 3 | 4.0521 + 10 | 4 | 3.8655 + 10 | 5 | 4.0454 + 10 | 6 | 3.7803 + 10 | 7 | 4.3939 + 10 | 8 | 4.6824 + 10 | 9 | 4.6921 + 10 | 10 | 0.0000 + 10 | 11 | 1.8252 + 10 | 12 | 2.0838 + 11 | 1 | 3.3551 + 11 | 2 | 3.6138 + 11 | 3 | 3.2095 + 11 | 4 | 2.9710 + 11 | 5 | 3.2023 + 11 | 6 | 2.7595 + 11 | 7 | 3.5039 + 11 | 8 | 3.7398 + 11 | 9 | 3.7523 + 11 | 10 | 1.8252 + 11 | 11 | 0.0000 + 11 | 12 | 1.2933 + 12 | 1 | 2.4814 + 12 | 2 | 2.7975 + 12 | 3 | 2.4304 + 12 | 4 | 2.1766 + 12 | 5 | 2.3612 + 12 | 6 | 2.0282 + 12 | 7 | 3.2914 + 12 | 8 | 3.5689 + 12 | 9 | 3.5913 + 12 | 10 | 2.0838 + 12 | 11 | 1.2933 + 12 | 12 | 0.0000 +(144 rows) + + +postgres=# SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 1) LIMIT 3; + id +---- + 1 + 2 + 3 +(3 rows) + +postgres=# SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 4) LIMIT 3; + id +---- + 4 + 5 + 6 +(3 rows) + +postgres=# SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 7) LIMIT 3; + id +---- + 7 + 8 + 9 +(3 rows) + +postgres=# SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 10) LIMIT 3; + id +---- + 10 + 11 + 12 +(3 rows) +``` + +``` +postgres=# explain SELECT id FROM pat ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 10) LIMIT 3; + QUERY PLAN +------------------------------------------------------------------------------------ + Limit (cost=8.29..10.34 rows=3 width=8) + InitPlan 1 (returns $0) + -> Index Scan using pat_pkey on pat pat_1 (cost=0.14..8.15 rows=1 width=64) + Index Cond: (id = 10) + -> Index Scan using pat_signature_idx on pat (cost=0.13..8.37 rows=12 width=8) + Order By: (signature <-> $0) +(6 rows) +``` + +使用 PolarDB+imgsmlr 实现了图像特征存储, 快速根据图像特征进行相似图像搜索. + +## 参考 + +- [《PostgreSQL 多维、图像 欧式距离、向量距离、向量相似 查询优化 - cube,imgsmlr - 压缩、分段、异步并行》](https://github.com/digoal/blog/blob/master/201811/20181129_01.md) +- [《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试与优化 3 - citus 8 机 128shard (4 亿图像)》](https://github.com/digoal/blog/blob/master/201809/20180904_04.md) +- [《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试与优化 2 - 单机分区表 (dblink 异步调用并行) (4 亿图像)》](https://github.com/digoal/blog/blob/master/201809/20180904_03.md) +- [《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试与优化 1 - 单机单表 (4 亿图像)》](https://github.com/digoal/blog/blob/master/201809/20180904_02.md) +- [《PostgreSQL 相似搜索插件介绍大汇总 (cube,rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)》](https://github.com/digoal/blog/blob/master/201809/20180904_01.md) +- [《弱水三千,只取一瓢,当图像搜索遇见 PostgreSQL(Haar wavelet)》](https://github.com/digoal/blog/blob/master/201607/20160726_01.md) +- [《如何用 PolarDB 在不确定世界寻找确定答案 (例如图像相似) - vector|pase》](https://github.com/digoal/blog/blob/master/202212/20221201_02.md) +- [《PostgreSQL + FDW + vector 插件加速向量检索 - 在不确定世界寻找确定答案 (例如图像相似)》](https://github.com/digoal/blog/blob/master/202203/20220302_01.md) +- [《PostgreSQL ghtree 实现的海明距离排序索引, 性能不错(模糊图像) - pg-knn_hamming - bit string 比特字符串 相似度搜索》](https://github.com/digoal/blog/blob/master/202003/20200326_08.md) +- [《PostgreSQL bktree 索引 using gist 例子 - 海明距离检索 - 短文相似、模糊图像搜索 - bit string 比特字符串 相似度搜索》](https://github.com/digoal/blog/blob/master/202003/20200324_29.md) +- [《阿里云 PostgreSQL 案例精选 2 - 图像识别、人脸识别、相似特征检索、相似人群圈选》](https://github.com/digoal/blog/blob/master/202002/20200227_01.md) +- [《PostgreSQL+MySQL 联合解决方案 - 第 11 课视频 - 多维向量相似搜索 - 图像识别、相似人群圈选等》](https://github.com/digoal/blog/blob/master/202001/20200115_01.md) +- [《PostgreSQL 阿里云 rds pg 发布高维向量索引,支持图像识别、人脸识别 - pase 插件》](https://github.com/digoal/blog/blob/master/201912/20191219_02.md) +- [《阿里云 PostgreSQL 向量搜索、相似搜索、图像搜索 插件 palaemon - ivfflat , hnsw , nsg , ssg》](https://github.com/digoal/blog/blob/master/201908/20190815_01.md) +- [《脑王水哥王昱珩惜败人工智能, 这不可能. - 图像识别到底是什么鬼》](https://github.com/digoal/blog/blob/master/201701/20170122_01.md) +- [《(AR 虚拟现实)红包 技术思考 - GIS 与图像识别的完美结合》](https://github.com/digoal/blog/blob/master/201701/20170113_01.md) +- [《PostgreSQL 在视频、图片去重,图像搜索业务中的应用》](https://github.com/digoal/blog/blob/master/201611/20161126_01.md) + +https://github.com/postgrespro/imgsmlr + +https://github.com/libgd/libgd diff --git a/docs/zh/practice/parray.md b/docs/zh/practice/parray.md new file mode 100644 index 00000000000..388e33d1193 --- /dev/null +++ b/docs/zh/practice/parray.md @@ -0,0 +1,272 @@ +--- +author: digoal +date: 2023/02/03 +minute: 20 +--- + +# 索引加速"数组、JSON"内元素的模糊搜索 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版通过 parray_gin 实现高效率 数组、JSON 内元素的模糊搜索 + +测试环境为 macos+docker, polardb 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 测试 + +PG 模糊搜索采用 GIN 倒排索引, 使用 pg_trgm 插件将字符串前 1 后 2 加上空格后, 按连续 3 个字符切分, 并对切分后的 token 建立 token,ctid 的倒排索引. + +在模糊搜索时, 可以将搜索字符串按同样方式切分, 根据倒排搜索快速的定位到对应的 ctid. + +- [《PostgreSQL 数组或 JSON 内容的模糊匹配索引插件: parray_gin》](https://github.com/digoal/blog/blob/master/202110/20211005_01.md) +- [《重新发现 PostgreSQL 之美 - 16 like '%西出函谷关%' 模糊查询》](https://github.com/digoal/blog/blob/master/202106/20210607_01.md) +- [《PostgreSQL 应用开发解决方案最佳实践系列课程 - 1. 中文分词与模糊查询》](https://github.com/digoal/blog/blob/master/202105/20210502_01.md) +- [《[直播]在数据库中跑全文检索、模糊查询 SQL 会不会被开除?》](https://github.com/digoal/blog/blob/master/202009/20200913_01.md) +- [《PostgreSQL 模糊查询、相似查询 (like '%xxx%') pg_bigm 比 pg_trgm 优势在哪?》](https://github.com/digoal/blog/blob/master/202009/20200912_01.md) +- [《PostgreSQL 模糊查询增强插件 pgroonga , pgbigm (含单字、双字、多字、多字节字符) - 支持 JSON 模糊查询等》](https://github.com/digoal/blog/blob/master/202003/20200330_01.md) +- [《PostgreSQL ghtree 实现的海明距离排序索引, 性能不错(模糊图像) - pg-knn_hamming - bit string 比特字符串 相似度搜索》](https://github.com/digoal/blog/blob/master/202003/20200326_08.md) +- [《PostgreSQL VagueGeometry vague spatial data - VASA (Vague Spatial Algebra) for PG - 模糊空间数据》](https://github.com/digoal/blog/blob/master/202003/20200326_02.md) +- [《PostgreSQL bktree 索引 using gist 例子 - 海明距离检索 - 短文相似、模糊图像搜索 - bit string 比特字符串 相似度搜索》](https://github.com/digoal/blog/blob/master/202003/20200324_29.md) +- [《PostgreSQL+MySQL 联合解决方案 - 第 12 课视频 - 全文检索、中文分词、模糊查询、相似文本查询》](https://github.com/digoal/blog/blob/master/202001/20200116_01.md) +- [《PostgreSQL 数组里面的元素,模糊搜索,模糊查询,like,前后百分号,正则查询,倒排索引》](https://github.com/digoal/blog/blob/master/201903/20190320_01.md) +- [《PostgreSQL 一复合查询 SQL 优化例子 - (多个 exists , 范围检索 , IN 检索 , 模糊检索 组合)》](https://github.com/digoal/blog/blob/master/201806/20180612_01.md) +- [《PostgreSQL 模糊查询+大量重复值匹配 实践 - 分区索引 = any (array())》](https://github.com/digoal/blog/blob/master/201805/20180502_01.md) +- [《PostgreSQL 模糊查询 与 正则匹配 性能差异与 SQL 优化建议》](https://github.com/digoal/blog/blob/master/201801/20180118_03.md) +- [《用 PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC 查询》](https://github.com/digoal/blog/blob/master/201712/20171205_02.md) +- [《HTAP 数据库 PostgreSQL 场景与性能测试之 12 - (OLTP) 字符串搜索 - 前后模糊查询》](https://github.com/digoal/blog/blob/master/201711/20171107_13.md) +- [《HTAP 数据库 PostgreSQL 场景与性能测试之 9 - (OLTP) 字符串模糊查询 - 含索引实时写入》](https://github.com/digoal/blog/blob/master/201711/20171107_10.md) +- [《多国语言字符串的加密、全文检索、模糊查询的支持》](https://github.com/digoal/blog/blob/master/201710/20171020_01.md) +- [《Greenplum 模糊查询 实践》](https://github.com/digoal/blog/blob/master/201710/20171016_04.md) +- [《PostgreSQL 中英文混合分词特殊规则(中文单字、英文单词) - 中英分明》](https://github.com/digoal/blog/blob/master/201711/20171104_03.md) +- [《PostgreSQL 模糊查询最佳实践 - (含单字、双字、多字模糊查询方法)》](https://github.com/digoal/blog/blob/master/201704/20170426_01.md) +- [《PostgreSQL 全表 全字段 模糊查询的毫秒级高效实现 - 搜索引擎颤抖了》](https://github.com/digoal/blog/blob/master/201701/20170106_04.md) +- [《从难缠的模糊查询聊开 - PostgreSQL 独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》](https://github.com/digoal/blog/blob/master/201612/20161231_01.md) +- [《中文模糊查询性能优化 by PostgreSQL trgm》](https://github.com/digoal/blog/blob/master/201605/20160506_02.md) +- [《PostgreSQL 百亿数据 秒级响应 正则及模糊查询》](https://github.com/digoal/blog/blob/master/201603/20160302_01.md) + +即使没有 parray_gin, 我们也可以将数组或 JSON 格式化处理后, 用大字符串和 pg_trgm 来实现元素模糊搜索. 例如 + +``` +array['abc','aaa','hello'] + +把元素内容的sep char和quote char转义, 然后直接把 'abc','aaa','hello'当成字符串处理. 建立pg_trgm gin索引. + +搜索元素时如果需要指定元素前缀或后缀搜索, 那么带上sep char和quote char即可. +``` + +使用 parray_gin 就简单多了, 不需要处理那么多. + +下面测试 PolarDB+parray_gin 实现数组内元素的模糊搜索. + +``` +git clone --depth 1 http://github.com/theirix/parray_gin/ + +cd parray_gin/ + +USE_PGXS=1 make + +USE_PGXS=1 make install + +export PGHOST=localhost + +[postgres@1bbb8082aa60 parray_gin]$ psql +psql (11.9) +Type "help" for help. + +postgres=# \q +[postgres@1bbb8082aa60 parray_gin]$ USE_PGXS=1 make installcheck +/home/postgres/tmp_basedir_polardb_pg_1100_bld/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress --inputdir=./ --bindir='/home/postgres/tmp_basedir_polardb_pg_1100_bld/bin' --inputdir=test --dbname=contrib_regression op index +(using postmaster on localhost, default port) +============== dropping database "contrib_regression" ============== +NOTICE: database "contrib_regression" does not exist, skipping +DROP DATABASE +============== creating database "contrib_regression" ============== +CREATE DATABASE +ALTER DATABASE +============== running regression test queries ============== +test op ... ok +test index ... ok + + +========================================================== + All 2 tests passed. + + POLARDB: + All 2 tests, 0 tests in ignore, 0 tests in polar ignore. +========================================================== +``` + +``` +create table t (id int, info text[]); + +create or replace function gen_text_arr(int) returns text[] as $$ + select array(select md5(random()::text) from generate_series(1,$1)); +$$ language sql strict; + +postgres=# select gen_text_arr(10); +-[ RECORD 1 ]+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +gen_text_arr | {4134ee81fcdc29da486df37a1725e1cc,d0bb424307f93a6374d1af5a4b1c0451,def4b4bc24bc6aefb084df8a1571d773,aff17d39b2c3e8ccebf1059c2cd466dc,3988cb3f89372081c6444b7f8a825cf6,77d3a12d9a5159bd2e11fac1782eaf90,0ecac2cd508f60221b31934ea1128223,622819cfa7c3e3e600f70ed90265edaa,e9311e8d6f23be74b2e73eae4408aaa8,207eb23a50212cb101f83a6041211d90} + +postgres=# insert into t select id , gen_text_arr(10) from generate_series(1,1000) id; +INSERT 0 1000 + +postgres=# select * from t where info @@> array['%4b1%']; + id | + info + +-----+---------------------------------------------------------------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------- + 14 | {745b761d7145edb79904c5217c0ec0b4,eab9d9d4de9afc8c7a2bc4cdcd3bcb2a,3116cd48046936709c56e952f5d50380,642eec5d3c17721dadb89759ac116821,49ba14c3c71b73c0a3b8 +6aa6f20a4f9c,01632c5889d4ae642422fea8620187e1,078ea7bf29a6f8bf53c6abcec98df5ad,2548e08ad3cb87dfcfe55a86e47cc60f,0c7002203e72d854f9c0643bec6c59b7,cfdd57d32f4bcee +8b4b1adfe11a08a81} + 33 | {639e7f990ef271b24b1ac1a1f154476b,5c0dd44f87821cf555fb579f2dd9871d,b3118d34a6f788ad9c9d3343743900bc,798abd4aece1cbe604e608294227dde6,f08757d02fd0db9d08c9 +2240c55ec14b,54f206220cf2097f0e2a6f630a7871be,585d04664a022ab49607d0d6ff18fc89,f5681d20b2b923973652f9952df6b71d,1d204241c105c78ba0514bdf1dba6bbb,5f427b5c2b65e0d +e41b70e804dfcc41d} +... + +postgres=# select * from t where info @@> array['%4b1ac%']; + id | + info + +----+----------------------------------------------------------------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------ + 33 | {639e7f990ef271b24b1ac1a1f154476b,5c0dd44f87821cf555fb579f2dd9871d,b3118d34a6f788ad9c9d3343743900bc,798abd4aece1cbe604e608294227dde6,f08757d02fd0db9d08c92 +240c55ec14b,54f206220cf2097f0e2a6f630a7871be,585d04664a022ab49607d0d6ff18fc89,f5681d20b2b923973652f9952df6b71d,1d204241c105c78ba0514bdf1dba6bbb,5f427b5c2b65e0de +41b70e804dfcc41d} +(1 row) + +postgres=# select * from t where info @@> array['%4b1acd%']; + id | info +----+------ +(0 rows) + +postgres=# explain select * from t where info @@> array['%4b1ac%']; + QUERY PLAN +-------------------------------------------------------------------------- + Bitmap Heap Scan on t (cost=28.01..32.02 rows=1 width=36) + Recheck Cond: (info @@> '{%4b1ac%}'::text[]) + -> Bitmap Index Scan on t_info_idx (cost=0.00..28.01 rows=1 width=0) + Index Cond: (info @@> '{%4b1ac%}'::text[]) +(4 rows) + +postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t where info @@> array['%4b1ac%', '%8fc89']; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------- + Bitmap Heap Scan on public.t (cost=60.01..64.02 rows=1 width=36) (actual time=0.121..0.122 rows=1 loops=1) + Output: id, info + Recheck Cond: (t.info @@> '{%4b1ac%,%8fc89}'::text[]) + Heap Blocks: exact=1 + Buffers: shared hit=16 + -> Bitmap Index Scan on t_info_idx (cost=0.00..60.01 rows=1 width=0) (actual time=0.109..0.109 rows=1 loops=1) + Index Cond: (t.info @@> '{%4b1ac%,%8fc89}'::text[]) + Buffers: shared hit=15 + Planning Time: 0.075 ms + Execution Time: 0.144 ms +(10 rows) + +Time: 0.699 ms +postgres=# select * from t where info @@> array['%4b1ac%', '%8fc89']; + id | + info + +----+----------------------------------------------------------------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------ + 33 | {639e7f990ef271b24b1ac1a1f154476b,5c0dd44f87821cf555fb579f2dd9871d,b3118d34a6f788ad9c9d3343743900bc,798abd4aece1cbe604e608294227dde6,f08757d02fd0db9d08c92 +240c55ec14b,54f206220cf2097f0e2a6f630a7871be,585d04664a022ab49607d0d6ff18fc89,f5681d20b2b923973652f9952df6b71d,1d204241c105c78ba0514bdf1dba6bbb,5f427b5c2b65e0de +41b70e804dfcc41d} +(1 row) + +Time: 0.733 ms + +postgres=# insert into t select id , gen_text_arr(10) from generate_series(1,120000) id; +INSERT 0 100000 +Time: 9242.877 ms (00:09.243) +postgres=# \dt+ + List of relations + Schema | Name | Type | Owner | Size | Description +--------+------+-------+----------+-------+------------- + public | t | table | postgres | 50 MB | +(1 row) + + + +postgres=# select * from t where info @@> array['%4b1ac%', '%8fc89']; + id | + info + +----+----------------------------------------------------------------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------ + 33 | {639e7f990ef271b24b1ac1a1f154476b,5c0dd44f87821cf555fb579f2dd9871d,b3118d34a6f788ad9c9d3343743900bc,798abd4aece1cbe604e608294227dde6,f08757d02fd0db9d08c92 +240c55ec14b,54f206220cf2097f0e2a6f630a7871be,585d04664a022ab49607d0d6ff18fc89,f5681d20b2b923973652f9952df6b71d,1d204241c105c78ba0514bdf1dba6bbb,5f427b5c2b65e0de +41b70e804dfcc41d} +(1 row) + +Time: 4.783 ms + +postgres=# explain (analyze,timing,costs,buffers,verbose) select * from t where info @@> array['%4b1ac%', '%8fc89']; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------- + Bitmap Heap Scan on public.t (cost=96.94..529.04 rows=121 width=36) (actual time=4.114..4.115 rows=1 loops=1) + Output: id, info + Recheck Cond: (t.info @@> '{%4b1ac%,%8fc89}'::text[]) + Heap Blocks: exact=1 + Buffers: shared hit=48 + -> Bitmap Index Scan on t_info_idx (cost=0.00..96.91 rows=121 width=0) (actual time=4.103..4.103 rows=1 loops=1) + Index Cond: (t.info @@> '{%4b1ac%,%8fc89}'::text[]) + Buffers: shared hit=47 + Planning Time: 0.090 ms + Execution Time: 4.170 ms +(10 rows) +``` + +全表扫描性能差了几十倍 + +``` +postgres=# set enable_bitmapscan =off; +SET +Time: 0.473 ms +postgres=# explain (analyze,timing,costs,buffers,verbose) select * from t where info @@> array['%4b1ac%', '%8fc89']; + QUERY PLAN +---------------------------------------------------------------------------------------------------------- + Seq Scan on public.t (cost=0.00..7881.50 rows=121 width=36) (actual time=0.632..193.929 rows=1 loops=1) + Output: id, info + Filter: (t.info @@> '{%4b1ac%,%8fc89}'::text[]) + Rows Removed by Filter: 120999 + Buffers: shared hit=6229 read=140 + Planning Time: 0.081 ms + Execution Time: 193.947 ms +(7 rows) + +Time: 194.697 ms +postgres=# select * from t where info @@> array['%4b1ac%', '%8fc89']; + id | + info + +----+----------------------------------------------------------------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------ + 33 | {639e7f990ef271b24b1ac1a1f154476b,5c0dd44f87821cf555fb579f2dd9871d,b3118d34a6f788ad9c9d3343743900bc,798abd4aece1cbe604e608294227dde6,f08757d02fd0db9d08c92 +240c55ec14b,54f206220cf2097f0e2a6f630a7871be,585d04664a022ab49607d0d6ff18fc89,f5681d20b2b923973652f9952df6b71d,1d204241c105c78ba0514bdf1dba6bbb,5f427b5c2b65e0de +41b70e804dfcc41d} +(1 row) + +Time: 199.342 ms +``` + +有了 parray_gin, 在设计数据结构时, 可以更加灵活, 例如将“一个时间段、一个组、一个对象”的“多个标签、多个信息”打包成 1 行数组存储, 对数组进行元素搜索, 则可以快速匹配到符合条件的“一个时间段、一个组、一个对象”. + +## 参考 + +http://github.com/theirix/parray_gin/ + +[《PostgreSQL 数组或 JSON 内容的模糊匹配索引插件: parray_gin》](https://github.com/digoal/blog/blob/master/202110/20211005_01.md) diff --git a/docs/zh/practice/pg_trgm.md b/docs/zh/practice/pg_trgm.md new file mode 100644 index 00000000000..d9e8216b085 --- /dev/null +++ b/docs/zh/practice/pg_trgm.md @@ -0,0 +1,104 @@ +--- +author: digoal +date: 2023/02/03 +minute: 20 +--- + +# 不用再害怕 like 模糊查询 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的 +价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版通过 pg_trgm GIN 索引实现高效率 `like '%xxx%'` 模糊查询 + +测试环境为 macos+docker, polardb 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 原理 + +pg_trgm 将字符串前面加 2 个空格, 后面加 1 个空格, 按每连续的 3 个字符为一组进行切分, 生成一堆 tokens, 例如 hello 被切分为`{" h"," he",ell,hel,llo,"lo "}1` + +``` +postgres=# select show_trgm('hello'); + show_trgm +--------------------------------- + {" h"," he",ell,hel,llo,"lo "} +(1 row) +``` + +对 tokens 创建 gin 索引, 在进行模糊搜索(甚至支持正则搜索)时, 将针对目标字符串条件也进行同样的 token 化处理(只是前后不需要再加空格, 除非输入了前缀或者后缀限定), 可以使用 gin 索引快速匹配到目标行. + +更多原理可参考: + +- [《重新发现 PostgreSQL 之美 - 16 like '%西出函谷关%' 模糊查询》](https://github.com/digoal/blog/blob/master/202106/20210607_01.md) + +## 在 PolarDB 中使用 pg_trgm GIN 索引实现高效率 `like '%xxx%'` 模糊查询 + +1、建表, 生成 200 万条测试文本 + +``` +create table tbl (id int, info text); + +insert into tbl select id, md5(random()::text) from generate_series(1,1000000) id; +insert into tbl select id, md5(random()::text) from generate_series(1,1000000) id; +``` + +2、在没有索引的情况下, 进行模糊查询, 需要全表扫描, 耗时巨大. + +``` +explain (analyze,verbose,timing,costs,buffers) select * from tbl where info like '%abcd%'; + +postgres=# explain (analyze,verbose,timing,costs,buffers) select * from tbl where info like '%abcd%'; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------- + Seq Scan on public.tbl (cost=0.00..41665.50 rows=200 width=37) (actual time=2.505..522.958 rows=851 loops=1) + Output: id, info + Filter: (tbl.info ~~ '%abcd%'::text) + Rows Removed by Filter: 1999149 + Buffers: shared hit=16645 read=22 dirtied=8334 + Planning Time: 1.643 ms + Execution Time: 523.138 ms +(7 rows) +``` + +3、创建 pg_trgm 插件, 以及 gin 索引. + +``` +postgres=# create extension pg_trgm ; +CREATE EXTENSION + +create index on tbl using gin (info gin_trgm_ops); +``` + +4、使用 pg_trgm GIN 索引实现高效率 `like '%xxx%'` 模糊查询 + +``` +explain (analyze,verbose,timing,costs,buffers) select * from tbl where info like '%abcd%'; + +postgres=# explain (analyze,verbose,timing,costs,buffers) select * from tbl where info like '%abcd%'; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------- + Bitmap Heap Scan on public.tbl (cost=29.55..762.82 rows=200 width=37) (actual time=2.445..3.962 rows=851 loops=1) + Output: id, info + Recheck Cond: (tbl.info ~~ '%abcd%'::text) + Rows Removed by Index Recheck: 96 + Heap Blocks: exact=926 + Buffers: shared hit=946 + -> Bitmap Index Scan on tbl_info_idx (cost=0.00..29.50 rows=200 width=0) (actual time=2.287..2.288 rows=947 loops=1) + Index Cond: (tbl.info ~~ '%abcd%'::text) + Buffers: shared hit=20 + Planning Time: 0.239 ms + Execution Time: 4.112 ms +(11 rows) +``` + +性能提升 100 多倍. + +## 参考 + +[《重新发现 PostgreSQL 之美 - 16 like '%西出函谷关%' 模糊查询》](https://github.com/digoal/blog/blob/master/202106/20210607_01.md) diff --git a/docs/zh/practice/pgpool.md b/docs/zh/practice/pgpool.md new file mode 100644 index 00000000000..b23d97233ae --- /dev/null +++ b/docs/zh/practice/pgpool.md @@ -0,0 +1,312 @@ +--- +author: digoal +date: 2023/02/03 +minute: 25 +--- + +# PolarDB 读写分离连接池配置 - pgpool-II + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版 使用 pgpool-II 实现透明读写分离. + +- pgpool-II 是 PostgreSQL 读写分离中间件, 由于 PolarDB 是计算存储分离架构, 和 aws aurora 一样, 只需要配置 pgpool 的负载均衡, 不需要配置它 ha 功能. +- ha 功能建议采用 polardb 开源生态产品, 例如乘数科技的集群管理软件, 配置 pgpool 时使用 rw, ro 节点对应的 vip 即可(vip 由乘数的集群管理软件来管理). + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 部署 pgpool-II + +``` +cd ~ +wget https://www.pgpool.net/mediawiki/download.php?f=pgpool-II-4.4.1.tar.gz -O pgpool-II-4.4.1.tar.gz + +tar -zxvf pgpool-II-4.4.1.tar.gz + +cd pgpool-II-4.4.1 + +./configure --prefix=/usr/local/pgpool4.4.1 --with-openssl + +make -j 8 +sudo make install +``` + +配置动态库和默认路径 + +``` +sudo vi /etc/ld.so.conf +# addd +/usr/local/pgpool4.4.1/lib + +sudo ldconfig + + + + +vi ~/.bash_profile +# add +export PATH=/usr/local/pgpool4.4.1/bin:$PATH + +. ~/.bash_profile +``` + +## 配置 pgpool-II + +polardb 3 节点配置如下: + +``` +[postgres@1373488a35ab ~]$ netstat -anp|grep LISTEN +tcp 0 0 0.0.0.0:5434 0.0.0.0:* LISTEN 72/postgres +tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 9/postgres +tcp 0 0 0.0.0.0:5433 0.0.0.0:* LISTEN 33/postgres +tcp6 0 0 :::5434 :::* LISTEN 72/postgres +tcp6 0 0 :::5432 :::* LISTEN 9/postgres +tcp6 0 0 :::5433 :::* LISTEN 33/postgres +unix 2 [ ACC ] STREAM LISTENING 22905 9/postgres ./.s.PGSQL.5432 +unix 2 [ ACC ] STREAM LISTENING 18212 33/postgres ./.s.PGSQL.5433 +unix 2 [ ACC ] STREAM LISTENING 24071 72/postgres ./.s.PGSQL.5434 + + +[postgres@1373488a35ab ~]$ psql -p 5432 -c "select pg_is_in_recovery();" + pg_is_in_recovery +------------------- + f +(1 row) + +[postgres@1373488a35ab ~]$ psql -p 5433 -c "select pg_is_in_recovery();" + pg_is_in_recovery +------------------- + t +(1 row) + +[postgres@1373488a35ab ~]$ psql -p 5434 -c "select pg_is_in_recovery();" + pg_is_in_recovery +------------------- + t +(1 row) +``` + +polardb 与 aurora 类似, 共享存储集群模式, 无需 pgpool 来管理 HA. + +https://www.pgpool.net/docs/latest/en/html/example-aurora.html + +配置 pgpool.conf + +``` +cd /usr/local/pgpool4.4.1/etc + +sudo vi pgpool.conf + +listen_addresses = '0.0.0.0' +port = 9999 +unix_socket_directories = '/tmp' +pcp_listen_addresses = 'localhost' +pcp_port = 9898 +pcp_socket_dir = '/tmp' +log_destination = 'stderr' +logging_collector = on +log_directory = '/tmp/pgpool_logs' +pid_file_name = '/var/run/pgpool/pgpool.pid' +logdir = '/tmp' + +backend_clustering_mode = 'streaming_replication' +load_balance_mode = on +sr_check_period = 0 +health_check_period = 0 +failover_on_backend_shutdown=off +failover_on_backend_error=off +enable_pool_hba = on + +backend_hostname0 = '127.0.0.1' +backend_port0 = '5432' +backend_weight0 = 1 +backend_application_name0 = 'polardb_primray' +backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER' + +backend_hostname1 = '127.0.0.1' +backend_port1 = '5433' +backend_weight1 = 2 +backend_application_name1 = 'polardb_reader1' +backend_flag1 = 'DISALLOW_TO_FAILOVER' + +backend_hostname2 = '127.0.0.1' +backend_port2 = '5434' +backend_weight2 = 2 +backend_application_name2 = 'polardb_reader2' +backend_flag2 = 'DISALLOW_TO_FAILOVER' +``` + +配置 pool_hba.conf + +``` +sudo vi pool_hba.conf +# add +host all all 0.0.0.0/0 md5 +``` + +配置 pgpool 数据库用户密码文件 pool_passwd + +``` +[postgres@1373488a35ab etc]$ sudo pg_md5 --md5auth --username=digoal pwd123 + +[postgres@1373488a35ab etc]$ cat /usr/local/pgpool4.4.1/etc/pool_passwd +digoal:md531a770cec82aa37e217bb6e46c3f9d55 + + + +-- 实际上就是pwd+username的md5值 +postgres=# select md5('pwd123digoal'); + md5 +---------------------------------- + 31a770cec82aa37e217bb6e46c3f9d55 +(1 row) +``` + +在数据库中创建相应用户 + +``` +postgres=# create user digoal superuser encrypted password 'pwd123' login; +CREATE ROLE +``` + +配置 pcp 管理用户密码文件 pcp.conf + +``` +postgres=# select md5('pwd123'); + md5 +---------------------------------- + 45cb41b32dcfb917ccd8614f1536d6da +(1 row) + + + +cd /usr/local/pgpool4.4.1/etc +sudo vi pcp.conf +pcpadm:45cb41b32dcfb917ccd8614f1536d6da +``` + +准备 pgpool 运行时 pid 文件目录和日志目录 + +``` +sudo mkdir /var/run/pgpool +sudo mkdir /tmp/pgpool_logs +``` + +启动 pgpool + +``` +sudo pgpool +``` + +查看 pgpool 监听 + +``` +[postgres@1373488a35ab pgpool_logs]$ netstat -anp|grep LISTE +(Not all processes could be identified, non-owned process info + will not be shown, you would have to be root to see it all.) +tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN - +tcp 0 0 0.0.0.0:5434 0.0.0.0:* LISTEN 72/postgres +tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 9/postgres +tcp 0 0 0.0.0.0:5433 0.0.0.0:* LISTEN 33/postgres +tcp 0 0 127.0.0.1:9898 0.0.0.0:* LISTEN - +tcp6 0 0 :::5434 :::* LISTEN 72/postgres +tcp6 0 0 :::5432 :::* LISTEN 9/postgres +tcp6 0 0 :::5433 :::* LISTEN 33/postgres +unix 2 [ ACC ] STREAM LISTENING 22905 9/postgres ./.s.PGSQL.5432 +unix 2 [ ACC ] STREAM LISTENING 18212 33/postgres ./.s.PGSQL.5433 +unix 2 [ ACC ] STREAM LISTENING 24071 72/postgres ./.s.PGSQL.5434 +unix 2 [ ACC ] STREAM LISTENING 30964 - /tmp/.s.PGSQL.9999 +unix 2 [ ACC ] STREAM LISTENING 30967 - /tmp/.s.PGSQL.9898 +``` + +使用 pcp 管理命令查看 pgpool 中间件状态 + +``` +pcp_node_info -U pcpadm -p 9898 +Password: +127.0.0.1 5432 2 0.200000 up unknown primary unknown 0 none none 2023-01-02 03:44:20 +127.0.0.1 5433 2 0.400000 up unknown standby unknown 0 none none 2023-01-02 03:44:20 +127.0.0.1 5434 2 0.400000 up unknown standby unknown 0 none none 2023-01-02 03:44:20 +``` + +``` +[postgres@1373488a35ab etc]$ pcp_node_count -U pcpadm -p 9898 +Password: +3 +``` + +``` +pcp_pool_status -U pcpadm -h localhost -p 9898 +Password: +... +name : backend_application_name1 +value: polardb_reader1 +desc : application_name for backend #1 + +name : backend_hostname2 +value: 127.0.0.1 +desc : backend #2 hostname + +name : backend_port2 +value: 5434 +desc : backend #2 port number + +name : backend_weight2 +value: 0.400000 +desc : weight of backend #2 + +name : backend_flag2 +value: DISALLOW_TO_FAILOVER +desc : backend #2 flag +... +``` + +使用 pgpool 代理链接 polardb + +``` +export PGPASSWORD=pwd123 +export PGDATABASE=postgres +psql -p 9999 -U digoal -c "select * from pg_stat_activity where pid=pg_backend_pid();" +``` + +## 测试 pgpool 读写分离 + +``` +pgbench -i -s 1 -h 127.0.0.1 -p 9999 -U digoal postgres +``` + +``` +pgbench -n -r -P 1 -c 8 -j 8 -T 10 -S -h 127.0.0.1 -p 9999 -U digoal postgres + + + + + +[postgres@1373488a35ab ~]$ psql -p 5432 -c "select count(*) from pg_stat_activity where application_name='pgbench';" + count +------- + 8 +(1 row) + +[postgres@1373488a35ab ~]$ psql -p 5433 -c "select count(*) from pg_stat_activity where application_name='pgbench';" + count +------- + 8 +(1 row) + +[postgres@1373488a35ab ~]$ psql -p 5434 -c "select count(*) from pg_stat_activity where application_name='pgbench';" + count +------- + 8 +(1 row) +``` + +## 参考 + +https://www.pgpool.net/docs/latest/en/html/index.html diff --git a/docs/zh/practice/pgrouting.md b/docs/zh/practice/pgrouting.md new file mode 100644 index 00000000000..c9458750404 --- /dev/null +++ b/docs/zh/practice/pgrouting.md @@ -0,0 +1,101 @@ +--- +author: digoal +date: 2023/02/03 +minute: 10 +--- + +# 如何解决出行、快递、配送、商旅等场景的路径规划需求 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍使用 PolarDB 开源版 部署 pgrouting 支撑出行、快递、配送等商旅问题的路径规划业务 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## pgrouting 的特性 + +pgRouting library contains following features: + +- All Pairs Shortest Path, Johnson’s Algorithm +- All Pairs Shortest Path, Floyd-Warshall Algorithm +- Shortest Path A\* +- Bi-directional Dijkstra Shortest Path +- Bi-directional A\* Shortest Path +- Shortest Path Dijkstra +- Driving Distance +- K-Shortest Path, Multiple Alternative Paths +- K-Dijkstra, One to Many Shortest Path +- Traveling Sales Person +- Turn Restriction Shortest Path (TRSP) + +## 部署 pgrouting on PolarDB + +1、boost 依赖 + +``` +wget https://boostorg.jfrog.io/artifactory/main/release/1.69.0/source/boost_1_69_0.tar.bz2 + +tar -jxvf boost_1_69_0.tar.bz2 + +cd boost_1_69_0 + +./bootstrap.sh + +sudo ./b2 --prefix=/usr/local/boost -a install +``` + +2、pgrouting + +``` +wget https://github.com/pgRouting/pgrouting/archive/refs/tags/v3.4.2.tar.gz + +tar -zxvf v3.4.2.tar.gz + +cd pgrouting-3.4.2/ + +// 找到boost定制配置参数 +// less -i CMakeLists.txt + +mkdir build + +cd build + +cmake .. -DBOOST_ROOT=/usr/local/boost + +make -j 4 +sudo make install +``` + +3、加载 postgis 和 pgrouting 插件 on PolarDB + +``` +[postgres@1373488a35ab ~]$ psql +psql (11.9) +Type "help" for help. + +postgres=# create extension postgis ; +postgres=# create extension pgrouting ; +CREATE EXTENSION +postgres=# \dx + List of installed extensions + Name | Version | Schema | Description +-----------+---------+------------+------------------------------------------------------------ + pgrouting | 3.4.2 | public | pgRouting Extension + plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language + postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions +(3 rows) +``` + +更多使用方式请参考: +https://pgrouting.org/documentation.html + +- [《PostgreSQL openstreetmap 地图数据、路网数据服务 - 高速下载、导入 gis, pgrouting》](https://github.com/digoal/blog/blob/master/202110/20211008_01.md) +- [《行程规划 , 商旅问题 , 旅游问题 , postgis , pgrouting , postgresql , Traveling Salesman Problem (or TSP)》](https://github.com/digoal/blog/blob/master/202103/20210317_04.md) +- [《[未完待续] pgrouting 在机票业务中的应用 - 实时最佳转机计算》](https://github.com/digoal/blog/blob/master/201711/20171104_01.md) +- [《路径规划应用 pgRouting 实践与开放地图导入 - Openstreetmap PBF》](https://github.com/digoal/blog/blob/master/201508/20150813_03.md) diff --git a/docs/zh/practice/pointcloud.md b/docs/zh/practice/pointcloud.md new file mode 100644 index 00000000000..b2ac6caf1a2 --- /dev/null +++ b/docs/zh/practice/pointcloud.md @@ -0,0 +1,435 @@ +--- +author: digoal +date: 2023/02/03 +minute: 15 +--- + +# 点云技术与数字孪生场景实践 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版 通过 pgpointcloud 实现高效孪生数据存储和管理 - 支撑工厂、农业等现实世界数字化|数字孪生, 元宇宙相关业务的虚拟现实结合 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## pgpointcloud 的特性 + +pgpointcloud 的原理是将很多个点存储到一个值(点集)里面, 点集可以用来表达轨迹、扫描影像, 业务操作通常包含: + +- 判断轨迹是否相交(指包住两个轨迹的边界(bound box)是否相交), 实际上使用 PostGIS 的 trajectories 可能更适合. +- 判断轨迹是否落到某个给定区域(指轨迹的边界(bound box)是否和指定几何对象是否相交) +- 指定区域将内部的轨迹抠出(将落在指定几何对象内部的点从点集中抠出) +- 合并轨迹 +- 压缩轨迹 +- 3D 建模和数据存储 +- 3D 影像的抠出 + +注意这里说的“轨迹”不带时间, 只是为了辅助理解所以称之为轨迹, 实际上 pgpointcloud 不适合轨迹业务. 轨迹建议使用 postgis. 或者阿里云 ganos. + +- https://postgis.net/docs/manual-3.3/reference.html#Temporal + +pgpointcloud 存储点集的优势: + +- 支持压缩, 节省成本 +- 片存储, 存取效率高 +- 支持内置点云操作算法, 同时可扩展算法, 无需提取数据到本地进行计算, 大幅度提升计算效率 +- 支持 GIS, 方便和地理信息结合, 更好的满足虚拟现实|数字孪生业务需求 +- 支持索引, 过滤效率高 + +## 部署 pgpointcloud on PolarDB + +``` +wget https://github.com/pgpointcloud/pointcloud/archive/refs/tags/v1.2.4.tar.gz + +tar -zxvf v1.2.4.tar.gz + +cd pointcloud-1.2.4/ + +./autogen.sh + +./configure + +make -j 4 + +sudo make install +``` + +``` +[postgres@1373488a35ab pointcloud-1.2.4]$ psql +psql (11.9) +Type "help" for help. + +postgres=# create extension postgis; +CREATE EXTENSION +postgres=# create extension pointcloud; +CREATE EXTENSION +postgres=# create extension pointcloud_postgis ; +CREATE EXTENSION +``` + +## 点云使用举例 + +1、点 + +``` +SELECT PC_MakePoint(1, ARRAY[-127, 45, 124.0, 4.0]); + +010100000064CEFFFF94110000703000000400 +``` + +Insert some test values into the points table: + +``` +INSERT INTO points (pt) +SELECT PC_MakePoint(1, ARRAY[x,y,z,intensity]) +FROM ( + SELECT + -127+a/100.0 AS x, + 45+a/100.0 AS y, + 1.0*a AS z, + a/10 AS intensity + FROM generate_series(1,100) AS a +) AS values; +``` + +``` +SELECT PC_AsText('010100000064CEFFFF94110000703000000400'::pcpoint); + +{"pcid":1,"pt":[-127,45,124,4]} +``` + +2、点集 + +``` +INSERT INTO patches (pa) +SELECT PC_Patch(pt) FROM points GROUP BY id/10; +``` + +``` +SELECT PC_AsText(PC_MakePatch(1, ARRAY[-126.99,45.01,1,0, -126.98,45.02,2,0, -126.97,45.03,3,0])); + +{"pcid":1,"pts":[ + [-126.99,45.01,1,0],[-126.98,45.02,2,0],[-126.97,45.03,3,0] +]} +``` + +``` +SELECT PC_AsText(pa) FROM patches LIMIT 1; + +{"pcid":1,"pts":[ + [-126.99,45.01,1,0],[-126.98,45.02,2,0],[-126.97,45.03,3,0], + [-126.96,45.04,4,0],[-126.95,45.05,5,0],[-126.94,45.06,6,0], + [-126.93,45.07,7,0],[-126.92,45.08,8,0],[-126.91,45.09,9,0] +]} +``` + +3、判断轨迹是否相交(指包住两个轨迹的边界(bound box)是否相交), 实际上使用 PostGIS 的 trajectories 可能更适合. + +``` +-- Patch should intersect itself +SELECT PC_Intersects( + '01010000000000000001000000C8CEFFFFF8110000102700000A00'::pcpatch, + '01010000000000000001000000C8CEFFFFF8110000102700000A00'::pcpatch); + +t +``` + +4、判断轨迹是否落到某个给定区域(指轨迹的边界(bound box)是否和指定几何对象是否相交) + +``` +SELECT PC_Intersects('SRID=4326;POINT(-126.451 45.552)'::geometry, pa) +FROM patches WHERE id = 7; + +t +``` + +5、指定区域将内部的轨迹抠出(将落在指定几何对象内部的点从点集中抠出) + +``` +SELECT PC_AsText(PC_Explode(PC_Intersection( + pa, + 'SRID=4326;POLYGON((-126.451 45.552, -126.42 47.55, -126.40 45.552, -126.451 45.552))'::geometry +))) +FROM patches WHERE id = 7; + + pc_astext +-------------------------------------- + {"pcid":1,"pt":[-126.44,45.56,56,5]} + {"pcid":1,"pt":[-126.43,45.57,57,5]} + {"pcid":1,"pt":[-126.42,45.58,58,5]} + {"pcid":1,"pt":[-126.41,45.59,59,5]} +``` + +6、合并轨迹 + +聚合函数 + +``` +-- Compare npoints(sum(patches)) to sum(npoints(patches)) +SELECT PC_NumPoints(PC_Union(pa)) FROM patches; +SELECT Sum(PC_NumPoints(pa)) FROM patches; + +100 +``` + +可变函数 + +``` +create or replace function pcunion (VARIADIC pc pcpatch[]) returns pcpatch as $$ + select PC_Union(pa) from unnest(pc) as pa; +$$ language sql strict; + +select pcunion(pc1,pc2,...); +``` + +7、压缩点集 + +``` +PC_Compress(p pcpatch,global_compression_scheme text,compression_config text) returns pcpatch +``` + +Allowed global compression schemes are: + +- auto: determined by pcid +- laz: no compression config supported +- dimensional: configuration is a comma-separated list of per-dimension compressions from this list + - auto: determined automatically from values stats + - zlib: deflate compression + - sigbits: significant bits removal + - rle: run-length encoding + +8、3D 影像的抠出 + +``` +1 PC_FilterGreaterThan +PC_FilterGreaterThan(p pcpatch, dimname text, float8 value) returns pcpatch: + +Returns a patch with only points whose values are greater than the supplied value for the requested dimension. + +SELECT PC_AsText(PC_FilterGreaterThan(pa, 'y', 45.57)) +FROM patches WHERE id = 7; + + {"pcid":1,"pts":[[-126.42,45.58,58,5],[-126.41,45.59,59,5]]} + +2 PC_FilterLessThan +PC_FilterLessThan(p pcpatch, dimname text, float8 value) returns pcpatch: +Returns a patch with only points whose values are less than the supplied value for the requested dimension. + +3 PC_FilterBetween +PC_FilterBetween(p pcpatch, dimname text, float8 value1, float8 value2) returns pcpatch: +Returns a patch with only points whose values are between (excluding) the supplied values for the requested dimension. + +4 PC_FilterEquals +PC_FilterEquals(p pcpatch, dimname text, float8 value) returns pcpatch: +Returns a patch with only points whose values are the same as the supplied values for the requested dimension. +``` + +9、返回包住点集的几何"bound box"或"bound box 的对角线" + +通常用于在几何图像上创建 geo 索引: + +``` +SELECT ST_AsText(PC_EnvelopeGeometry(pa)) FROM patches LIMIT 1; +POLYGON((-126.99 45.01,-126.99 45.09,-126.91 45.09,-126.91 45.01,-126.99 45.01)) + +CREATE INDEX ON patches USING GIST(PC_EnvelopeGeometry(patch)); +``` + +``` +SELECT ST_AsText(PC_BoundingDiagonalGeometry(pa)) FROM patches; + st_astext +------------------------------------------------ +LINESTRING Z (-126.99 45.01 1,-126.91 45.09 9) +LINESTRING Z (-126 46 100,-126 46 100) +LINESTRING Z (-126.2 45.8 80,-126.11 45.89 89) +LINESTRING Z (-126.4 45.6 60,-126.31 45.69 69) +LINESTRING Z (-126.3 45.7 70,-126.21 45.79 79) +LINESTRING Z (-126.8 45.2 20,-126.71 45.29 29) +LINESTRING Z (-126.5 45.5 50,-126.41 45.59 59) +LINESTRING Z (-126.6 45.4 40,-126.51 45.49 49) +LINESTRING Z (-126.9 45.1 10,-126.81 45.19 19) +LINESTRING Z (-126.7 45.3 30,-126.61 45.39 39) +LINESTRING Z (-126.1 45.9 90,-126.01 45.99 99) + +CREATE INDEX ON patches USING GIST(PC_BoundingDiagonalGeometry(patch) gist_geometry_ops_nd); +``` + +## pgpointcloud 函数接口解读 + +1、点 + +PC_MakePoint(pcid integer, vals float8[]) returns pcpoint: + +- 构建点, pcid 为 schema, 相同 schema 可以表达为某一类点 + +PC_AsText(p pcpoint) returns text: + +- 将二进制点转换成 text 表达 + +PC_PCId(p pcpoint) returns integer (from 1.1.0): + +- 获取点的 schema id + +PC_Get(pt pcpoint) returns float8[]: + +- 获取点的所有维度值 + +PC_Get(pt pcpoint, dimname text) returns numeric: + +- 获取指定维度值: x,y,z,Intensity + +PC_MemSize(pt pcpoint) returns int4: + +- 点占据内存大小 + +2、点集 + +PC_Patch(pts pcpoint[]) returns pcpatch: + +- 将多个点聚合为点集 + +PC_MakePatch(pcid integer, vals float8[]) returns pcpatch: + +- 构造点集 + +PC_NumPoints(p pcpatch) returns integer: + +- 返回点集中有多少点 + +PC_PCId(p pcpatch) returns integer: + +- 返回点集的 schema id + +PC_AsText(p pcpatch) returns text: + +- 将点集二进制格式转换为文本格式 + +PC_Summary(p pcpatch) returns text (from 1.1.0): + +- 返回点集的统计信息: 点个数, srid, 各个维度的 avg,min,max 统计等 + +PC_Uncompress(p pcpatch) returns pcpatch: + +- 解压点集 + +PC_Union(p pcpatch[]) returns pcpatch: + +- 将多个点集聚合为一个点集 + +PC_Intersects(p1 pcpatch, p2 pcpatch) returns boolean: + +- 判断两个点集的 bound box 是否相交 + +PC_Explode(p pcpatch) returns SetOf[pcpoint]: + +- 将点集展开为点(返回多条记录) + +PC_PatchAvg(p pcpatch, dimname text) returns numeric: + +- 返回点集指定维度的平均值 + +PC_PatchMax(p pcpatch, dimname text) returns numeric: + +- 返回点集指定维度的最大值 + +PC_PatchMin(p pcpatch, dimname text) returns numeric: + +- 返回点集指定维度的最小值 + +PC_PatchMin(p pcpatch) returns pcpoint: + +- 返回点集所有维度的最小值 + +PC_PatchAvg(p pcpatch) returns pcpoint: + +- 返回点集所有维度的平均值 + +PC_PatchMax(p pcpatch) returns pcpoint: + +- 返回点集所有维度的最大值 + +PC_FilterGreaterThan(p pcpatch, dimname text, float8 value) returns pcpatch: + +- 过滤在某个‘指定维度’上大于‘指定’的点, 构成一个新的点集返回 + +PC_FilterLessThan(p pcpatch, dimname text, float8 value) returns pcpatch: + +- 过滤在某个‘指定维度’上小于‘指定值’的点, 构成一个新的点集返回 + +PC_FilterBetween(p pcpatch, dimname text, float8 value1, float8 value2) returns pcpatch: + +- 过滤在某个‘指定维度’上落在某‘指定值’范围内的点, 构成一个新的点集返回 + +PC_FilterEquals(p pcpatch, dimname text, float8 value) returns pcpatch: + +- 过滤在某个‘指定维度’上等于‘指定值’的点, 构成一个新的点集返回 + +PC_Compress(p pcpatch,global_compression_scheme text,compression_config text) returns pcpatch: + +- 压缩点集 + +PC_PointN(p pcpatch, n int4) returns pcpoint: + +- 返回点集内的第 N 个点 + +PC_IsSorted(p pcpatch, dimnames text[], strict boolean default true) returns boolean: + +- 判断点集在某些维度上是否有序 + +PC_Sort(p pcpatch, dimnames text[]) returns pcpatch: + +- 对点集按指定维度排序. 有点像电子管电视机的扫描顺序的概念 + +PC_Range(p pcpatch, start int4, n int4) returns pcpatch: + +- 返回点集中指定区间的点 + +PC_SetPCId(p pcpatch, pcid int4, def float8 default 0.0) returns pcpatch: + +- 设置点集的 schema id + +PC_Transform(p pcpatch, pcid int4, def float8 default 0.0) returns pcpatch: + +- 转换点集 schema id + +PC_MemSize(p pcpatch) returns int4: + +- 返回点集内存占用 + +3、GIS 互动 + +PC_Intersects(p pcpatch, g geometry) returns boolean: +PC_Intersects(g geometry, p pcpatch) returns boolean: + +- 判断点集的 bound box 是否与几何对象交叉 + +PC_Intersection(pcpatch, geometry) returns pcpatch: + +- 提取点集内落在几何对象内的点构成新点集并返回 + +Geometry(pcpoint) returns geometry: +pcpoint::geometry returns geometry: + +- 将点转换为几何对象 + +PC_EnvelopeGeometry(pcpatch) returns geometry: + +- 提取点集的 bound box, 返回由 bound box 四个点组成的 polygon + +PC_BoundingDiagonalGeometry(pcpatch) returns geometry: + +- 提取点集的 bound box, 返回由 bound box 左下和右上点组成的对角线段 + +## 参考 + +- https://pgpointcloud.github.io/pointcloud/concepts/tables.html +- https://pgpointcloud.github.io/pointcloud/functions/index.html +- [《重新发现 PostgreSQL 之美 - 31 激光点云 LiDAR - 一尺之锤日取一半万世不竭》](https://github.com/digoal/blog/blob/master/202106/20210620_01.md) +- [《无人驾驶背后的技术 - PostGIS 点云(pointcloud)应用 - 2》](https://github.com/digoal/blog/blob/master/201705/20170523_01.md) +- [《无人驾驶背后的技术 - PostGIS 点云(pointcloud)应用 - 1》](https://github.com/digoal/blog/blob/master/201705/20170519_02.md) diff --git a/docs/zh/practice/postgis.md b/docs/zh/practice/postgis.md new file mode 100644 index 00000000000..aa9a77be98a --- /dev/null +++ b/docs/zh/practice/postgis.md @@ -0,0 +1,184 @@ +--- +author: digoal +date: 2023/02/03 +minute: 10 +--- + +# 部署 PostGIS 支撑时空轨迹|地理信息|路由等业务 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍使用 PolarDB 开源版 部署 PostGIS 支撑时空轨迹|地理信息|路由等业务 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## PostGIS 的部署 + +依赖非常多, 请补充好体力. + +1、GEOS + +``` +cd ~ +wget https://download.osgeo.org/geos/geos-3.11.1.tar.bz2 + +tar -jxvf geos-3.11.1.tar.bz2 +cd geos-3.11.1 +mkdir build +cd build +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local .. +make -j 6 +sudo make install +sudo vi /etc/ld.so.conf +# add +/usr/local/lib64 +sudo ldconfig +``` + +2、SQLite3 + +``` +cd ~ +wget https://www.sqlite.org/2022/sqlite-autoconf-3400000.tar.gz +tar -zxvf sqlite-autoconf-3400000.tar.gz +cd sqlite-autoconf-3400000 +./configure +make +sudo make install +sudo vi /etc/ld.so.conf +# add +/usr/local/lib +sudo ldconfig +``` + +3、 + +``` +sudo yum install -y libtiff-devel +sudo yum install -y libcurl-devel +``` + +4、PROJ + +``` +cd ~ +wget https://download.osgeo.org/proj/proj-9.1.1.tar.gz +tar -zxvf proj-9.1.1.tar.gz +cd proj-9.1.1 +mkdir build +cd build +cmake .. +make -j 6 +sudo make install +``` + +5、 + +``` +cd ~ +wget http://prdownloads.sourceforge.net/swig/swig-4.1.1.tar.gz +tar -zxvf swig-4.1.1.tar.gz +cd swig-4.1.1 +wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.bz2 +./Tools/pcre-build.sh +./configure +make -j 4 +sudo make install +``` + +6、GDAL + +``` +cd ~ +wget https://github.com/OSGeo/gdal/releases/download/v3.6.1/gdal-3.6.1.tar.gz +tar -zxvf gdal-3.6.1.tar.gz +cd gdal-3.6.1 +mkdir build +cd build +cmake .. +make -j 6 +sudo make install +``` + +7、 + +``` +sudo yum install -y libxml2-devel +sudo yum install -y json-c-devel + + + +rpm -qa|grep protobuf +sudo rpm -e protobuf-compiler-2.5.0-8.el7.x86_64 protobuf-2.5.0-8.el7.x86_64 protobuf-devel-2.5.0-8.el7.x86_64 +``` + +8、protobuf and protobuf-c + +``` +cd ~ +wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protobuf-all-3.11.4.tar.gz +tar -zxvf protobuf-all-3.11.4.tar.gz +cd protobuf-3.11.4/ +./configure --prefix=/usr/local/protobuf +make -j 6 +sudo make install + +sudo vi /etc/ld.so.conf +# add +/usr/local/protobuf/lib +sudo ldconfig + + + + +cd ~ +wget https://github.com/protobuf-c/protobuf-c/releases/download/v1.3.3/protobuf-c-1.3.3.tar.gz +tar -zxvf protobuf-c-1.3.3.tar.gz +cd protobuf-c-1.3.3 +export PATH=/usr/local/protobuf/bin:$PATH +export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig:$PKG_CONFIG_PATH +./configure --prefix=/usr/local/protobuf-c +make -j 6 +sudo make install + +sudo vi /etc/ld.so.conf +# add +/usr/local/protobuf-c/lib +sudo ldconfig +``` + +9、PostGIS + +``` +cd ~ +wget https://download.osgeo.org/postgis/source/postgis-3.3.2.tar.gz +tar -zxvf postgis-3.3.2.tar.gz +cd postgis-3.3.2 + +export PKG_CONFIG_PATH=/usr/local/protobuf-c/lib/pkgconfig:/usr/local/protobuf/lib/pkgconfig:$PKG_CONFIG_PATH + +export PATH=/usr/local/protobuf-c/bin:/usr/local/protobuf/bin:$PATH + +./configure --with-protobufdir=/usr/local/protobuf-c --with-protobuf-inc=/usr/local/protobuf-c/include --with-protobuf-lib=/usr/local/protobuf-c/lib + +make -j 8 +sudo make install +``` + +10、可以在 PolarDB 数据库中安装 postgis 插件了 + +``` +psql + +postgres=# create extension postg +postgis +postgis_raster +postgis_tiger_geocoder +postgis_topology +``` diff --git a/docs/zh/practice/postgis_1.md b/docs/zh/practice/postgis_1.md new file mode 100644 index 00000000000..7d635ea7b79 --- /dev/null +++ b/docs/zh/practice/postgis_1.md @@ -0,0 +1,151 @@ +--- +author: digoal +date: 2023/02/03 +minute: 15 +--- + +# 时空轨迹应用实践 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版 轨迹应用实践, 例如: + +- 出行、配送、快递等业务的调度 + - 快递员有预规划的配送轨迹(轨迹) + - 客户有发货需求(时间、位置) + - 根据轨迹估算最近的位置和时间 +- 通过多个嫌疑人的轨迹, 计算嫌疑人接触的地点、时间点 +- 根据轨迹, 对传染源进行溯源 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 轨迹介绍 + +轨迹的定义: + +- 位置 1、位置 2、...位置 N 组成的线段, 加上 开始时间、结束时间 + +轨迹的常见计算: + +- 两个轨迹何时最接近 +- 最近的距离是多少 +- 两个轨迹最近时的位置分别是什么 + +## 相关函数 + +https://postgis.net/docs/manual-3.3/reference.html#Temporal + +8.18. Linear Referencing + +- ST_LineInterpolatePoint — Returns a point interpolated along a line at a fractional location. +- ST_3DLineInterpolatePoint — Returns a point interpolated along a 3D line at a fractional location. +- ST_LineInterpolatePoints — Returns points interpolated along a line at a fractional interval. +- ST_LineLocatePoint — Returns the fractional location of the closest point on a line to a point. +- ST_LineSubstring — Returns the part of a line between two fractional locations. +- ST_LocateAlong — Returns the point(s) on a geometry that match a measure value. +- ST_LocateBetween — Returns the portions of a geometry that match a measure range. +- ST_LocateBetweenElevations — Returns the portions of a geometry that lie in an elevation (Z) range. +- ST_InterpolatePoint — Returns the interpolated measure of a geometry closest to a point. +- ST_AddMeasure — Interpolates measures along a linear geometry. + 8.19. Trajectory Functions + Abstract + These functions support working with trajectories. A trajectory is a linear geometry with increasing measures (M value) on each coordinate. Spatio-temporal data can be modeled by using relative times (such as the epoch) as the measure values. +- ST_IsValidTrajectory — Tests if the geometry is a valid trajectory. +- ST_ClosestPointOfApproach — Returns a measure at the closest point of approach of two trajectories. +- ST_DistanceCPA — Returns the distance between the closest point of approach of two trajectories. +- ST_CPAWithin — Tests if the closest point of approach of two trajectories is within the specified distance. + +## 轨迹计算举例 + +1、构造 3 维轨迹: + +``` +ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5, 1 1 1)'::geometry, -- 三个3维点 + extract(epoch from '2015-05-26 10:00'::timestamptz), -- 开始时间 + extract(epoch from '2015-05-26 11:00'::timestamptz) -- 结束时间 +) +``` + +2、构造 2 维轨迹: + +``` +ST_AddMeasure('LINESTRING (0 0, 10 0, 1 1)'::geometry, -- 三个2维点 + extract(epoch from '2015-05-26 10:00'::timestamptz), -- 开始时间 + extract(epoch from '2015-05-26 11:00'::timestamptz) -- 结束时间 +) +``` + +3、返回 2 条轨迹距离最接近时的第一个时间点(因为 2 条轨迹可能有多个时间处于最近距离, 但是这里只返回最早的时间点, 如果要求后面的时间点, 可以切分线段). + +- 两个轨迹何时最接近 +- 最近的距离是多少 +- 两个轨迹最近时的位置分别是什么 + +``` +-- Return the time in which two objects moving between 10:00 and 11:00 +-- are closest to each other and their distance at that point +WITH inp AS ( SELECT + ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry, -- 如果轨迹是一个点, 这里就直接填2个一样位置的点 + extract(epoch from '2015-05-26 10:00'::timestamptz), + extract(epoch from '2015-05-26 11:00'::timestamptz) + ) a, + ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2, 15 3 5)'::geometry, -- 两条轨迹的点数可以不一样 + extract(epoch from '2015-05-26 10:00'::timestamptz), + extract(epoch from '2015-05-26 11:00'::timestamptz) + ) b +), cpa AS ( + SELECT ST_ClosestPointOfApproach(a,b) m FROM inp -- 计算a,b 2条轨迹距离最近时的最早时间点 +), points AS ( + SELECT ST_Force3DZ(ST_GeometryN(ST_LocateAlong(a,m),1)) pa, -- ST_LocateAlong(a,m) 计算a轨迹在某个时间点m对应的位置点(集合点) + ST_Force3DZ(ST_GeometryN(ST_LocateAlong(b,m),1)) pb -- ST_GeometryN 返回集合的第一个点, 由于a,b线段是3维线段, 所以返回后需要再使用ST_Force3DZ格式化一下? + FROM inp, cpa +) +SELECT st_astext(pa) pa, st_astext(pb) pb, + to_timestamp(m) t, -- a,b线段距离最近时的最早的时间点m + ST_Distance(pa,pb) distance -- a,b线段最接近的pa,pb点的距离 +FROM points, cpa; + + pa | pb | t | distance +-------------------------------------------------+----------------------------------------------------------------+-------------------------------+------------------ + POINT Z (5.798478121227689 0 2.899239060613844) | POINT Z (9.041623081002845 1.24653140991643 3.972251279331437) | 2015-05-26 10:34:47.452124+00 | 3.47445388313376 +(1 row) +``` + +以上 SQL 应用场景举例: + +1、出行、配送、快递等业务的调度, 例如 + +- 快递员预规划的配送轨迹(轨迹 a) +- 客户有发货需求(时间、位置)(轨迹 b) + +2、多个嫌疑人的轨迹 + +- 计算嫌疑人接触的地点、时间点 + +3、根据传染病人的多人多轨迹进行轨迹的碰撞计算, 对传染源进行溯源追踪. + +## 参考 + +- [《使用 PolarDB 开源版 部署 PostGIS 支撑时空轨迹|地理信息|路由等业务》](https://github.com/digoal/blog/blob/master/202212/20221223_02.md) +- [《重新发现 PostgreSQL 之美 - 11 时空轨迹系统 新冠&刑侦&预测》](https://github.com/digoal/blog/blob/master/202106/20210602_01.md) +- [《重新发现 PostgreSQL 之美 - 8 轨迹业务 IO 杀手克星 index include(覆盖索引)》](https://github.com/digoal/blog/blob/master/202105/20210530_02.md) +- [《PostgreSQL 应用开发解决方案最佳实践系列课程 - 6. 时空、时态、时序、日志等轨迹系统》](https://github.com/digoal/blog/blob/master/202105/20210509_01.md) +- [《使用 Postgres,MobilityDB 和 Citus 大规模(百亿级)实时分析 GPS 轨迹》](https://github.com/digoal/blog/blob/master/202011/20201117_01.md) +- [《PostgreSQL index include - 类聚簇表与应用(append only, IoT 时空轨迹, 离散多行扫描与返回)》](https://github.com/digoal/blog/blob/master/201905/20190503_03.md) +- [《PostgreSQL IoT,车联网 - 实时轨迹、行程实践 2 - (含 index only scan 类聚簇表效果)》](https://github.com/digoal/blog/blob/master/201812/20181209_01.md) +- [《PostgreSQL IoT,车联网 - 实时轨迹、行程实践 1》](https://github.com/digoal/blog/blob/master/201812/20181207_01.md) +- [《PostgreSQL pipelinedb 流计算插件 - IoT 应用 - 实时轨迹聚合》](https://github.com/digoal/blog/blob/master/201811/20181101_02.md) +- [《Greenplum 轨迹相似(伴随分析)》](https://github.com/digoal/blog/blob/master/201806/20180607_02.md) +- [《PostgreSQL 实时位置跟踪+轨迹分析系统实践 - 单机顶千亿轨迹/天》](https://github.com/digoal/blog/blob/master/201712/20171231_01.md) +- [《GIS 术语 - POI、AOI、LOI、路径、轨迹》](https://github.com/digoal/blog/blob/master/201712/20171204_01.md) +- [《菜鸟末端轨迹 - 电子围栏(解密支撑每天 251 亿个包裹的数据库) - 阿里云 RDS PostgreSQL 最佳实践》](https://github.com/digoal/blog/blob/master/201708/20170803_01.md) +- [《车联网案例,轨迹清洗 - 阿里云 RDS PostgreSQL 最佳实践 - 窗口函数》](https://github.com/digoal/blog/blob/master/201707/20170722_02.md) +- [《PostgreSQL 物流轨迹系统数据库需求分析与设计 - 包裹侠实时跟踪与召回》](https://github.com/digoal/blog/blob/master/201704/20170418_01.md) +- [《PostgreSQL 聚集存储 与 BRIN 索引 - 高并发行为、轨迹类大吞吐数据查询场景解说》](https://github.com/digoal/blog/blob/master/201702/20170219_01.md) +- [《PostgreSQL 如何轻松搞定行驶、运动轨迹合并和切分》](https://github.com/digoal/blog/blob/master/201606/20160611_02.md) diff --git a/docs/zh/practice/postgis_2.md b/docs/zh/practice/postgis_2.md new file mode 100644 index 00000000000..2253356667e --- /dev/null +++ b/docs/zh/practice/postgis_2.md @@ -0,0 +1,256 @@ +--- +author: digoal +date: 2023/02/03 +minute: 15 +--- + +# 地理空间最优解问题实践 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版 使用 PostGIS 以及泰森多边形 解决 "零售、配送、综合体、教培、连锁店等经营"|"通信行业基站建设功率和指向" 的地理最优解问题 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 业务介绍 + +与地理位置、距离相关的业务: + +- 配送 +- 零售业务 O2O +- 线下教培 +- 综合体 +- 基站 +- 连锁店 + +1、以 KFC 为例, 全国有很多家 KFC 连锁店, 每个店应该辐射哪些小区商圈? +开了新店之后, 与之相邻的老店辐射商圈应该怎么调整? +KFC 需要根据辐射小区商圈来预定销量、配置食材、配置多大的门店、多少营业员? + +2、配送业务, 根据网点分布, 如何合理化每个网点负责的片区, 使得配送效率最高, 成本最低? +每一个写字楼有且只有一种选择到某个网点的距离最近. + +3、基站建设, 每个基站应该对每个方向的功率调多大, 才能整体最优的解决网络质量和覆盖率问题. + +以上其实都在回答一个问题: + +- 在有限的资源情况下, 如何整体最优的解决地理位置上的业务覆盖问题. + +简化为数学问题, 就是: + +- 以基站、零售店、配送站、连锁店等为离散点, 划分泰森多边形, 每个离散点负责一个多边形, 在这个多边形内的点距离多边形内的离散点最近. 因此离散点只需要负责好这个多边形即可, 这样获得的就是地理位置上的最优解. + +## 例子 + +[《在 PostgreSQL 中生成和查看泰森多边形 - Voronoi diagram - 最强大脑题目》](https://github.com/digoal/blog/blob/master/201904/20190421_01.md) + +[《使用 PolarDB 开源版 部署 PostGIS 支撑时空轨迹|地理信息|路由等业务》](https://github.com/digoal/blog/blob/master/202212/20221223_02.md) + +接下来的内容将以上面这篇文章为例进行讲解: + +以 PolarDB 和 postgis 为例 + +``` +create extension postgis; +``` + +创建生成随机离散点的函数 + +``` +参数1,2:经度取值范围 +参数3,4:维度取值范围 +参数5:生成多少个离散点 + +create or replace function gen_rand_multipoint(numeric, numeric, numeric, numeric, int) returns geometry as $$ +declare + res text; +begin + res := 'MULTIPOINT ('; + for i in 1..$5 loop + res := res||$1+random()*($2-$1)||' '||$3+random()*($4-$3)||','; + end loop; + res := rtrim(res,','); + res := res||')'; + return res::geometry; +end; +$$ language plpgsql strict; +``` + +举例 + +``` +digoal=# select st_astext(gen_rand_multipoint(120,121,70,71,10)); +-[ RECORD 1 ]--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +st_astext | MULTIPOINT(120.942558704875 70.0857633580454,120.821791284718 70.5374327567406,120.60653472133 70.7641549357213,120.966732177418 70.1589297447354,120.494935501367 70.5906278314069,120.999914915301 70.6718445569277,120.941853619181 70.6390802050009,120.022797878832 70.7509728162549,120.612626708578 70.7740727034397,120.310972961597 70.0668104588985,120.741411157884 70.2521727122366,120.031697474886 70.8502694196068,120.77547144331 70.7255614278838,120.18382552173 70.0531326876953,120.045804018155 70.279703093227,120.709843394347 70.9883627230301,120.365466451272 70.5316346790642,120.525795479771 70.9720011726022,120.295789614785 70.4925276571885,120.130930917338 70.7907251161523,120.083155489061 70.1308458326384,120.462569673546 70.0250091082416,120.769926037639 70.4853675523773,120.775981924497 70.3825527466834,120.259440256283 70.0869548860937,120.449363205582 70.0008514141664,120.33912759833 70.4810606804676,120.851120833773 70.1145990416408,120.206622108817 70.0349463559687,120.167731729802 70.2524261269718,120.314649449196 70.8775751241483,120.240788850002 70.6801159004681,120.409209803678 70.7665843297727,120.65211707307 70.7049994184636,120.259111986961 70.7830479904078,120.495724535082 70.3422674760222,120.913893823046 70.9582942086272,120.367276584264 70.6838198606856,120.443661761004 70.1432585087605,120.066372607369 70.7031020172872,120.230213394854 70.5157358134165,120.703953431919 70.5693409931846,120.996796493884 70.5550742656924,120.683940035291 70.2034186027013,120.590020621661 70.8516717650928,120.455844729673 70.9046700708568,120.729246889241 70.6966335796751,120.584785971325 70.1384566929191,120.463217909448 70.2369030443951,120.843456111848 70.7223298968747,120.019951034803 70.3391806469299,120.064597372897 70.9338448578492,120.297474855557 70.4318739576265,120.617664719 70.7411366165616,120.575132466387 70.6840373263694,120.444238634314 70.8053458617069,120.199773139786 70.1481920662336,120.374686854891 70.1965696341358,120.703266331926 70.0586268901825,120.399988236837 70.2932869540527,120.910298655275 70.8558329669759,120.19795702491 70.639545544982,120.552466546651 70.7827429967001,120.778002237901 70.0156844565645,120.019646041095 70.6214583497494,120.738014353439 70.0395970763639,120.960638996679 70.8026117263362,120.973441934213 70.2581138522364,120.234485683963 70.5911066532135,120.999250469264 70.8096181508154) +``` + +## 使用 PostGIS 生成随机离散点的泰森多边形 + +``` +Synopsis +geometry ST_VoronoiPolygons( g1 geometry , tolerance float8 , extend_to geometry ); +``` + +用法如下 + +``` +select st_astext(ST_VoronoiPolygons(x)) from gen_rand_multipoint(120,121,70,71,10) x; +``` + +## 使用 PostGIS 生成随机离散点的泰森多边形的边 + +``` +Synopsis +geometry ST_VoronoiLines( g1 geometry , tolerance float8 , extend_to geometry ); +``` + +用法如下 + +``` +select st_astext(ST_VoronoiLines(x)) from gen_rand_multipoint(120,121,70,71,10) x; +``` + +## 使用 pgadmin,观察泰森多边形,离散点 + +1、建表,存储泰森多边形 + +``` +create table tb (id serial, mp geometry, vp geometry, vl geometry, mp_vl geometry); +``` + +2、写入一些泰森多边形数据 + +``` +insert into tb (mp,vp,vl,mp_vl) +select x, ST_VoronoiPolygons(x), ST_VoronoiLines(x), st_union(x,ST_VoronoiLines(x)) from gen_rand_multipoint(120,121,70,71,10) x; + +insert into tb (mp,vp,vl,mp_vl) +select x, ST_VoronoiPolygons(x), ST_VoronoiLines(x), st_union(x,ST_VoronoiLines(x)) from gen_rand_multipoint(120,121,70,71,100) x; + +insert into tb (mp,vp,vl,mp_vl) +select x, ST_VoronoiPolygons(x), ST_VoronoiLines(x), st_union(x,ST_VoronoiLines(x)) from gen_rand_multipoint(120,121,70,71,1000) x; + +insert into tb (mp,vp,vl,mp_vl) +select x, ST_VoronoiPolygons(x), ST_VoronoiLines(x), st_union(x,ST_VoronoiLines(x)) from gen_rand_multipoint(120,125,70,75,100) x; +``` + +3、使用 pgadmin 显示泰森多边形 + +几何数据 + +![pic](../imgs/postgis_2_1.jpg) + +离散点对应的泰森多边形的边(multiline 对象) + +![pic](../imgs/postgis_2_2.jpg) + +离散点对应的泰森多边形(multipolygon 对象)(bound 默认为一个 BOX,包住所有离散点) + +![pic](../imgs/postgis_2_3.jpg) + +离散点以及对应的泰森多边形的边 + +![pic](../imgs/postgis_2_4.jpg) + +放大后的离散点以及对应的泰森多边形的边 + +![pic](../imgs/postgis_2_5.jpg) + +4、将得到的泰森多边形 multigeometry 解析出来,每个多边形一条记录存储,为下一篇文档四色猜想做准备。 + +[《PostgreSQL 中的四色猜想(Four color theorem) - 最强大脑题目》](https://github.com/digoal/blog/blob/master/201904/20190421_02.md) + +创建测试表,并写入 1000 个泰森多边形。 + +``` +create table tc (id serial, poy geometry); + +insert into tc (poy) select ST_GeometryN(x,i) from + (select generate_series(1,ST_NumGeometries(x)) i, x + from ST_VoronoiPolygons(gen_rand_multipoint(120,121,70,71,1000)) x + ) t; +``` + +例子 + +``` +digoal=# select st_astext(poy) from tc; +-[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +st_astext | POLYGON((120.0068907121 70.0827667811785,120.017136860027 70.1185103197699,120.024032512908 70.1163465285133,120.032180593165 70.1011610062082,120.033703815237 70.0870002751683,120.012202949892 70.0813630370411,120.0068907121 + 70.0827667811785)) +-[ RECORD 2 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +st_astext | POLYGON((119.001530315262 70.1396284378468,119.001530315262 70.2071267817079,119.757509890494 70.2155274483723,119.788978615847 70.2125452904718,119.9209381714 70.1687296375826,120.017136860027 70.1185103197699,120.0068907121 + 70.0827667811785,119.952343492619 70.0692099186264,119.001530315262 70.1396284378468)) +-[ RECORD 3 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +st_astext | POLYGON((119.781778114247 69.0017473017801,119.001530315262 69.0017473017801,119.001530315262 70.1396284378468,119.952343492619 70.0692099186264,120.008027433811 70.0545962635351,120.013949018811 70.0504765592871,120.03048513 +9271 70.0273653734516,120.039308399546 69.9936444173583,119.781778114247 69.0017473017801)) +-[ RECORD 4 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +st_astext | POLYGON((120.080290328964 69.0017473017801,119.781778114247 69.0017473017801,120.039308399546 69.9936444173583,120.057510105642 70.0145600250777,120.122918984211 70.0308393983058,120.127907151293 70.0314308457492,120.13710363 +4016 70.0261242124239,120.153895004164 69.9966006333282,120.080290328964 69.0017473017801)) +.............. +``` + +5、输入任意一个泰森多边形 ID 搜索与之相邻的泰森多边形。 + +``` +select st_collect(tc.poy) +from tc, + (select * from tc where id=80) t +where st_intersects(tc.poy, t.poy) +and GeometryType(ST_Intersection(tc.poy, t.poy)) <> 'POINT' +; +``` + +![pic](../imgs/postgis_2_6.jpg) + +只有一个点相邻也会认为相邻,所以需要使用 GeometryType 过滤. + +``` +digoal=# select st_intersects(poyx, poyy), GeometryType(ST_Intersection(poyx, poyy)) from +(values( + ST_MakePolygon(ST_GeomFromText('LINESTRING(1 2, 2 2, 2 3, 1 2)')) +, + ST_MakePolygon(ST_GeomFromText('LINESTRING(2 2, 3 2, 3 3, 2 2)')) +)) as t (poyx, poyy) +; + st_intersects | geometrytype +---------------+-------------- + t | POINT +(1 row) +``` + +## 参考 + +https://en.wikipedia.org/wiki/Voronoi_diagram + +https://baike.baidu.com/item/%E6%B3%B0%E6%A3%AE%E5%A4%9A%E8%BE%B9%E5%BD%A2 + +https://gis.stackexchange.com/questions/114764/how-to-use-st-delaunaytriangles-to-construct-a-voronoi-diagram + +https://gis.stackexchange.com/questions/172198/constructing-voronoi-diagram-in-postgis + +http://postgis.net/docs/manual-2.5/ST_VoronoiLines.html + +http://postgis.net/docs/manual-2.5/ST_VoronoiPolygons.html + +http://postgis.net/docs/manual-2.5/reference.html + +https://stackoverflow.com/questions/21719941/postgis-convert-multipolygon-to-single-polygon + +https://baike.baidu.com/tashuo/browse/content?id=d967b9032e228a4e4a39827e&fr=qingtian&lemmaId=3428661 + +[《PostgreSQL 中的四色猜想(Four color theorem) - 最强大脑题目》](https://github.com/digoal/blog/blob/master/201904/20190421_02.md) + +[《在 PostgreSQL 中生成和查看泰森多边形 - Voronoi diagram - 最强大脑题目》](https://github.com/digoal/blog/blob/master/201904/20190421_01.md) + +[《使用 PolarDB 开源版 部署 PostGIS 支撑时空轨迹|地理信息|路由等业务》](https://github.com/digoal/blog/blob/master/202212/20221223_02.md) diff --git a/docs/zh/practice/rdkit.md b/docs/zh/practice/rdkit.md new file mode 100644 index 00000000000..7bfe7fa7a5b --- /dev/null +++ b/docs/zh/practice/rdkit.md @@ -0,0 +1,530 @@ +--- +author: digoal +date: 2023/02/03 +minute: 25 +--- + +# 生物、化学分子结构数据存储与计算、分析 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版 通过 rdkit 支撑生物、化学分子结构数据存储与计算、分析 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## rdkit 介绍 + +分子具有连接、分形、图、组合的特征, 低级生命组成高级生命, 众多高级生命组成社会, 众多低维生物通过分形组成高维生物. + +- [《用 PostgreSQL 递归 SQL 与 plpgsql 函数 绘制分形图 - 曼德勃罗集(Mandelbrot-上帝的指纹) 和 Julia 集 - `z->z^2+c`》](https://github.com/digoal/blog/blob/master/202208/20220818_02.md) + +https://www.rdkit.org/docs/Overview.html + +- Business-friendly BSD license +- Core data structures and algorithms in C++ +- Python 3.x wrappers generated using Boost.Python +- Java and C# wrappers generated with SWIG +- 2D and 3D molecular operations +- Descriptor generation for machine learning +- Molecular database cartridge for PostgreSQL +- Cheminformatics nodes for KNIME (distributed from the KNIME community site: https://www.knime.com/rdkit) + +PolarDB 通过 rdkit 插件实现生物、化学分子结构数据存储与计算、分析. (相似搜索、子结构或精确匹配搜索、分子比较等) + +https://www.rdkit.org/docs/Cartridge.html + +数据类型 + +``` +postgres=# \dT + List of data types + Schema | Name | Description +--------+-----------+------------- + public | bfp | a bit vector fingerprint + public | _internal | + public | mol | an rdkit molecule. + public | qmol | an rdkit molecule containing query features + public | reaction | + public | sfp | a sparse count vector fingerprint +(6 rows) +``` + +操作符 + +``` +postgres=# \do+ + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Function | Description +--------+------+---------------+----------------+------------------+------------------------+------------- + public | # | bfp | bfp | boolean | public.dice_sml_op | + public | # | sfp | sfp | boolean | public.dice_sml_op | + public | % | bfp | bfp | boolean | public.tanimoto_sml_op | + public | % | sfp | sfp | boolean | public.tanimoto_sml_op | + public | < | bfp | bfp | boolean | bfp_lt | + public | < | mol | mol | boolean | mol_lt | + public | < | sfp | sfp | boolean | sfp_lt | + public | <#> | bfp | bfp | double precision | dice_dist | + public | <%> | bfp | bfp | double precision | tanimoto_dist | + public | <= | bfp | bfp | boolean | bfp_le | + public | <= | mol | mol | boolean | mol_le | + public | <= | sfp | sfp | boolean | sfp_le | + public | <> | bfp | bfp | boolean | bfp_ne | + public | <> | mol | mol | boolean | mol_ne | + public | <> | reaction | reaction | boolean | reaction_ne | + public | <> | sfp | sfp | boolean | sfp_ne | + public | <@ | mol | mol | boolean | public.rsubstruct | + public | <@ | qmol | mol | boolean | public.rsubstruct | + public | <@ | reaction | reaction | boolean | public.rsubstruct | + public | = | bfp | bfp | boolean | bfp_eq | + public | = | mol | mol | boolean | mol_eq | + public | = | reaction | reaction | - | - | + public | = | sfp | sfp | boolean | sfp_eq | + public | > | bfp | bfp | boolean | bfp_gt | + public | > | mol | mol | boolean | mol_gt | + public | > | sfp | sfp | boolean | sfp_gt | + public | >= | bfp | bfp | boolean | bfp_ge | + public | >= | mol | mol | boolean | mol_ge | + public | >= | sfp | sfp | boolean | sfp_ge | + public | ?< | reaction | reaction | boolean | rsubstructfp | + public | ?> | reaction | reaction | boolean | substructfp | + public | @= | mol | mol | boolean | mol_eq | + public | @= | reaction | reaction | boolean | reaction_eq | + public | @> | mol | mol | boolean | public.substruct | + public | @> | mol | qmol | boolean | public.substruct | + public | @> | reaction | reaction | boolean | public.substruct | +(36 rows) +``` + +函数 + +``` +postgres=# \df + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+------------------------------+------------------+----------------------------------------------------------------------------------------------------------+------ + public | add | sfp | sfp, sfp | func + public | all_values_gt | boolean | sfp, integer | func + public | all_values_lt | boolean | sfp, integer | func + public | atompair_fp | sfp | mol | func + public | atompairbv_fp | bfp | mol | func + public | avalon_fp | bfp | mol, boolean DEFAULT false, integer DEFAULT 15761407 | func + public | bfp_cmp | integer | bfp, bfp | func + public | bfp_eq | boolean | bfp, bfp | func + public | bfp_from_binary_text | bfp | bytea | func + public | bfp_ge | boolean | bfp, bfp | func + public | bfp_gt | boolean | bfp, bfp | func + public | bfp_in | bfp | cstring | func + public | bfp_le | boolean | bfp, bfp | func + public | bfp_lt | boolean | bfp, bfp | func + public | bfp_ne | boolean | bfp, bfp | func + public | bfp_out | cstring | bfp | func + public | bfp_to_binary_text | bytea | bfp | func + public | dice_dist | double precision | bfp, bfp | func + public | dice_sml | double precision | bfp, bfp | func + public | dice_sml | double precision | sfp, sfp | func + public | dice_sml_op | boolean | bfp, bfp | func + public | dice_sml_op | boolean | sfp, sfp | func + public | featmorgan_fp | sfp | mol, integer DEFAULT 2 | func + public | featmorganbv_fp | bfp | mol, integer DEFAULT 2 | func + public | fmcs | text | mol | agg + public | fmcs | text | text | agg + public | fmcs_mol_transition | internal | internal, mol | func + public | fmcs_mols | text | internal | func + public | fmcs_smiles | cstring | cstring, cstring | func + public | fmcs_smiles | text | text | func + public | fmcs_smiles | text | text, text | func + public | fmcs_smiles_transition | text | text, text | func + public | gbfp_compress | internal | internal | func + public | gbfp_consistent | boolean | internal, bytea, smallint, oid, internal | func + public | gbfp_decompress | internal | internal | func + public | gbfp_distance | double precision | internal, bytea, smallint, oid | func + public | gbfp_fetch | internal | internal | func + public | gbfp_penalty | internal | internal, internal, internal | func + public | gbfp_picksplit | internal | internal, internal | func + public | gbfp_same | internal | internal, internal, internal | func + public | gbfp_union | _internal | internal, internal | func + public | gen_arr | integer[] | normal integer, hot integer | func + public | gin_bfp_consistent | boolean | internal, smallint, bfp, integer, internal, internal, internal, internal | func + public | gin_bfp_extract_query | internal | bfp, internal, smallint, internal, internal, internal, internal | func + public | gin_bfp_extract_value | internal | bfp, internal | func + public | gin_bfp_triconsistent | boolean | internal, smallint, bfp, integer, internal, internal, internal | func + public | gmol_compress | internal | internal | func + public | gmol_consistent | boolean | bytea, internal, integer | func + public | gmol_decompress | internal | internal | func + public | gmol_penalty | internal | internal, internal, internal | func + public | gmol_picksplit | internal | internal, internal | func + public | gmol_same | internal | bytea, bytea, internal | func + public | gmol_union | integer[] | bytea, internal | func + public | greaction_compress | internal | internal | func + public | greaction_consistent | boolean | bytea, internal, integer | func + public | gsfp_compress | internal | internal | func + public | gsfp_consistent | boolean | bytea, internal, integer | func + public | gslfp_compress | internal | internal | func + public | gslfp_consistent | boolean | bytea, internal, integer | func + public | gslfp_decompress | internal | internal | func + public | gslfp_penalty | internal | internal, internal, internal | func + public | gslfp_picksplit | internal | internal, internal | func + public | gslfp_same | internal | bytea, bytea, internal | func + public | gslfp_union | integer[] | bytea, internal | func + public | has_reaction_substructmatch | SETOF reaction | queryreaction character, tablename regclass, columnname text | func + public | is_valid_ctab | boolean | cstring | func + public | is_valid_mol_pkl | boolean | bytea | func + public | is_valid_smarts | boolean | cstring | func + public | is_valid_smiles | boolean | cstring | func + public | layered_fp | bfp | mol | func + public | maccs_fp | bfp | mol | func + public | mol_adjust_query_properties | mol | mol, cstring DEFAULT ''::cstring | func + public | mol_adjust_query_properties | qmol | qmol, cstring DEFAULT ''::cstring | func + public | mol_amw | real | mol | func + public | mol_chi0n | real | mol | func + public | mol_chi0v | real | mol | func + public | mol_chi1n | real | mol | func + public | mol_chi1v | real | mol | func + public | mol_chi2n | real | mol | func + public | mol_chi2v | real | mol | func + public | mol_chi3n | real | mol | func + public | mol_chi3v | real | mol | func + public | mol_chi4n | real | mol | func + public | mol_chi4v | real | mol | func + public | mol_cmp | integer | mol, mol | func + public | mol_eq | boolean | mol, mol | func + public | mol_exactmw | real | mol | func + public | mol_formula | cstring | mol, boolean DEFAULT false, boolean DEFAULT true | func + public | mol_fractioncsp3 | real | mol | func + public | mol_from_ctab | mol | cstring, boolean DEFAULT false | func + public | mol_from_json | mol | cstring | func + public | mol_from_pkl | mol | bytea | func + public | mol_from_smiles | mol | cstring | func + public | mol_from_smiles | mol | text | func + public | mol_ge | boolean | mol, mol | func + public | mol_gt | boolean | mol, mol | func + public | mol_hallkieralpha | real | mol | func + public | mol_hba | integer | mol | func + public | mol_hbd | integer | mol | func + public | mol_in | mol | cstring | func + public | mol_inchi | cstring | mol, cstring DEFAULT ''::cstring | func + public | mol_inchikey | cstring | mol, cstring DEFAULT ''::cstring | func + public | mol_kappa1 | real | mol | func + public | mol_kappa2 | real | mol | func + public | mol_kappa3 | real | mol | func + public | mol_labuteasa | real | mol | func + public | mol_le | boolean | mol, mol | func + public | mol_logp | real | mol | func + public | mol_lt | boolean | mol, mol | func + public | mol_murckoscaffold | mol | mol | func + public | mol_ne | boolean | mol, mol | func + public | mol_nm_hash | cstring | mol, cstring DEFAULT 'AnonymousGraph'::cstring | func + public | mol_numaliphaticcarbocycles | integer | mol | func + public | mol_numaliphaticheterocycles | integer | mol | func + public | mol_numaliphaticrings | integer | mol | func + public | mol_numamidebonds | integer | mol | func + public | mol_numaromaticcarbocycles | integer | mol | func + public | mol_numaromaticheterocycles | integer | mol | func + public | mol_numaromaticrings | integer | mol | func + public | mol_numatoms | integer | mol | func + public | mol_numbridgeheadatoms | integer | mol | func + public | mol_numheavyatoms | integer | mol | func + public | mol_numheteroatoms | integer | mol | func + public | mol_numheterocycles | integer | mol | func + public | mol_numrings | integer | mol | func + public | mol_numrotatablebonds | integer | mol | func + public | mol_numsaturatedcarbocycles | integer | mol | func + public | mol_numsaturatedheterocycles | integer | mol | func + public | mol_numsaturatedrings | integer | mol | func + public | mol_numspiroatoms | integer | mol | func + public | mol_out | cstring | mol | func + public | mol_phi | real | mol | func + public | mol_recv | mol | internal | func + public | mol_send | bytea | mol | func + public | mol_to_ctab | cstring | mol, boolean DEFAULT true, boolean DEFAULT false | func + public | mol_to_cxsmarts | cstring | mol | func + public | mol_to_cxsmarts | cstring | qmol | func + public | mol_to_cxsmiles | cstring | mol | func + public | mol_to_json | cstring | mol | func + public | mol_to_json | cstring | qmol | func + public | mol_to_pkl | bytea | mol | func + public | mol_to_smarts | cstring | mol | func + public | mol_to_smarts | cstring | qmol | func + public | mol_to_smiles | cstring | mol | func + public | mol_to_smiles | cstring | qmol | func + public | mol_to_svg | cstring | mol, cstring DEFAULT ''::cstring, integer DEFAULT 250, integer DEFAULT 200, cstring DEFAULT ''::cstring | func + public | mol_to_svg | cstring | qmol, cstring DEFAULT ''::cstring, integer DEFAULT 250, integer DEFAULT 200, cstring DEFAULT ''::cstring | func + public | mol_to_v3kctab | cstring | mol, boolean DEFAULT true | func + public | mol_tpsa | real | mol | func + public | morgan_fp | sfp | mol, integer DEFAULT 2 | func + public | morganbv_fp | bfp | mol, integer DEFAULT 2 | func + public | qmol_from_ctab | qmol | cstring, boolean DEFAULT false | func + public | qmol_from_json | qmol | cstring | func + public | qmol_from_smarts | qmol | cstring | func + public | qmol_from_smiles | qmol | cstring | func + public | qmol_in | qmol | cstring | func + public | qmol_out | cstring | qmol | func + public | qmol_recv | qmol | internal | func + public | qmol_send | bytea | qmol | func + public | rdkit_fp | bfp | mol | func + public | rdkit_toolkit_version | text | | func + public | rdkit_version | text | | func + public | reaction_difference_fp | sfp | reaction, integer DEFAULT 1 | func + public | reaction_eq | boolean | reaction, reaction | func + public | reaction_from_ctab | reaction | cstring | func + public | reaction_from_smarts | reaction | cstring | func + public | reaction_from_smiles | reaction | cstring | func + public | reaction_in | reaction | cstring | func + public | reaction_ne | boolean | reaction, reaction | func + public | reaction_numagents | integer | reaction | func + public | reaction_numproducts | integer | reaction | func + public | reaction_numreactants | integer | reaction | func + public | reaction_out | cstring | reaction | func + public | reaction_recv | reaction | internal | func + public | reaction_send | bytea | reaction | func + public | reaction_structural_bfp | bfp | reaction, integer DEFAULT 5 | func + public | reaction_to_ctab | cstring | reaction | func + public | reaction_to_smarts | cstring | reaction | func + public | reaction_to_smiles | cstring | reaction | func + public | reaction_to_svg | cstring | reaction, boolean DEFAULT false, integer DEFAULT 400, integer DEFAULT 200, cstring DEFAULT ''::cstring | func + public | rsubstruct | boolean | mol, mol | func + public | rsubstruct | boolean | qmol, mol | func + public | rsubstruct | boolean | reaction, reaction | func + public | rsubstruct_chiral | boolean | mol, mol | func + public | rsubstructfp | boolean | reaction, reaction | func + public | sfp_cmp | integer | sfp, sfp | func + public | sfp_eq | boolean | sfp, sfp | func + public | sfp_ge | boolean | sfp, sfp | func + public | sfp_gt | boolean | sfp, sfp | func + public | sfp_in | sfp | cstring | func + public | sfp_le | boolean | sfp, sfp | func + public | sfp_lt | boolean | sfp, sfp | func + public | sfp_ne | boolean | sfp, sfp | func + public | sfp_out | cstring | sfp | func + public | size | integer | bfp | func + public | substruct | boolean | mol, mol | func + public | substruct | boolean | mol, qmol | func + public | substruct | boolean | reaction, reaction | func + public | substruct_chiral | boolean | mol, mol | func + public | substruct_count | integer | mol, mol, boolean DEFAULT true | func + public | substruct_count | integer | mol, qmol, boolean DEFAULT true | func + public | substruct_count_chiral | integer | mol, mol, boolean DEFAULT true | func + public | substruct_count_chiral | integer | mol, qmol, boolean DEFAULT true | func + public | substructfp | boolean | reaction, reaction | func + public | subtract | sfp | sfp, sfp | func + public | tanimoto_dist | double precision | bfp, bfp | func + public | tanimoto_sml | double precision | bfp, bfp | func + public | tanimoto_sml | double precision | sfp, sfp | func + public | tanimoto_sml_op | boolean | bfp, bfp | func + public | tanimoto_sml_op | boolean | sfp, sfp | func + public | torsion_fp | sfp | mol | func + public | torsionbv_fp | bfp | mol | func + public | tversky_sml | double precision | bfp, bfp, real, real | func +(213 rows) +``` + +索引 + +``` + 403 | btree_mol_ops + 403 | btree_bfp_ops + 403 | btree_sfp_ops + 405 | hash_mol_ops + 405 | hash_bfp_ops + 405 | hash_sfp_ops + 783 | gist_mol_ops + 783 | gist_qmol_ops + 783 | gist_bfp_ops + 783 | gist_sfp_ops + 783 | gist_sfp_low_ops + 783 | gist_reaction_ops +2742 | gin_bfp_ops +``` + +## 部署 rdkit on PolarDB + +1、boost 依赖 + +``` +wget https://boostorg.jfrog.io/artifactory/main/release/1.69.0/source/boost_1_69_0.tar.bz2 + +tar -jxvf boost_1_69_0.tar.bz2 + +cd boost_1_69_0 + +./bootstrap.sh --with-libraries=serialization + +sudo ./b2 --prefix=/usr/local/boost -a install +``` + +2、cairo 依赖 + +``` +sudo yum install -y cairo-devel cairo +``` + +3、freetype 依赖 + +``` +wget https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.gz +tar -zxvf freetype-2.12.1.tar.gz +cd freetype-2.12.1 + +./autogen.sh +./configure --prefix=/usr/local/freettype +make -j 6 +sudo make install + + +sudo vi /etc/ld.so.conf +# add +/usr/local/freettype/lib + +sudo ldconfig +``` + +4、rdkit + +``` +wget https://github.com/rdkit/rdkit/archive/refs/tags/Release_2022_09_3.tar.gz + +tar -zxvf Release_2022_09_3.tar.gz +``` + +4\.1、Comic_Neue 依赖 + +``` +## in macOS +https://fonts.google.com/download?family=Comic%20Neue + +cp Comic_Neue.zip /home/postgres/rdkit-Release_2022_09_3/Code/GraphMol/MolDraw2D + + +## in docker +sudo chown postgres:postgres /home/postgres/rdkit-Release_2022_09_3/Code/GraphMol/MolDraw2D/Comic_Neue.zip +``` + +4\.2、rdkit + +``` +cd rdkit-Release_2022_09_3 +mkdir build +cd build + + +cmake -DBOOST_ROOT=/usr/local/boost -DBoost_INCLUDE_DIR=/usr/local/boost/include -DRDK_BUILD_PYTHON_WRAPPERS=OFF -DRDK_BUILD_PGSQL=ON -DPostgreSQL_ROOT="/home/postgres/tmp_basedir_polardb_pg_1100_bld" -DFREETYPE_LIBRARY=/usr/local/freettype/lib/libfreetype.so.6 -DFREETYPE_INCLUDE_DIRS=/usr/local/freettype/include/freetype2 -DRDK_TEST_MULTITHREADED=OFF -DRDK_BUILD_INCHI_SUPPORT=ON -DRDK_BUILD_AVALON_SUPPORT=ON -DRDK_INSTALL_INTREE=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/rdkit -Wno-dev .. + +// OR + +// cmake -DBOOST_ROOT=/usr/local/boost -DBoost_INCLUDE_DIR=/usr/local/boost/include -DRDK_BUILD_PYTHON_WRAPPERS=OFF -DRDK_BUILD_PGSQL=ON -DPostgreSQL_ROOT="/home/postgres/tmp_basedir_polardb_pg_1100_bld" -DFREETYPE_LIBRARY=/usr/local/freettype/lib/libfreetype.so.6 -DFREETYPE_INCLUDE_DIRS=/usr/local/freettype/include/freetype2 -DRDK_TEST_MULTITHREADED=OFF -DRDK_BUILD_INCHI_SUPPORT=ON -DRDK_BUILD_AVALON_SUPPORT=ON -DRDK_INSTALL_INTREE=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/rdkit -DRDK_BUILD_MOLINTERCHANGE_SUPPORT=OFF -Wno-dev .. + +// 编译时需要联网, cmake的时候需要git clone代码, 期间会下载几个依赖的软件, 如果没有下载成功就多试几次 +// ... + + +make -j 6 + +// 编译时需要联网, make的时候也需要git clone代码 + +sudo make install +``` + +5、安装 rdkit 插件到 polardb. + +``` +psql +postgres=# create extension rdkit ; +CREATE EXTENSION +``` + +rdkit 编译选项: + +``` +rdkit-Release_2022_09_3/CMakeLists.txt + +option(RDK_BUILD_SWIG_WRAPPERS "build the SWIG wrappers" OFF ) +option(RDK_BUILD_PYTHON_WRAPPERS "build the standard python wrappers" ON ) +option(RDK_BUILD_COMPRESSED_SUPPLIERS "build in support for compressed MolSuppliers" OFF ) +option(RDK_BUILD_INCHI_SUPPORT "build the rdkit inchi wrapper" OFF ) +option(RDK_BUILD_AVALON_SUPPORT "install support for the avalon toolkit. Use the variable AVALONTOOLS_DIR to set the location of the source." OFF ) +option(RDK_BUILD_PGSQL "build the PostgreSQL cartridge" OFF ) +option(RDK_BUILD_RPATH_SUPPORT "build shared libraries using rpath" OFF) +option(RDK_PGSQL_STATIC "statically link rdkit libraries into the PostgreSQL cartridge" ON ) +option(RDK_BUILD_CONTRIB "build the Contrib directory" OFF ) +option(RDK_INSTALL_INTREE "install the rdkit in the source tree (former behavior)" ON ) +option(RDK_INSTALL_DLLS_MSVC "install the rdkit DLLs when using MSVC" OFF) +option(RDK_INSTALL_STATIC_LIBS "install the rdkit static libraries" ON ) +option(RDK_INSTALL_PYTHON_TESTS "install the rdkit Python tests with the wrappers" OFF ) +option(RDK_BUILD_THREADSAFE_SSS "enable thread-safe substructure searching" ON ) +option(RDK_BUILD_SLN_SUPPORT "include support for the SLN format" ON ) +option(RDK_TEST_MULTITHREADED "run some tests of multithreading" ON ) +option(RDK_BUILD_SWIG_JAVA_WRAPPER "build the SWIG JAVA wrappers (does nothing if RDK_BUILD_SWIG_WRAPPERS is not set)" ON ) +option(RDK_BUILD_SWIG_CSHARP_WRAPPER "build the experimental SWIG C# wrappers (does nothing if RDK_BUILD_SWIG_WRAPPERS is not set)" OFF ) +option(RDK_SWIG_STATIC "statically link rdkit libraries into the SWIG wrappers" ON ) +option(RDK_TEST_MMFF_COMPLIANCE "run MMFF compliance tests (requires tar/gzip)" ON ) +option(RDK_BUILD_CPP_TESTS "build the c++ tests (disabing can speed up builds" ON) +option(RDK_USE_FLEXBISON "use flex/bison, if available, to build the SMILES/SMARTS/SLN parsers" OFF) +option(RDK_TEST_COVERAGE "Use G(L)COV to compute test coverage" OFF) +option(RDK_USE_BOOST_SERIALIZATION "Use the boost serialization library if available" ON) +option(RDK_USE_BOOST_STACKTRACE "use boost::stacktrace to do more verbose invariant output (linux only)" ON) +option(RDK_BUILD_TEST_GZIP "Build the gzip'd stream test" OFF) +option(RDK_OPTIMIZE_POPCNT "Use SSE4.2 popcount instruction while compiling." ON) +option(RDK_USE_STRICT_ROTOR_DEFINITION "Use the most strict rotatable bond definition" ON) +option(RDK_BUILD_DESCRIPTORS3D "Build the 3D descriptors calculators, requires Eigen3 to be installed" ON) +option(RDK_BUILD_FREESASA_SUPPORT "build the rdkit freesasa wrapper" OFF ) +option(RDK_BUILD_COORDGEN_SUPPORT "build the rdkit coordgen wrapper" ON ) +option(RDK_BUILD_MAEPARSER_SUPPORT "build the rdkit MAE parser wrapper" ON ) +option(RDK_BUILD_MOLINTERCHANGE_SUPPORT "build in support for CommonChem molecule interchange" ON ) +option(RDK_BUILD_YAEHMOP_SUPPORT "build support for the YAeHMOP wrapper" OFF) +option(RDK_BUILD_XYZ2MOL_SUPPORT "build in support for the RDKit's implementation of xyz2mol (in the DetermineBonds library)" OFF ) +option(RDK_BUILD_STRUCTCHECKER_SUPPORT "build in support for the StructChecker alpha (not recommended, use the MolVS integration instead)" OFF ) +option(RDK_USE_URF "Build support for Florian Flachsenberg's URF library" ON) +option(RDK_INSTALL_DEV_COMPONENT "install libraries and headers" ON) +option(RDK_USE_BOOST_REGEX "use boost::regex instead of std::regex (needed for systems with g++-4.8)" OFF) +option(RDK_USE_BOOST_IOSTREAMS "use boost::iostreams" ON) +option(RDK_BUILD_MINIMAL_LIB "build the minimal RDKit wrapper (for the JS bindings)" OFF) +option(RDK_BUILD_CFFI_LIB "build the CFFI wrapper (for use in other programming languges)" OFF) +option(RDK_BUILD_FUZZ_TARGETS "build the fuzz targets" OFF) +``` + +make installcheck + +``` +cd rdkit-Release_2022_09_3/Code/PgSQL/rdkit + +[postgres@aa25c5be9681 rdkit]$ USE_PGXS=1 make installcheck +/home/postgres/tmp_basedir_polardb_pg_1100_bld/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress --inputdir=./ --bindir='/home/postgres/tmp_basedir_polardb_pg_1100_bld/bin' --dbname=contrib_regression rdkit-91 props btree molgist bfpgist-91 bfpgin sfpgist slfpgist fps reaction +(using postmaster on 127.0.0.1, default port) +============== dropping database "contrib_regression" ============== +DROP DATABASE +============== creating database "contrib_regression" ============== +CREATE DATABASE +ALTER DATABASE +============== running regression test queries ============== +test rdkit-91 ... ok +test props ... ok +test btree ... ok +test molgist ... ok +test bfpgist-91 ... ok +test bfpgin ... ok +test sfpgist ... ok +test slfpgist ... ok +test fps ... ok +test reaction ... ok + + +=========================================================== + All 10 tests passed. + + POLARDB: + All 10 tests, 0 tests in ignore, 0 tests in polar ignore. +=========================================================== +``` + +## 参考 + +- [《重新发现 PostgreSQL 之美 - 35 茅山道士 - rdkit 化学分析》](https://github.com/digoal/blog/blob/master/202106/20210624_01.md) +- [《PostgreSQL 化学插件 - pgchem_tigress molecules rdkit》](https://github.com/digoal/blog/blob/master/202003/20200326_06.md) +- [《PostgreSQL 化学分析 - RDKit Cartridge 1 - 环境部署》](https://github.com/digoal/blog/blob/master/201911/20191125_01.md) +- https://www.rdkit.org/docs/Cartridge.html diff --git a/docs/zh/practice/rum.md b/docs/zh/practice/rum.md new file mode 100644 index 00000000000..a8b6c4ae940 --- /dev/null +++ b/docs/zh/practice/rum.md @@ -0,0 +1,364 @@ +--- +author: digoal +date: 2023/02/03 +minute: 20 +--- + +# 当搜索遇到排序 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版通过 rum 实现高效率搜索和高效率排序的解决方案 + +测试环境为 macos+docker, polardb 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 为什么 DBA 最怕搜索需求 + +如果你要做个搜索功能, 用户在搜索时通常会有多个满足搜索条件的结果, 这些结果往往还需要根据其他条件进行排序, 这种搜索在一般的数据库中, 只能全表扫描实现, 性能差到极点. 随便几个查询就会把数据库 CPU、内存、IO 资源耗光, 影响业务. 最后一般是 DBA 背锅, 实际上是数据库没有好的算法和存储结构, 所以这锅有点冤枉. + +根据代际转移理论, 今天我们都是提前消费未来的创造力, 而以前通过暴力(堆机器)来解决问题的方法, 放在今天必须要有更高效、节能的方式来解决. + +这也是今天我想要跟大家介绍的《rum+PolarDB 实现高效率搜索和高效率排序的解决方案》, 性能轻松提升 70 倍(大数据量性能提升还会更多). 以后有这种需求, DBA 就可以硬气了. + +## rum 的原理 + +rum 是个倒排结构, 但是在期 elements 里面又增加了 addon value 的存储, 每个匹配的 element 条目再根据 addon column value 重新排序编排其 ctid(s). + +同时由于多值列本身的等值匹配较为常见, 所以 rum 有个变种, element 可以被 hash 化来进行存储, 提高索引存储效率. hash 化之后仅仅支持 element 的等值匹配, 类似的 hash index 也一样. + +1、rum storage: + +1\.1、ops + +- `k,v结构: ele,ctid(s)` + +1\.2、addon_ops + +- `k,v结构: ele,kv(s)` + - `kv(s)结构: addon,ctid(s) (根据addon value构建btree)` + +1\.3、hash_ops + +- `k,v结构: ele_hash:ctid(s)` + +1\.4、hash_addon_ops + +- `k,v结构: ele_hash:kv(s)` + - `kv(s)结构: addon:ctid(s) (根据addon value构建btree)` + +hash ops 和 hash addon ops 不支持按 prefix 搜索 ele, 因为 element 已经转换成 hashvalue 存储在索引中, 只能做等值匹配. + +hash ops 支持按距离排序(`<=>`), 因为距离计算取决于等值匹配到的 ele 比例. 可以想象, 不支持有方向的排序和搜索, 例如 prefix search 和 prefix sort (`<=| and |=>`). + +2、sort compute: + +2\.1、ele key sort: + +- `ele distance : dist_fun(ctid , $)` + +2\.2、addon ele sort: + +- `addon distance : dist_fun(ctid , $)` + +按 ele 排序 或 匹配 ele 条件后按 addon 排序 + +hash ops 可以按 addon 排序(prefix, 相似都支持. 包括 <=>, <=| and |=> ), 因为 addon column 未被 hash 化. + +## 将 rum 部署到 PolarDB 中 + +``` +git clone --depth 1 https://github.com/postgrespro/rum + +cd rum + +USE_PGXS=1 make +USE_PGXS=1 make install +USE_PGXS=1 make installcheck + + +[postgres@aa25c5be9681 rum]$ USE_PGXS=1 make installcheck +/home/postgres/tmp_basedir_polardb_pg_1100_bld/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress --inputdir=./ --bindir='/home/postgres/tmp_basedir_polardb_pg_1100_bld/bin' --dbname=contrib_regression security rum rum_validate rum_hash ruminv timestamp orderby orderby_hash altorder altorder_hash limits int2 int4 int8 float4 float8 money oid time timetz date interval macaddr inet cidr text varchar char bytea bit varbit numeric rum_weight array +(using postmaster on 127.0.0.1, default port) +============== dropping database "contrib_regression" ============== +NOTICE: database "contrib_regression" does not exist, skipping +DROP DATABASE +============== creating database "contrib_regression" ============== +CREATE DATABASE +ALTER DATABASE +============== running regression test queries ============== +test security ... ok +test rum ... ok +test rum_validate ... ok +test rum_hash ... ok +test ruminv ... ok +test timestamp ... ok +test orderby ... ok +test orderby_hash ... ok +test altorder ... ok +test altorder_hash ... ok +test limits ... ok +test int2 ... ok +test int4 ... ok +test int8 ... ok +test float4 ... ok +test float8 ... ok +test money ... ok +test oid ... ok +test time ... ok +test timetz ... ok +test date ... ok +test interval ... ok +test macaddr ... ok +test inet ... ok +test cidr ... ok +test text ... ok +test varchar ... ok +test char ... ok +test bytea ... ok +test bit ... ok +test varbit ... ok +test numeric ... ok +test rum_weight ... ok +test array ... ok + + +=========================================================== + All 34 tests passed. + + POLARDB: + All 34 tests, 0 tests in ignore, 0 tests in polar ignore. +=========================================================== + + + + + +psql +create extension rum; +``` + +## 场景化讲解 + +画像业务、搜索业务: + +- 标签匹配+权重排序 +- 标签匹配+时间排序 + +例如文章搜索, 算法举例: + +- 关注文章内容的相关性, 同时要按文章的发布时间顺序排序返回前 10 条. +- 关注文章内容的相关性, 同时要按文章的权重(如按广告费等计算出来的权重)顺序排序返回前 10 条. + +1、创建测试表 + +``` +create table tbl (id int, info tsvector, weight float4); +``` + +2、写入测试数据 + +``` +insert into tbl select id, to_tsvector('hello i am tom lane, i love postgresql'), random()*100 from generate_series(1,100000) id; +insert into tbl select id, to_tsvector('hello i am digoal, i love polardb at aliyun at china.'), random()*100 from generate_series(1,2000) id; +``` + +3、创建 rum 索引, 将权重 attach 到 rum 索引的 ctid(s)中. + +``` +create index on tbl using rum (info rum_tsvector_hash_addon_ops, weight) with (attach = 'weight', to = 'info'); +``` + +4、使用 rum 高效搜索和排序 + +4\.1、匹配字符串, 并且权重越大越好的? + +``` +select *, weight <=| '100000'::float4 from tbl where info @@ 'digoal&polardb' ORDER BY weight <=| '100000'::float4 limit 10; + + id | info | weight | ?column? +------+-----------------------------------------------------------------+---------+------------------ + 1078 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.9273 | 99900.0727005005 + 877 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.8128 | 99900.187171936 + 118 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.8049 | 99900.1951217651 + 881 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.4699 | 99900.5300979614 + 1257 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.4317 | 99900.5682678223 + 459 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.3815 | 99900.6185073853 + 1306 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.3271 | 99900.6729354858 + 300 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.2863 | 99900.713722229 + 313 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.2731 | 99900.7268676758 + 618 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.2371 | 99900.7629318237 +(10 rows) + + + +select *, weight <=| '100000'::float4 from tbl where info @@ 'digoal' ORDER BY weight <=| '100000'::float4 limit 10; + + id | info | weight | ?column? +------+-----------------------------------------------------------------+---------+------------------ + 1078 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.9273 | 99900.0727005005 + 877 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.8128 | 99900.187171936 + 118 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.8049 | 99900.1951217651 + 881 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.4699 | 99900.5300979614 + 1257 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.4317 | 99900.5682678223 + 459 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.3815 | 99900.6185073853 + 1306 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.3271 | 99900.6729354858 + 300 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.2863 | 99900.713722229 + 313 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.2731 | 99900.7268676758 + 618 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 99.2371 | 99900.7629318237 +(10 rows) +``` + +``` +postgres=# explain (analyze,verbose,timing,costs,buffers) select *, weight <=| '100000'::float4 from tbl where info @@ 'digoal&polardb' ORDER BY weight <=| '100000'::float4 limit 10; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------ + Limit (cost=24.00..40.06 rows=3 width=48) (actual time=2.081..2.097 rows=10 loops=1) + Output: id, info, weight, ((weight <=| '100000'::real)) + Buffers: shared hit=21 + -> Index Scan using tbl_info_weight_idx on public.tbl (cost=24.00..40.06 rows=3 width=48) (actual time=2.079..2.093 rows=10 loops=1) + Output: id, info, weight, (weight <=| '100000'::real) + Index Cond: (tbl.info @@ '''digoal'' & ''polardb'''::tsquery) + Order By: (tbl.weight <=| '100000'::real) + Buffers: shared hit=21 + Planning Time: 0.160 ms + Execution Time: 2.149 ms +(10 rows) + + + +postgres=# explain (analyze,verbose,timing,costs,buffers) select *, weight <=| '100000'::float4 from tbl where info @@ 'digoal' ORDER BY weight <=| '100000'::float4 limit 10; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------- + Limit (cost=12.00..35.81 rows=10 width=89) (actual time=1.598..1.616 rows=10 loops=1) + Output: id, info, weight, ((weight <=| '100000'::real)) + Buffers: shared hit=15 + -> Index Scan using tbl_info_weight_idx on public.tbl (cost=12.00..4869.90 rows=2040 width=89) (actual time=1.596..1.612 rows=10 loops=1) + Output: id, info, weight, (weight <=| '100000'::real) + Index Cond: (tbl.info @@ '''digoal'''::tsquery) + Order By: (tbl.weight <=| '100000'::real) + Buffers: shared hit=15 + Planning Time: 0.104 ms + Execution Time: 1.655 ms +(10 rows) +``` + +4\.2、反过来排, 权重越小越好的? + +``` +select *, weight |=> '-1'::float4 from tbl where info @@ 'digoal' ORDER BY weight |=> '-1'::float4 limit 10; + + id | info | weight | ?column? +------+-----------------------------------------------------------------+-----------+------------------ + 554 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.0363963 | 1.03639627248049 + 192 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.0421133 | 1.04211333394051 + 757 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.124864 | 1.12486390769482 + 1855 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.125145 | 1.1251448392868 + 191 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.134997 | 1.1349972486496 + 60 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.179037 | 1.1790367513895 + 1580 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.21992 | 1.21991994976997 + 1432 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.244062 | 1.24406225979328 + 719 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.244155 | 1.2441546022892 + 81 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 0.329849 | 1.32984939217567 +(10 rows) + + +postgres=# explain select *, weight |=> '-1'::float4 from tbl where info @@ 'digoal' ORDER BY weight |=> '-1'::float4 limit 10; + QUERY PLAN +--------------------------------------------------------------------------------------------- + Limit (cost=12.00..35.53 rows=10 width=89) + -> Index Scan using tbl_info_weight_idx on tbl (cost=12.00..4955.27 rows=2101 width=89) + Index Cond: (info @@ '''digoal'''::tsquery) + Order By: (weight |=> '-1'::real) +(4 rows) +``` + +4\.3、或者离某个指定权重点越近越好的? + +``` +postgres=# select *, weight <=> '50'::float4 from tbl where info @@ 'digoal' ORDER BY weight <=> '50'::float4 limit 10; + id | info | weight | ?column? +------+-----------------------------------------------------------------+---------+-------------------- + 38 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 49.9803 | 0.0197181701660156 + 1590 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 50.1099 | 0.109916687011719 + 1153 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 50.1187 | 0.118724822998047 + 884 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 50.1466 | 0.146591186523438 + 1329 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 50.1551 | 0.155113220214844 + 303 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 49.8312 | 0.168792724609375 + 568 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 50.1816 | 0.181587219238281 + 1706 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 49.8142 | 0.185768127441406 + 1136 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 49.8095 | 0.190475463867188 + 1838 | 'aliyun':9 'china':11 'digoal':4 'hello':1 'love':6 'polardb':7 | 49.7829 | 0.217105865478516 +(10 rows) + +postgres=# explain select *, weight <=> '50'::float4 from tbl where info @@ 'digoal' ORDER BY weight <=> '50'::float4 limit 10; + QUERY PLAN +--------------------------------------------------------------------------------------------- + Limit (cost=12.00..35.53 rows=10 width=89) + -> Index Scan using tbl_info_weight_idx on tbl (cost=12.00..4955.27 rows=2101 width=89) + Index Cond: (info @@ '''digoal'''::tsquery) + Order By: (weight <=> '50'::real) +(4 rows) +``` + +如果没有 rum, 那么这个搜索需要进行全表匹配, 性能非常差. + +仅使用 GIN 则只能对多值元素进行搜索, 无法实现权重排序的索引加速, 需要回表后排序, 性能也比较差. + +``` +postgres=# select relpages from pg_class where relname='tbl'; + relpages +---------- + 1462 +(1 row) + + +postgres=# set enable_indexscan = off; + +postgres=# set enable_bitmapscan = off; + +postgres=# explain (analyze,verbose,timing,costs,buffers) select *, weight <=| '100000'::float4 from tbl where info @@ 'digoal' ORDER BY weight <=| '100000'::float4 limit 10; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------- + Limit (cost=2787.65..2787.68 rows=10 width=89) (actual time=27.140..27.144 rows=10 loops=1) + Output: id, info, weight, ((weight <=| '100000'::real)) + Buffers: shared hit=1462 + -> Sort (cost=2787.65..2792.91 rows=2101 width=89) (actual time=27.139..27.141 rows=10 loops=1) + Output: id, info, weight, ((weight <=| '100000'::real)) + Sort Key: ((tbl.weight <=| '100000'::real)) + Sort Method: top-N heapsort Memory: 27kB + Buffers: shared hit=1462 + -> Seq Scan on public.tbl (cost=0.00..2742.25 rows=2101 width=89) (actual time=25.883..26.810 rows=2000 loops=1) + Output: id, info, weight, (weight <=| '100000'::real) + Filter: (tbl.info @@ '''digoal'''::tsquery) + Rows Removed by Filter: 100000 + Buffers: shared hit=1462 + Planning Time: 0.078 ms + Execution Time: 27.171 ms +(15 rows) +``` + +rum 实现了精准多值列搜索, 同时支持索引内排序, 性能最佳. + +以上例子才 10.2 万条记录, 使用 rum 扫描的数据块已减少 70 倍, 数据量再增大, 扫描的数据块将更少, 性能提升将会更加明显. + +## 参考 + +- [《重新发现 PostgreSQL 之美 - 9 面向多值列的倒排索引 GIN|RUM》](https://github.com/digoal/blog/blob/master/202105/20210531_02.md) +- [《PostgreSQL RUM 索引原理》](https://github.com/digoal/blog/blob/master/202011/20201128_02.md) +- [《PostgreSQL 任意字段组合搜索 - rum 或 多字段 bitmapscan 对比》](https://github.com/digoal/blog/blob/master/202005/20200520_02.md) +- [《PostgreSQL rum 索引结构 - 比 gin posting list|tree 的 ctid(行号)多了 addition info》](https://github.com/digoal/blog/blob/master/201907/20190706_01.md) +- [《PostgreSQL 相似搜索插件介绍大汇总 (cube,rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)》](https://github.com/digoal/blog/blob/master/201809/20180904_01.md) +- [《PostgreSQL 设计优化 case - 大宽表任意字段组合查询索引如何选择(btree, gin, rum) - (含单个索引列数超过 32 列的方法)》](https://github.com/digoal/blog/blob/master/201808/20180803_01.md) +- [《PostgreSQL ADHoc(任意字段组合)查询(rums 索引加速) - 非字典化,普通、数组等组合字段生成新数组》](https://github.com/digoal/blog/blob/master/201805/20180518_02.md) +- [《PostgreSQL ADHoc(任意字段组合)查询 与 字典化 (rum 索引加速) - 实践与方案 1 - 菜鸟 某仿真系统》](https://github.com/digoal/blog/blob/master/201802/20180228_01.md) +- [《PostgreSQL 结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 3 rum, smlar 应用场景分析》](https://github.com/digoal/blog/blob/master/201701/20170116_04.md) +- [《从难缠的模糊查询聊开 - PostgreSQL 独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》](https://github.com/digoal/blog/blob/master/201612/20161231_01.md) +- [《PostgreSQL 全文检索加速 快到没有朋友 - RUM 索引接口(潘多拉魔盒)》](https://github.com/digoal/blog/blob/master/201610/20161019_01.md) +- [《[直播]为什么饿了么网上订餐不会凉凉 & 牛顿发现万有引力有关?》](https://github.com/digoal/blog/blob/master/202010/20201018_01.md) +- [《HTAP 数据库 PostgreSQL 场景与性能测试之 47 - (OLTP 多模优化) 空间应用 - 高并发空间位置更新、多属性 KNN 搜索并测(含空间索引)末端配送、新零售类项目》](https://github.com/digoal/blog/blob/master/201711/20171107_48.md) diff --git a/docs/zh/practice/similarity.md b/docs/zh/practice/similarity.md new file mode 100644 index 00000000000..edff7aeba3d --- /dev/null +++ b/docs/zh/practice/similarity.md @@ -0,0 +1,405 @@ +--- +author: digoal +date: 2023/02/03 +minute: 20 +--- + +# 通过 pg_similarity 实现 17 种文本相似搜索算法 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版通过 pg_similarity 实现 17 种文本相似搜索 - token 归一切分, 根据文本相似度检索相似文本. + +测试环境为 macos+docker, polardb 部署请参考: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## pg_similarity for PolarDB + +pg_similarity 支持 17 种相似算法 + +- L1 Distance (as known as City Block or Manhattan Distance); +- Cosine Distance; +- Dice Coefficient; +- Euclidean Distance; +- Hamming Distance; +- Jaccard Coefficient; +- Jaro Distance; +- Jaro-Winkler Distance; +- Levenshtein Distance; +- Matching Coefficient; +- Monge-Elkan Coefficient; +- Needleman-Wunsch Coefficient; +- Overlap Coefficient; +- Q-Gram Distance; +- Smith-Waterman Coefficient; +- Smith-Waterman-Gotoh Coefficient; +- Soundex Distance. + +以上大多数相似算法支持索引操作. 详见: https://github.com/eulerto/pg_similarity + +需要注意 + +- token 切分归一化的算法由参数设置, 如果你的数据写入时参数是 a, 那么写入的文本会按 a 来切分, 如果未来又改成了 b, 那么未来的切分和之前的切分算法可能不一样, 当然如果业务允许也 OK. +- 在比对文本相似性时亦如此. + +## 部署 pg_similarity for PolarDB + +1、下载并编译 + +``` +git clone --depth 1 https://github.com/eulerto/pg_similarity.git + + +cd pg_similarity/ + +USE_PGXS=1 make +USE_PGXS=1 make install +``` + +``` +export PGHOST=127.0.0.1 + +[postgres@67e1eed1b4b6 pg_similarity]$ USE_PGXS=1 make installcheck +/home/postgres/tmp_basedir_polardb_pg_1100_bld/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress --inputdir=./ --bindir='/home/postgres/tmp_basedir_polardb_pg_1100_bld/bin' --dbname=contrib_regression test1 test2 test3 test4 +(using postmaster on 127.0.0.1, default port) +============== dropping database "contrib_regression" ============== +DROP DATABASE +============== creating database "contrib_regression" ============== +CREATE DATABASE +ALTER DATABASE +============== running regression test queries ============== +test test1 ... ok +test test2 ... ok +test test3 ... ok +test test4 ... ok + + +========================================================== + All 4 tests passed. + + POLARDB: + All 4 tests, 0 tests in ignore, 0 tests in polar ignore. +========================================================== +``` + +2、加载 pg_similarity 插件 + +``` +postgres=# create database db1; +CREATE DATABASE + +postgres=# \c db1 +You are now connected to database "db1" as user "postgres". +db1=# create extension pg_similarity ; +CREATE EXTENSION +``` + +3、pg_similarity 插件会新增一些函数和操作符, 用于相似搜索. + +``` +db1=# \df + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+-------------------------+------------------+-------------------------------------------------------------------------------+------ + public | block | double precision | text, text | func + public | block_op | boolean | text, text | func + public | cosine | double precision | text, text | func + public | cosine_op | boolean | text, text | func + public | dice | double precision | text, text | func + public | dice_op | boolean | text, text | func + public | euclidean | double precision | text, text | func + public | euclidean_op | boolean | text, text | func + public | gin_extract_query_token | internal | internal, internal, smallint, internal, internal, internal, internal | func + public | gin_extract_value_token | internal | internal, internal, internal | func + public | gin_token_consistent | boolean | internal, smallint, internal, integer, internal, internal, internal, internal | func + public | hamming | double precision | bit varying, bit varying | func + public | hamming_op | boolean | bit varying, bit varying | func + public | hamming_text | double precision | text, text | func + public | hamming_text_op | boolean | text, text | func + public | jaccard | double precision | text, text | func + public | jaccard_op | boolean | text, text | func + public | jaro | double precision | text, text | func + public | jaro_op | boolean | text, text | func + public | jarowinkler | double precision | text, text | func + public | jarowinkler_op | boolean | text, text | func + public | lev | double precision | text, text | func + public | lev_op | boolean | text, text | func + public | matchingcoefficient | double precision | text, text | func + public | matchingcoefficient_op | boolean | text, text | func + public | mongeelkan | double precision | text, text | func + public | mongeelkan_op | boolean | text, text | func + public | needlemanwunsch | double precision | text, text | func + public | needlemanwunsch_op | boolean | text, text | func + public | overlapcoefficient | double precision | text, text | func + public | overlapcoefficient_op | boolean | text, text | func + public | qgram | double precision | text, text | func + public | qgram_op | boolean | text, text | func + public | smithwaterman | double precision | text, text | func + public | smithwaterman_op | boolean | text, text | func + public | smithwatermangotoh | double precision | text, text | func + public | smithwatermangotoh_op | boolean | text, text | func + public | soundex | double precision | text, text | func + public | soundex_op | boolean | text, text | func +(39 rows) + +db1=# \do + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +--------+------+---------------+----------------+-------------+------------- + public | ~!! | text | text | boolean | + public | ~!~ | text | text | boolean | + public | ~## | text | text | boolean | + public | ~#~ | text | text | boolean | + public | ~%% | text | text | boolean | + public | ~** | text | text | boolean | + public | ~*~ | text | text | boolean | + public | ~++ | text | text | boolean | + public | ~-~ | text | text | boolean | + public | ~== | text | text | boolean | + public | ~=~ | text | text | boolean | + public | ~?? | text | text | boolean | + public | ~@@ | text | text | boolean | + public | ~@~ | text | text | boolean | + public | ~^^ | text | text | boolean | + public | ~|| | text | text | boolean | + public | ~~~ | text | text | boolean | +(17 rows) +``` + +4、pg_similarity 的常用配置, 我们只需将 pg_similarity 配置到 shared_preload_libraries 即可开始测试. + +``` +[postgres@67e1eed1b4b6 pg_similarity]$ cat pg_similarity.conf.sample +#----------------------------------------------------------------------- +# postgresql.conf +#----------------------------------------------------------------------- +# the former needs a restart every time you upgrade pg_similarity and +# the later needs that you create a $libdir/plugins directory and move +# pg_similarity.so to it (it doesn't require a restart; just open a new +# connection). +#shared_preload_libraries = 'pg_similarity' +# - or - +#local_preload_libraries = 'pg_similarity' + +#----------------------------------------------------------------------- +# pg_similarity +#----------------------------------------------------------------------- + +# - Block - +#pg_similarity.block_tokenizer = 'alnum' # alnum, camelcase, gram, or word +#pg_similarity.block_threshold = 0.7 # 0.0 .. 1.0 +#pg_similarity.block_is_normalized = true + +# - Cosine - +#pg_similarity.cosine_tokenizer = 'alnum' +#pg_similarity.cosine_threshold = 0.7 +#pg_similarity.cosine_is_normalized = true + +# - Dice - +#pg_similarity.dice_tokenizer = 'alnum' +#pg_similarity.dice_threshold = 0.7 +#pg_similarity.dice_is_normalized = true + +# - Euclidean - +#pg_similarity.euclidean_tokenizer = 'alnum' +#pg_similarity.euclidean_threshold = 0.7 +#pg_similarity.euclidean_is_normalized = true + +# - Hamming - +#pg_similarity.hamming_threshold = 0.7 +#pg_similarity.hamming_is_normalized = true + +# - Jaccard - +#pg_similarity.jaccard_tokenizer = 'alnum' +#pg_similarity.jaccard_threshold = 0.7 +#pg_similarity.jaccard_is_normalized = true + +# - Jaro - +#pg_similarity.jaro_threshold = 0.7 +#pg_similarity.jaro_is_normalized = true + +# - Jaro - +#pg_similarity.jaro_threshold = 0.7 +#pg_similarity.jaro_is_normalized = true + +# - Jaro-Winkler - +#pg_similarity.jarowinkler_threshold = 0.7 +#pg_similarity.jarowinkler_is_normalized = true + +# - Levenshtein - +#pg_similarity.levenshtein_threshold = 0.7 +#pg_similarity.levenshtein_is_normalized = true + +# - Matching Coefficient - +#pg_similarity.matching_tokenizer = 'alnum' +#pg_similarity.matching_threshold = 0.7 +#pg_similarity.matching_is_normalized = true + +# - Monge-Elkan - +#pg_similarity.mongeelkan_tokenizer = 'alnum' +#pg_similarity.mongeelkan_threshold = 0.7 +#pg_similarity.mongeelkan_is_normalized = true + +# - Needleman-Wunsch - +#pg_similarity.nw_threshold = 0.7 +#pg_similarity.nw_is_normalized = true + +# - Overlap Coefficient - +#pg_similarity.overlap_tokenizer = 'alnum' +#pg_similarity.overlap_threshold = 0.7 +#pg_similarity.overlap_is_normalized = true + +# - Q-Gram - +#pg_similarity.qgram_tokenizer = 'qgram' +#pg_similarity.qgram_threshold = 0.7 +#pg_similarity.qgram_is_normalized = true + +# - Smith-Waterman - +#pg_similarity.sw_threshold = 0.7 +#pg_similarity.sw_is_normalized = true + +# - Smith-Waterman-Gotoh - +#pg_similarity.swg_threshold = 0.7 +#pg_similarity.swg_is_normalized = true +``` + +5、测试相似搜索, 导入测试数据 + +``` +[postgres@67e1eed1b4b6 ~]$ cd pg_similarity/ +[postgres@67e1eed1b4b6 pg_similarity]$ psql +psql (11.9) +Type "help" for help. + +postgres=# CREATE TABLE simtst (a text); +CREATE TABLE +postgres=# +postgres=# INSERT INTO simtst (a) VALUES +postgres-# ('Euler Taveira de Oliveira'), +postgres-# ('EULER TAVEIRA DE OLIVEIRA'), +postgres-# ('Euler T. de Oliveira'), +postgres-# ('Oliveira, Euler T.'), +postgres-# ('Euler Oliveira'), +postgres-# ('Euler Taveira'), +postgres-# ('EULER TAVEIRA OLIVEIRA'), +postgres-# ('Oliveira, Euler'), +postgres-# ('Oliveira, E. T.'), +postgres-# ('ETO'); +INSERT 0 10 +postgres=# +postgres=# \copy simtst FROM 'data/similarity.data' +COPY 2999 +``` + +6、测试相似搜索, 创建 gin 索引 + +https://github.com/eulerto/pg_similarity/blob/master/pg_similarity--1.0.sql + +以下操作符支持索引检索 + +``` +CREATE OPERATOR CLASS gin_similarity_ops +FOR TYPE text USING gin +AS + OPERATOR 1 ~++, -- block + OPERATOR 2 ~##, -- cosine + OPERATOR 3 ~-~, -- dice + OPERATOR 4 ~!!, -- euclidean + OPERATOR 5 ~??, -- jaccard +-- OPERATOR 6 ~%%, -- jaro +-- OPERATOR 7 ~@@, -- jarowinkler +-- OPERATOR 8 ~==, -- lev + OPERATOR 9 ~^^, -- matchingcoefficient +-- OPERATOR 10 ~||, -- mongeelkan +-- OPERATOR 11 ~#~, -- needlemanwunsch + OPERATOR 12 ~**, -- overlapcoefficient + OPERATOR 13 ~~~, -- qgram +-- OPERATOR 14 ~=~, -- smithwaterman +-- OPERATOR 15 ~!~, -- smithwatermangotoh +-- OPERATOR 16 ~*~, -- soundex + FUNCTION 1 bttextcmp(text, text), + FUNCTION 2 gin_extract_value_token(internal, internal, internal), + FUNCTION 3 gin_extract_query_token(internal, internal, int2, internal, internal, internal, internal), + FUNCTION 4 gin_token_consistent(internal, int2, internal, int4, internal, internal, internal, internal), + STORAGE text; +``` + +``` +postgres=# create index on simtst using gin (a gin_similarity_ops); +CREATE INDEX +``` + +6、测试相似搜索, 使用索引根据相似性高速锁定目标数据. + +可以根据 threshold 调整目标数据, 大于等于它的相似度才会被返回. + +相似度 threadshold 设置越大, 范围越收敛, 性能越好. + +可以放到函数中设置 threadshold, 分阶段返回. + +- [《社交、电商、游戏等 推荐系统 (相似推荐) - 阿里云 pase smlar 索引方案对比》](https://github.com/digoal/blog/blob/master/202004/20200421_01.md) + +``` +postgres=# show pg_similarity.cosine_tokenizer; + pg_similarity.cosine_tokenizer +-------------------------------- + alnum +(1 row) + +postgres=# show pg_similarity.cosine_threshold; + pg_similarity.cosine_threshold +-------------------------------- + 0.7 +(1 row) + +postgres=# show pg_similarity.cosine_is_normalized; + pg_similarity.cosine_is_normalized +------------------------------------ + on +(1 row) + +postgres=# select *, cosine(a, 'hello') from simtst where a ~## 'hello' limit 10; + a | cosine +---+-------- +(0 rows) + +postgres=# select *, cosine(a, 'EULER TAVEIRA DE OLIVEI') from simtst where a ~## 'EULER TAVEIRA DE OLIVEI' limit 10; + a | cosine +---------------------------+-------- + EULER TAVEIRA DE OLIVEIRA | 0.75 +(1 row) + +postgres=# explain select *, cosine(a, 'EULER TAVEIRA DE OLIVEI') from simtst where a ~## 'EULER TAVEIRA DE OLIVEI' limit 10; + QUERY PLAN +---------------------------------------------------------------------------------- + Limit (cost=36.02..44.29 rows=3 width=40) + -> Bitmap Heap Scan on simtst (cost=36.02..44.29 rows=3 width=40) + Recheck Cond: (a ~## 'EULER TAVEIRA DE OLIVEI'::text) + -> Bitmap Index Scan on simtst_a_idx (cost=0.00..36.02 rows=3 width=0) + Index Cond: (a ~## 'EULER TAVEIRA DE OLIVEI'::text) +(5 rows) + +postgres=# set pg_similarity.cosine_threshold=0.75; +SET +postgres=# select *, cosine(a, 'EULER TAVEIRA DE OLIVEI') from simtst where a ~## 'EULER TAVEIRA DE OLIVEI' limit 10; + a | cosine +---------------------------+-------- + EULER TAVEIRA DE OLIVEIRA | 0.75 +(1 row) + +postgres=# set pg_similarity.cosine_threshold=0.76; +SET +postgres=# select *, cosine(a, 'EULER TAVEIRA DE OLIVEI') from simtst where a ~## 'EULER TAVEIRA DE OLIVEI' limit 10; + a | cosine +---+-------- +(0 rows) +``` + +## 参考 + +https://github.com/eulerto/pg_similarity diff --git a/docs/zh/practice/smlar.md b/docs/zh/practice/smlar.md new file mode 100644 index 00000000000..c1f63f9fb24 --- /dev/null +++ b/docs/zh/practice/smlar.md @@ -0,0 +1,418 @@ +--- +author: digoal +date: 2023/02/03 +minute: 10 +--- + +# 相似文本搜索、自助选药、相似人群圈选等场景加速实践 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍使用 PolarDB 开源版 smlar 插件进行高效率相似文本搜索、自助选药、相似人群圈选等业务 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## 场景 + +1、自助匹配药品, 例如用户根据病情描述, 自动匹配相关的药品. 这个属于文本相似范畴. 文本相似性: + +注意有语义的情况: + +- 感冒,不发烧,咳嗽,无痰,流清涕,肌肉酸痛 +- 感冒,发烧,咳嗽,有痰,无鼻涕 + +将药品主治症状的文本向量化, 存储为文本数组. + +根据病人描述, 将文本向量化, 在药品库中进行文本向量的相似匹配, 快速找到最匹配的药品. + +2、根据特征进行人群扩选, 例如在数据库中存储了每个用户的特征(使用数组表示) + +根据输入的数组(画像)搜索相似人群, 即人群扩选, 业务上进行精准推送. + +3、文章相似性搜索, 因为文章关键字很多, 每个关键字的权重也不一样, 不能只按命中多少关键字来决定相似性. 可以借助 tfidf, 结合总文本数, 关键字在所有文本中出现的次数, 命中关键字等进行计算. + +在所有文本中出现次数越多的关键字, 根据算法其权重可能越低. 具体算法可参考: + +- [《PostgreSQL 结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 1 文本(关键词)分析理论基础 - TF(Term Frequency 词频)/IDF(Inverse Document Frequency 逆向文本频率)》](https://github.com/digoal/blog/blob/master/201701/20170116_02.md) +- https://www.pgcon.org/2012/schedule/attachments/252_smlar-2012.pdf + +## 设计与算法 + +以上需求实际上都是多值列的相似计算, 使用 smlar 插件即可实现. + +数据存储: 多值列(例如数组) + +多值列的相似性算法: cosine, overlap, tfidf. + +``` + switch(getSmlType()) + { + case ST_TFIDF: + PG_RETURN_FLOAT4( TFIDFSml(sa, sb) ); + break; + case ST_COSINE: + { + int cnt; + double power; + + power = ((double)(sa->nelems)) * ((double)(sb->nelems)); + cnt = numOfIntersect(sa, sb); + + PG_RETURN_FLOAT4( ((double)cnt) / sqrt( power ) ); + } + break; + case ST_OVERLAP: + { + float4 res = (float4)numOfIntersect(sa, sb); + + PG_RETURN_FLOAT4(res); + } + break; +``` + +元素去重后计算. + +``` +postgres=# set smlar.type='cosine'; +SET +postgres=# SELECT smlar('{1,4,6}'::int[], '{5,4,6}' ); + smlar +---------- + 0.666667 +(1 row) +postgres=# SELECT smlar('{1,4,6}'::int[], '{5,4,4,6}' ); + smlar +---------- + 0.666667 +(1 row) +-- 2/sqrt(3*3) + +postgres=# set smlar.type='overlap'; +SET +postgres=# SELECT smlar('{1,4,6}'::int[], '{5,4,4,6}' ); + smlar +------- + 2 +(1 row) +-- 2 + +postgres=# set smlar.type='tfidf'; +SET + +-- 设置tfidf表, 这个表可以用采样文档统计得到, 也可以自由定义其内容 +set smlar.stattable = 'documents_body_stats'; + +create table documents_body_stats ( -- tfidf权重表. + value text unique, -- value表示的关键字出现在多少篇文档中; value is null的行表示总文档篇数; + ndoc int not null +); + +insert into documents_body_stats values ('0', 1); -- 0 出现在了1篇文章中. +insert into documents_body_stats values ('1', 100); -- 1 出现在了100篇文章中. +insert into documents_body_stats values ('4', 101), ('6', 201); +insert into documents_body_stats values ('5', 1001); +insert into documents_body_stats values (null, 10000); -- value is null的行表示总文档篇数; + +postgres=# SELECT smlar('{1,4,6}'::text[], '{5,4,4,6}' ); + smlar +---------- + 0.742594 +(1 row) + +postgres=# SELECT smlar('{1,4,6}'::text[], '{5,5,5,6,6}' ); + smlar +-------- + 0.4436 +(1 row) + +postgres=# SELECT smlar('{0,1,4,5,6}'::text[], '{0,1,5}' ); + smlar +---------- + 0.868165 +(1 row) + +postgres=# SELECT smlar('{0,1,4,5,6}'::text[], '{1,5,6}' ); + smlar +---------- + 0.531762 +(1 row) +``` + +## 加速原理 + +smlar 对数组支持 gin 和 gist 两个索引接口, 以 gin 为例, 如何快速筛选相似的记录? + +例如, 输入条件的数组长度为 6, 使用 overlap 算法, 要求相似度为 4, 那么必须要有 4 个或 4 个以上元素命中的记录才符合要求. + +- 在 gin 索引中搜索元素 1, 提取到 ctid 里的 blockid, 每个 blockid +1. +- 在 gin 索引中搜索元素 2, 提取到 ctid 里的 blockid, 每个 blockid +1. +- 在 gin 索引中搜索元素 3, 提取到 ctid 里的 blockid, 每个 blockid +1. +- 在 gin 索引中搜索元素 4, 提取到 ctid 里的 blockid, 每个 blockid +1. +- 在 gin 索引中搜索元素 5, 提取到 ctid 里的 blockid, 每个 blockid +1. +- 在 gin 索引中搜索元素 6, 提取到 ctid 里的 blockid, 每个 blockid +1. + +在以上 blockid 中, 数据库只需要回表搜索大于等于 4 的 blockid, recheck 是否满足相似条件. + +gin,gist 支持的 operator calss? + +GiST/GIN support for % and && operations for: + +| Array Type | GIN operator class | GiST operator class | +| ------------- | --------------------- | --------------------- | +| bit[] | \_bit_sml_ops | +| bytea[] | \_bytea_sml_ops | \_bytea_sml_ops | +| char[] | \_char_sml_ops | \_char_sml_ops | +| cidr[] | \_cidr_sml_ops | \_cidr_sml_ops | +| date[] | \_date_sml_ops | \_date_sml_ops | +| float4[] | \_float4_sml_ops | \_float4_sml_ops | +| float8[] | \_float8_sml_ops | \_float8_sml_ops | +| inet[] | \_inet_sml_ops | \_inet_sml_ops | +| int2[] | \_int2_sml_ops | \_int2_sml_ops | +| int4[] | \_int4_sml_ops | \_int4_sml_ops | +| int8[] | \_int8_sml_ops | \_int8_sml_ops | +| interval[] | \_interval_sml_ops | \_interval_sml_ops | +| macaddr[] | \_macaddr_sml_ops | \_macaddr_sml_ops | +| money[] | \_money_sml_ops | +| numeric[] | \_numeric_sml_ops | \_numeric_sml_ops | +| oid[] | \_oid_sml_ops | \_oid_sml_ops | +| text[] | \_text_sml_ops | \_text_sml_ops | +| time[] | \_time_sml_ops | \_time_sml_ops | +| timestamp[] | \_timestamp_sml_ops | \_timestamp_sml_ops | +| timestamptz[] | \_timestamptz_sml_ops | \_timestamptz_sml_ops | +| timetz[] | \_timetz_sml_ops | \_timetz_sml_ops | +| varbit[] | \_varbit_sml_ops | +| varchar[] | \_varchar_sml_ops | \_varchar_sml_ops | + +## 例子 + +1、部署 smlar on PolarDB + +``` +git clone --depth 1 git://sigaev.ru/smlar.git + + +cd smlar/ + +USE_PGXS=1 make +USE_PGXS=1 make install + + +[postgres@aa25c5be9681 smlar]$ USE_PGXS=1 make installcheck +/home/postgres/tmp_basedir_polardb_pg_1100_bld/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress --inputdir=./ --bindir='/home/postgres/tmp_basedir_polardb_pg_1100_bld/bin' --dbname=contrib_regression smlar int2 int4 int8 float4 float8 money oid timestamp timestamptz time timetz date interval macaddr inet cidr text varchar char bytea bit varbit numeric int4g int8g intervalg textg int4i int8i intervali texti composite_int4 composite_text +(using postmaster on 127.0.0.1, default port) +============== dropping database "contrib_regression" ============== +DROP DATABASE +============== creating database "contrib_regression" ============== +CREATE DATABASE +ALTER DATABASE +============== running regression test queries ============== +test smlar ... ok +test int2 ... ok +test int4 ... ok +test int8 ... ok +test float4 ... ok +test float8 ... ok +test money ... ok +test oid ... ok +test timestamp ... ok +test timestamptz ... ok +test time ... ok +test timetz ... ok +test date ... ok +test interval ... ok +test macaddr ... ok +test inet ... ok +test cidr ... ok +test text ... ok +test varchar ... ok +test char ... ok +test bytea ... ok +test bit ... ok +test varbit ... ok +test numeric ... ok +test int4g ... ok +test int8g ... ok +test intervalg ... ok +test textg ... ok +test int4i ... ok +test int8i ... ok +test intervali ... ok +test texti ... ok +test composite_int4 ... ok +test composite_text ... ok + + +=========================================================== + All 34 tests passed. + + POLARDB: + All 34 tests, 0 tests in ignore, 0 tests in polar ignore. +=========================================================== +``` + +2、安装插件 + +``` +postgres=# create extension smlar ; +CREATE EXTENSION +``` + +3、创建测试表, 写入测试数据 + +``` +create table tbl (id int, propt int[]); + +create or replace function gen_arr(normal int, hot int) returns int[] as $$ + select array(select (100000*random())::int+500 from generate_series(1,$1)) || array(select (500*random())::int from generate_series(1,$2)); +$$ language sql strict; + +insert into tbl select id, gen_arr(22, 10) from generate_series(1,2000000) id; + +postgres=# select * from tbl limit 5; + id | propt +----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | {1386,57573,55117,44934,83223,3444,77658,49523,85849,62549,99593,40714,53146,32510,68449,33662,45912,70227,64560,78831,86052,56387,157,490,51,484,53,176,273,240,300,277} + 2 | {15075,100383,88390,18019,77540,37413,3368,39590,36506,43582,92236,68516,11532,25398,13927,81259,89457,92259,66811,45344,23676,64902,275,100,375,451,373,116,251,150,141,324} + 3 | {16664,82803,7375,53577,85671,46465,89583,28753,38201,57599,39785,63099,71026,20543,52056,62785,86854,96900,85960,51256,51917,5901,129,208,400,244,459,49,386,283,198,467} + 4 | {47066,46889,24635,93031,35972,52888,30732,93071,92172,93330,63597,12216,44887,25882,98570,41287,11343,49327,92704,16743,75095,34373,481,117,129,30,3,412,228,470,107,461} + 5 | {46010,85290,76290,98398,15522,68861,90070,8352,31959,1786,52739,57341,99856,93526,68184,48683,85730,84427,23278,19603,80575,46747,224,430,234,136,159,204,243,120,406,471} +(5 rows) +``` + +4、创建索引 + +``` +create index on tbl using gin (propt _int4_sml_ops); +``` + +5、相似度搜索 + +overlap + +``` +postgres=# set smlar.type ='overlap'; +SET +postgres=# set smlar.threshold=10; +SET + +postgres=# explain analyze select * from tbl where propt % '{157,490,51,484,53,176,273,240,300,277}'::int[]; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------- + Bitmap Heap Scan on tbl (cost=219.50..6871.30 rows=2000 width=36) (actual time=37.548..37.549 rows=1 loops=1) + Recheck Cond: (propt % '{157,490,51,484,53,176,273,240,300,277}'::integer[]) + Heap Blocks: exact=1 + -> Bitmap Index Scan on tbl_propt_idx (cost=0.00..219.00 rows=2000 width=0) (actual time=37.514..37.515 rows=1 loops=1) + Index Cond: (propt % '{157,490,51,484,53,176,273,240,300,277}'::integer[]) + Planning Time: 0.161 ms + Execution Time: 37.593 ms +(7 rows) + +Time: 38.683 ms +postgres=# select * from tbl where propt % '{157,490,51,484,53,176,273,240,300,277}'::int[]; + id | propt +----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | {1386,57573,55117,44934,83223,3444,77658,49523,85849,62549,99593,40714,53146,32510,68449,33662,45912,70227,64560,78831,86052,56387,157,490,51,484,53,176,273,240,300,277} +(1 row) + +Time: 38.794 ms + +关闭索引, 性能直线下降: +postgres=# set enable_bitmapscan =off; +SET +Time: 0.510 ms +postgres=# select * from tbl where propt % '{157,490,51,484,53,176,273,240,300,277}'::int[]; + id | propt +----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | {1386,57573,55117,44934,83223,3444,77658,49523,85849,62549,99593,40714,53146,32510,68449,33662,45912,70227,64560,78831,86052,56387,157,490,51,484,53,176,273,240,300,277} +(1 row) + +Time: 12553.942 ms (00:12.554) +``` + +采用 smlar 提速 100 倍以上. + +cosine + +``` +postgres=# set smlar.type ='cosine'; +SET + +postgres=# set smlar.threshold=0.55; +SET +Time: 1.107 ms +postgres=# select * from tbl where propt % '{157,490,51,484,53,176,273,240,300,277}'::int[]; + id | propt +----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | {1386,57573,55117,44934,83223,3444,77658,49523,85849,62549,99593,40714,53146,32510,68449,33662,45912,70227,64560,78831,86052,56387,157,490,51,484,53,176,273,240,300,277} +(1 row) + +Time: 42.701 ms +``` + +tfidf + +- 例如将所有的药品说明书进行文本向量处理, 提取关键字, 生成 tfidf 表. +- 请自行测试 + +## 参考 + +https://github.com/jirutka/smlar + +- [《PostgreSQL 在资源搜索中的设计 - pase, smlar, pg_trgm - 标签+权重相似排序 - 标签的命中率排序》](https://github.com/digoal/blog/blob/master/202009/20200930_01.md) +- [《社交、电商、游戏等 推荐系统 (相似推荐) - 阿里云 pase smlar 索引方案对比》](https://github.com/digoal/blog/blob/master/202004/20200421_01.md) +- [《PostgreSQL 相似搜索插件介绍大汇总 (cube,rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)》](https://github.com/digoal/blog/blob/master/201809/20180904_01.md) +- [《海量数据,海明(simhash)距离高效检索(smlar) - 阿里云 RDS PosgreSQL 最佳实践 - bit string 比特字符串 相似度搜索》](https://github.com/digoal/blog/blob/master/201708/20170804_01.md) +- [《PostgreSQL 结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 3 rum, smlar 应用场景分析》](https://github.com/digoal/blog/blob/master/201701/20170116_04.md) +- [《PostgreSQL 结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 2 smlar 插件详解》](https://github.com/digoal/blog/blob/master/201701/20170116_03.md) +- [《使用 PolarDB 开源版 和 imgsmlr 存储图像特征值以及快速的进行图像相似搜索》](https://github.com/digoal/blog/blob/master/202212/20221222_04.md) +- [《PolarDB 开源版通过 pg_similarity 实现 17 种文本相似搜索 - token 归一切分, 根据文本相似度检索相似文本.》](https://github.com/digoal/blog/blob/master/202212/20221209_01.md) +- [《如何用 PolarDB 在不确定世界寻找确定答案 (例如图像相似) - vector|pase》](https://github.com/digoal/blog/blob/master/202212/20221201_02.md) +- [《DuckDB 字符串相似性计算函数》](https://github.com/digoal/blog/blob/master/202208/20220829_02.md) +- [《JSON 局部相似 搜索例子》](https://github.com/digoal/blog/blob/master/202203/20220323_02.md) +- [《PostgreSQL + FDW + vector 插件加速向量检索 - 在不确定世界寻找确定答案 (例如图像相似)》](https://github.com/digoal/blog/blob/master/202203/20220302_01.md) +- [《PostgreSQL 开源 高维向量相似搜索插件 vector - 关联阿里云 rds pg pase, cube, 人脸识别》](https://github.com/digoal/blog/blob/master/202105/20210514_03.md) +- [《PostgreSQL 应用开发解决方案最佳实践系列课程 - 7. 标签搜索和圈选、相似搜索和圈选、任意字段组合搜索和圈选系统》](https://github.com/digoal/blog/blob/master/202105/20210510_01.md) +- [《PostgreSQL 应用开发解决方案最佳实践系列课程 - 3. 人脸识别和向量相似搜索》](https://github.com/digoal/blog/blob/master/202105/20210506_01.md) +- [《PostgreSQL 文本相似搜索 - pg_trgm_pro - 包含则 1, 不包含则计算 token 相似百分比》](https://github.com/digoal/blog/blob/master/202101/20210103_01.md) +- [《PostgreSQL 在资源搜索中的设计 - pase, smlar, pg_trgm - 标签+权重相似排序 - 标签的命中率排序》](https://github.com/digoal/blog/blob/master/202009/20200930_01.md) +- [《PostgreSQL 模糊查询、相似查询 (like '%xxx%') pg_bigm 比 pg_trgm 优势在哪?》](https://github.com/digoal/blog/blob/master/202009/20200912_01.md) +- [《PostgreSQL 向量相似推荐设计 - pase》](https://github.com/digoal/blog/blob/master/202004/20200424_01.md) +- [《社交、电商、游戏等 推荐系统 (相似推荐) - 阿里云 pase smlar 索引方案对比》](https://github.com/digoal/blog/blob/master/202004/20200421_01.md) +- [《PostgreSQL ghtree 实现的海明距离排序索引, 性能不错(模糊图像) - pg-knn_hamming - bit string 比特字符串 相似度搜索》](https://github.com/digoal/blog/blob/master/202003/20200326_08.md) +- [《PostgreSQL bktree 索引 using gist 例子 - 海明距离检索 - 短文相似、模糊图像搜索 - bit string 比特字符串 相似度搜索》](https://github.com/digoal/blog/blob/master/202003/20200324_29.md) +- [《阿里云 PostgreSQL 案例精选 2 - 图像识别、人脸识别、相似特征检索、相似人群圈选》](https://github.com/digoal/blog/blob/master/202002/20200227_01.md) +- [《PostgreSQL+MySQL 联合解决方案 - 第 12 课视频 - 全文检索、中文分词、模糊查询、相似文本查询》](https://github.com/digoal/blog/blob/master/202001/20200116_01.md) +- [《PostgreSQL+MySQL 联合解决方案 - 第 11 课视频 - 多维向量相似搜索 - 图像识别、相似人群圈选等》](https://github.com/digoal/blog/blob/master/202001/20200115_01.md) +- [《PostgreSQL+MySQL 联合解决方案 - 第 9 课视频 - 实时精准营销(精准圈选、相似扩选、用户画像)》](https://github.com/digoal/blog/blob/master/202001/20200113_01.md) +- [《画像系统标准化设计 - PostgreSQL roaringbitmap, varbitx , 正向关系, 反向关系, 圈选, 相似扩选(向量相似扩选)》](https://github.com/digoal/blog/blob/master/201911/20191128_02.md) +- [《阿里云 PostgreSQL 向量搜索、相似搜索、图像搜索 插件 palaemon - ivfflat , hnsw , nsg , ssg》](https://github.com/digoal/blog/blob/master/201908/20190815_01.md) +- [《PostgreSQL 多维、图像 欧式距离、向量距离、向量相似 查询优化 - cube,imgsmlr - 压缩、分段、异步并行》](https://github.com/digoal/blog/blob/master/201811/20181129_01.md) +- [《PostgreSQL 相似人群圈选,人群扩选,向量相似 使用实践 - cube》](https://github.com/digoal/blog/blob/master/201810/20181011_01.md) +- [《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试与优化 3 - citus 8 机 128shard (4 亿图像)》](https://github.com/digoal/blog/blob/master/201809/20180904_04.md) +- [《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试与优化 2 - 单机分区表 (dblink 异步调用并行) (4 亿图像)》](https://github.com/digoal/blog/blob/master/201809/20180904_03.md) +- [《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试与优化 1 - 单机单表 (4 亿图像)》](https://github.com/digoal/blog/blob/master/201809/20180904_02.md) +- [《PostgreSQL 相似搜索插件介绍大汇总 (cube,rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)》](https://github.com/digoal/blog/blob/master/201809/20180904_01.md) +- [《Greenplum 轨迹相似(伴随分析)》](https://github.com/digoal/blog/blob/master/201806/20180607_02.md) +- [《PostgreSQL 相似文本检索与去重 - (银屑病怎么治?银屑病怎么治疗?银屑病怎么治疗好?银屑病怎么能治疗好?)》](https://github.com/digoal/blog/blob/master/201803/20180329_01.md) +- [《PostgreSQL 相似搜索分布式架构设计与实践 - dblink 异步调用与多机并行(远程 游标+记录 UDF 实例)》](https://github.com/digoal/blog/blob/master/201802/20180205_03.md) +- [《PostgreSQL 相似搜索设计与性能 - 地址、QA、POI 等文本 毫秒级相似搜索实践》](https://github.com/digoal/blog/blob/master/201802/20180202_01.md) +- [《PostgreSQL 遗传学应用 - 矩阵相似距离计算 (欧式距离,...XX 距离)》](https://github.com/digoal/blog/blob/master/201712/20171227_01.md) +- [《用 PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC 查询》](https://github.com/digoal/blog/blob/master/201712/20171205_02.md) +- [《HTAP 数据库 PostgreSQL 场景与性能测试之 17 - (OLTP) 数组相似查询》](https://github.com/digoal/blog/blob/master/201711/20171107_18.md) +- [《HTAP 数据库 PostgreSQL 场景与性能测试之 16 - (OLTP) 文本特征向量 - 相似特征(海明...)查询》](https://github.com/digoal/blog/blob/master/201711/20171107_17.md) +- [《HTAP 数据库 PostgreSQL 场景与性能测试之 13 - (OLTP) 字符串搜索 - 相似查询》](https://github.com/digoal/blog/blob/master/201711/20171107_14.md) +- [《海量数据,海明(simhash)距离高效检索(smlar) - 阿里云 RDS PosgreSQL 最佳实践 - bit string 比特字符串 相似度搜索》](https://github.com/digoal/blog/blob/master/201708/20170804_01.md) +- [《17 种文本相似算法与 GIN 索引 - pg_similarity》](https://github.com/digoal/blog/blob/master/201705/20170524_01.md) +- [《PostgreSQL 结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 3 rum, smlar 应用场景分析》](https://github.com/digoal/blog/blob/master/201701/20170116_04.md) +- [《PostgreSQL 结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 2 smlar 插件详解》](https://github.com/digoal/blog/blob/master/201701/20170116_03.md) +- [《PostgreSQL 结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 1 文本(关键词)分析理论基础 - TF(Term Frequency 词频)/IDF(Inverse Document Frequency 逆向文本频率)》](https://github.com/digoal/blog/blob/master/201701/20170116_02.md) +- [《导购系统 - 电商内容去重\内容筛选应用(实时识别转载\盗图\侵权?) - 文本、图片集、商品集、数组相似判定的优化和索引技术》](https://github.com/digoal/blog/blob/master/201701/20170112_02.md) +- [《从相似度算法谈起 - Effective similarity search in PostgreSQL》](https://github.com/digoal/blog/blob/master/201612/20161222_02.md) +- [《聊一聊双十一背后的技术 - 毫秒分词算啥, 试试正则和相似度》](https://github.com/digoal/blog/blob/master/201611/20161118_01.md) +- [《PostgreSQL 文本数据分析实践之 - 相似度分析》](https://github.com/digoal/blog/blob/master/201608/20160817_01.md) diff --git a/docs/zh/practice/tsdb.md b/docs/zh/practice/tsdb.md new file mode 100644 index 00000000000..fcb6205d854 --- /dev/null +++ b/docs/zh/practice/tsdb.md @@ -0,0 +1,308 @@ +--- +author: digoal +date: 2023/02/03 +minute: 25 +--- + +# 时序数据高速写入、压缩、实时聚合计算、自动老化等实践 + + + +## 背景 + +PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB 与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. + +本文将介绍 PolarDB 开源版 使用 TimescaleDB 实现时序数据高速写入、压缩、实时聚合计算、自动老化等 + +测试环境为 macOS+docker, PolarDB 部署请参考下文: + +- [《如何用 PolarDB 证明巴菲特的投资理念 - 包括 PolarDB 简单部署》](https://github.com/digoal/blog/blob/master/202209/20220908_02.md) + +## Timescale DB 部署 + +目前 PolarDB 开源版本兼容 PG 11, 所以只能使用 TimescaleDB 1.7.x 的版本, 未来 PolarDB 升级到 14 后, 可以使用 TimescaleDB 2.x 的版本. + +``` +cd ~ + +git clone -b 1.7.x --depth 1 https://github.com/timescale/timescaledb +cd timescaledb + +./bootstrap -DREGRESS_CHECKS=OFF + +cd build && make + +sudo make install +``` + +修改 polardb 配置 + +``` +vi ~/tmp_master_dir_polardb_pg_1100_bld/postgresql.conf + +vi ~/tmp_replica_dir_polardb_pg_1100_bld1/postgresql.conf +vi ~/tmp_replica_dir_polardb_pg_1100_bld2/postgresql.conf + +shared_preload_libraries = 'timescaledb,......' +``` + +更多的参数配置和优化建议参考: + +- https://github.com/timescale/timescaledb-tune + +## 使用 TimescaleDB + +``` +postgres=# create extension timescaledb ; +WARNING: +WELCOME TO + _____ _ _ ____________ +|_ _(_) | | | _ \ ___ \ + | | _ _ __ ___ ___ ___ ___ __ _| | ___| | | | |_/ / + | | | | _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \ + | | | | | | | | | __/\__ \ (_| (_| | | __/ |/ /| |_/ / + |_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/ + Running version 1.7.4 +For more information on TimescaleDB, please visit the following links: + + 1. Getting started: https://docs.timescale.com/getting-started + 2. API reference documentation: https://docs.timescale.com/api + 3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture + +Note: TimescaleDB collects anonymous reports to better understand and assist our users. +For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry. + +CREATE EXTENSION +``` + +``` +postgres=# \dx + List of installed extensions + Name | Version | Schema | Description +-------------+---------+------------+------------------------------------------------------------------- + plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language + postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions + timescaledb | 1.7.5 | public | Enables scalable inserts and complex queries for time-series data +(3 rows) +``` + +创建普通时序表 + +``` +-- We start by creating a regular SQL table + +CREATE TABLE conditions ( + time TIMESTAMPTZ NOT NULL, + location TEXT NOT NULL, + temperature DOUBLE PRECISION NULL, + humidity DOUBLE PRECISION NULL +); +``` + +将普通表转化为 timescale 时序表 + +``` +-- This creates a hypertable that is partitioned by time +-- using the values in the `time` column. + +SELECT create_hypertable('conditions', 'time'); +``` + +写入测试数据 + +``` +INSERT INTO conditions(time, location, temperature, humidity) + VALUES (NOW(), 'office', 70.0, 50.0); +``` + +查询时序表基表内容 + +``` +SELECT * FROM conditions ORDER BY time DESC LIMIT 100; +``` + +基表自动分片存储 + +``` +postgres=# \d+ conditions + Table "public.conditions" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +-------------+--------------------------+-----------+----------+---------+----------+--------------+------------- + time | timestamp with time zone | | not null | | plain | | + location | text | | not null | | extended | | + temperature | double precision | | | | plain | | + humidity | double precision | | | | plain | | +Indexes: + "conditions_time_idx" btree ("time" DESC) +Triggers: + ts_insert_blocker BEFORE INSERT ON conditions FOR EACH ROW EXECUTE PROCEDURE _timescaledb_internal.insert_blocker() +Child tables: _timescaledb_internal._hyper_1_1_chunk +``` + +``` +INSERT INTO conditions(time, location, temperature, humidity) +select now()+(id||' second')::interval, + md5((random()*1000)::int::text), + random()*100, random()*100 + from generate_series(1,1000000) id; + + +postgres=# \d+ conditions + Table "public.conditions" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +-------------+--------------------------+-----------+----------+---------+----------+--------------+------------- + time | timestamp with time zone | | not null | | plain | | + location | text | | not null | | extended | | + temperature | double precision | | | | plain | | + humidity | double precision | | | | plain | | +Indexes: + "conditions_time_idx" btree ("time" DESC) +Triggers: + ts_insert_blocker BEFORE INSERT ON conditions FOR EACH ROW EXECUTE PROCEDURE _timescaledb_internal.insert_blocker() +Child tables: _timescaledb_internal._hyper_1_1_chunk, + _timescaledb_internal._hyper_1_2_chunk + + +postgres=# SELECT * FROM conditions ORDER BY time DESC LIMIT 100; + time | location | temperature | humidity +-------------------------------+----------------------------------+-------------------+------------------- + 2023-01-16 16:27:12.442233+00 | 70efdf2ec9b086079795c442636b55fb | 0.917297508567572 | 45.0286225881428 + 2023-01-16 16:27:11.442233+00 | b056eb1587586b71e2da9acfe4fbd19e | 59.0947337448597 | 49.3321735877544 + 2023-01-16 16:27:10.442233+00 | 28dd2c7955ce926456240b2ff0100bde | 26.5667649917305 | 88.5223139543086 + 2023-01-16 16:27:09.442233+00 | 1ecfb463472ec9115b10c292ef8bc986 | 12.9402264486998 | 23.304360313341 + 2023-01-16 16:27:08.442233+00 | 82161242827b703e6acf9c726942a1e4 | 48.1451884843409 | 97.9283190798014 + 2023-01-16 16:27:07.442233+00 | 812b4ba287f5ee0bc9d43bbf5bbe87fb | 76.0097410064191 | 20.2729247976094 + 2023-01-16 16:27:06.442233+00 | d645920e395fedad7bbbed0eca3fe2e0 | 97.6623016409576 | 22.9934238363057 + 2023-01-16 16:27:05.442233+00 | 0d0fd7c6e093f7b804fa0150b875b868 | 7.43439155630767 | 96.3830435648561 + 2023-01-16 16:27:04.442233+00 | 6e2713a6efee97bacb63e52c54f0ada0 | 30.4179009050131 | 36.7151976097375 + 2023-01-16 16:27:03.442233+00 | fb7b9ffa5462084c5f4e7e85a093e6d7 | 22.1182454843074 | 23.0733227450401 + 2023-01-16 16:27:02.442233+00 | d1f255a373a3cef72e03aa9d980c7eca | 95.6964490003884 | 43.6015542596579 + 2023-01-16 16:27:01.442233+00 | 89f0fd5c927d466d6ec9a21b9ac34ffa | 60.8098595868796 | 26.7892859410495 + ... +``` + +分片字段自动创建索引 + +``` +postgres=# explain SELECT * FROM conditions ORDER BY time DESC LIMIT 100; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------- + Limit (cost=0.42..7.77 rows=100 width=56) + -> Custom Scan (ChunkAppend) on conditions (cost=0.42..32778.88 rows=446297 width=56) + Order: conditions."time" DESC + -> Index Scan using _hyper_1_2_chunk_conditions_time_idx on _hyper_1_2_chunk (cost=0.42..32778.88 rows=446297 width=56) + -> Index Scan using _hyper_1_1_chunk_conditions_time_idx on _hyper_1_1_chunk (cost=0.42..48162.05 rows=656108 width=56) +(5 rows) +``` + +## 实时聚合基表数据例子 + +https://legacy-docs.timescale.com/v1.7/using-timescaledb/continuous-aggregates + +创建基表 + +``` +CREATE TABLE conditions ( + time TIMESTAMPTZ NOT NULL, + device INTEGER NOT NULL, + temperature FLOAT NOT NULL, + PRIMARY KEY(time, device) +); +SELECT create_hypertable('conditions', 'time'); +``` + +创建自动聚合视图 + +``` +CREATE VIEW conditions_summary_hourly +WITH (timescaledb.continuous) AS +SELECT device, + time_bucket(INTERVAL '1 hour', time) AS bucket, + AVG(temperature), + MAX(temperature), + MIN(temperature) +FROM conditions +GROUP BY device, bucket; + + +CREATE VIEW conditions_summary_daily +WITH (timescaledb.continuous) AS +SELECT device, + time_bucket(INTERVAL '1 day', time) AS bucket, + AVG(temperature), + MAX(temperature), + MIN(temperature) +FROM conditions +GROUP BY device, bucket; +``` + +写入测试数据 + +``` +INSERT INTO conditions(time, device, temperature) +select now()+(id||' second')::interval, + (random()*100)::int, + random()*100 + from generate_series(1,1000000) id; +``` + +查询聚合视图 + +``` +SELECT * FROM conditions_summary_daily +WHERE device = 5 + AND bucket >= '2023-01-01' AND bucket < '2023-01-10'; + + + device | bucket | avg | max | min +--------+------------------------+------------------+------------------+-------------------- + 5 | 2023-01-05 00:00:00+00 | 52.8728757359047 | 99.9651623424143 | 0.113607617095113 + 5 | 2023-01-06 00:00:00+00 | 50.9738177677259 | 99.9353400431573 | 0.0549898017197847 + 5 | 2023-01-07 00:00:00+00 | 49.2079831483183 | 99.9868880026042 | 0.0576195307075977 + 5 | 2023-01-08 00:00:00+00 | 48.3715454505876 | 99.9165495857596 | 0.242615444585681 + 5 | 2023-01-09 00:00:00+00 | 49.0718302013499 | 99.7824223246425 | 0.0885920133441687 +(5 rows) +``` + +``` +SELECT * FROM conditions_summary_daily +WHERE max - min > 1800 + AND bucket >= '2023-01-01' AND bucket < '2023-04-01' +ORDER BY bucket DESC, device DESC LIMIT 20; +``` + +修改聚合视图的自动刷新延迟、保留时间窗口、手工基于时间窗口维护保留数据 + +``` +ALTER VIEW conditions_summary_hourly SET ( + timescaledb.refresh_lag = '1 hour' +); + + +ALTER VIEW conditions_summary_daily SET ( + timescaledb.ignore_invalidation_older_than = '30 days' +); + + +SELECT drop_chunks(INTERVAL '30 days', 'conditions_summary_daily'); +``` + +修改自动聚合视图风格, 是否只查询已聚合内容、或包含未聚合内容(需实时查询基表进行计算): + +``` +ALTER VIEW conditions_summary_hourly SET ( + timescaledb.materialized_only = false +); + +ALTER VIEW conditions_summary_daily SET ( + timescaledb.materialized_only = false +); +``` + +## 参考 + +https://legacy-docs.timescale.com/v1.7/main + +https://legacy-docs.timescale.com/v1.7/using-timescaledb/continuous-aggregates + +https://github.com/timescale/timescaledb-tune

    uP@5*W?w+5G}ewn=TkwCzo=+nGWI54OevLJVaxHaUYsG3J_}+93=g`8Afi+?|mZft~u1Z zpSNE%`qJMhS4v9K<{T_sSWuHJ*>dQZDQwbyfo|18Dx#Awd>#<{ZkY7!JlIipXZ^|c z@BVurl-lT5liBt7jiB5ijG0M+zyB-r6lv*=j=TO`qd3m~gjs(99PUHzk}PG!Z0f6g z`8HBzL-w}dN{<%V83p#`frrkS!{GU}Zi2?TFE$c%t?wQ9zqfxb|R8Xf|x3G@4iA_ICu&U8*u5u>b1QhnCZ6SR~SsHonG5w zF6l>5X(jo=C#+4{5vHpyP zU|vJyK<`Jr=jo4?d%^`4{a;@!E%9Xqg4@d0pBJf~^j?Mm!EIf%)ZRIiEu~!PIxwQ8 zN8L6#F(&ytL@x^c1E_CWl=IpUU4#p17dWCy=X_~A0$ajweOtw#&Ybw*|IoC#e=srn zSY=x0UNvjI6q|Q@R>kwgaQ{q(T$Z9}So}raoEZMjhv~Qny!g#ttZBWkv}dRe?tN8# z{j4|_XJXmsmrC4=xlI$p9_#m3YU0;U(&PnC?Kp-`@Av)(Y3G(#LmoNyQTdVpPO(9( zY!oXZlcq zGAB)f+AqUXhw}OBr>=_?M10hqREpnkRTAjQak^n!jcbR;FEwhkp-XvT8fYAh#W4sT z@nfgd_o9!vxMp_~I?MKrN!f;U4Gm}Hns?N3{g<#yv~7hG?lCpMR&1NNYwfb z&Bo)+aa0gN=Y(0M(f@n*JT@$pv6d8#I}g39`7@lJYYMuW^K|lo_=c{|^VRH*5wI1U z5u%JLA5&5c=zUJO;-#7Hesx{EO3tZErzig5nJ?rw7k}RDDlJ5`KnPs?vdWxo8T2p+9BNXX#rT-vJ((;YKZ|)e}x110t8%e@{Hi$ zbHBbOCO@rCrVpUn(j0Kp4Klo_+MP`309ExL5sy0EZ}xk-pUZLyWgRlzB1&0qJ)Jcj zS?=W;zBTbH>nzDM2SPUl#cAeEt_PVprV0tYzQkGa_9*36vZ8TDvch=pX@u=0JzSIw z%huivrCw^5#&99!o|`drI#Tka556V$1<{{2N`%kEE@}l8%|VI#&fT|w_u2ge0HIck z70U7{jA>}MY_q2?@s5F-6tVHrt1K<#y;Z@%^eEhHl3LKNgd?y8^jJD!~P<)S0xzkn1}EC*Y46WxI6d zb9rptBJvR6u|s|vIjqJ035v@Oj>kK zBGk#)QBg(dhdiEHNoyALcstlvk~U^;d|*N?S~Et)-PN5vPVphb{3Ds)pO1JA4Az{#X)nXCUYf2NYFvQ^-O5(rbQqQO%i~%a2&3!j2zMj8>g{O(>KK> z2v3(DwWW)1uUnelN{JG`@$l=~M1eNwvXh(W0lL0w+j@1*_VfIPMqz;lQ}VV<0oc@O zFwf`IuP*g;Rl?Z5Wi)y|JE*hGT+|wG*$j=kF~A_+Yv=L~`K`XVmMb?-%}UdX{4{hZ zOU!rJ2mNl2^Vd>5Z;{JItuhylHcYgfS?wpWP%B^M9y{y< zv15K2SX_>K+i%lTNAT;X-}5EALqy0%Pm=L70hJ5b53lMI>^4pP>r*EW%(|K1!=IIL z9cC9$+tAFr#Y(d{Fy?GKV+?COOr@Na>&X#js7rkJ1IK}c5=ZlJWxJh(^)kp&_Ycid z*)qVH3L`r+>66&yU?*muEsrHiN$ltf>5o;Kd#auDVl$fTmkXjM^@IrdIs#@dBtXujV0(ZN$U)=@TJjUfEy{P)!xNU#2ZxT0Y&aod+`VLn13w3m(j3*7GzK;*)_d=m zV~A&YS!R>*;a6+!$7fkR9`Vw!IKXZD2J^SbO}py$#^7#g$%%V5kLjyVKdlaSEVdO! z07CF)2_=xZljWsqclLlnzG*X3QbBL&KnWMN>fgS9Uv5`j-zl0@Py5YudU;jUjkYbt za5tl?+~2yKh%T(z;j?lUf{nM`4&=l4cB{&-F>XDZuMqwx<>$exTwGJ|Uv{uXf)7D| zKyb7}-)CuQo3+GYo4Nj_3Qt?EkkeC7wU+X+Q9^2J?sBBM{CEG zQ=F$4t8N*CxJVODLl)zaFWFXmvm%Zc|C63Q|LqM#9QqoY+BiuoGXkk)lU?AHJf6Ri zjA*2{_d}3dO4d-@RrhJ}0qANnl<1aOv|KtF?@oFN1p$g2qwC{6o|5l8KVnt0Wiuo><~O zCB86B?X#?ezi*TccrzpUO;cRpq~Bk9*CvKc>-W5~B4%Q89z0nKWsJrcM+yKt$rV?< z95N*%)D$D@wUnXMEC1^3wIJ;RM(RY zIx>LR>#?&k-5d+1W#<-j{_8~PN!FzhC`l*JNr|CcF1cu)(@xQR>nfyo@WC~LDmb!3 z*_!m`w#__Is#%Qk#!`yh9wc<iAj#Kwe_Ngm4@+}n!RZn>eaojH=tPrR@d0UpX>+Tyoq8~>YGlIWJ-6ar?w2(!-nVqi&ONIIrUEjY-f88hZ!PU4 z*M&n86Mpj%{;;nfQX^$ZWHdVrT#A!?COvVB>6c+ynfqmRr4oHx?MZ11bEtZMlIQrPFD54b&sDW8z5;u7K@(@5rP zG)oK0VvC;y(<(@Ggka)aW3qeX93POC3u^IH4_hc@kh;%Xuf;#0^Tf;Cd+I66A-mi4 zk{g;#Y5i6Oiu#$yOXxbS;Ne3jQ7U0!9CukSJ^M{`i6mO21>G*aQ>qde$bm(|PMBX$ zFJQwZbuOI9k8zJzci*+CAA681_9K?nPkNUP_E41OTBu%N^G_uh-jXOn^2TEqRKpxW zA0Xn3&J9H`>KjK7&F|0c1YUU~3-`{JSKUn#AK}zi$AhLyiLddyZ6aLMU%z?7w}rM{ zFk>g&IsAU{>{GP6_QGum)>oz|gQyf>^OQ`!LO*gb|Ayy|A2sJOP5KkQyKdfb>?;^Jn# zy)OfVKBwg)V_xv~3R?P$_!&7$rKn`jIDsnsTbjU{;kbzf?3*1o@NydGKSLjez^yP5 zSgDf)umj02SY+q*d-~#cfBH>;_J%IJb@(<4Tj)#~oM`e_M@WBINjFGEcC`8oF#zd_ zeb&dnf1SEzg<4Xozd#3%0p&I@Q4-$t|=`x{`=WdQ#B_7~a~9v;-bGK~#aI#Vqg zw$y>*s(#;c4aa|LdoFnwg*@!x6^Fp0So2W3*hhmiaM?&o@+9NN5Mfty07Cm zHajMszcD(px*N#m|I6l;?+OZeXTTHRD@yucVm1^jY`8QFuL;vK-`&Z&;GDd0FSccv z=vkGqQ(SE^pfR}1Fgd;GAE|Vc1k)u6Ej}z+WT3Nk`N6=rfeGL+{rHEbv8$FRWJNz= zUvOgh^tz3fQVq3>2J}DrniGxEzC!Reol7%xXa=V@E5RwW-X>3ju3=k@uU%~ZX*Z}s z<_;b519OIQ_T$tn%Qw@k({&gfcK5n-2I{WpG6=-JQw>yzD}00-EUT)#B2C=6EFkS@ z_zuGY!f56SxYer~!S=8@0wwyFOv!@RcWr~bpiXo-(0+QjucN=B$*HgF?CCPO?1L4; zzd*B7(>3ZA&JDP_%0EFxG}QmP?4*(P3zT|*3=+`?kU_S|c7cN@dxO+|U?_ijm5V)9 zewzRIFWB4XXLm~O3~jUiZg1RNNADJmP{yf`;0?ymYf9`6@LQobH!wO;x7D*pOE8xf z-J5K)(iJ(3|6%vNZ8+@MzYqvG4qORkvl7aH0pFXQ8d`O#uG2)fM9zTQFu_UJ5kL_- zr5)VOlNk*|NcxPWh3G3eQ$94h7X%2lo22}Nf}V{ySun*6E=<|$2uWtj#6SPeyTT_+ zH^9bCeVO)K?Jspt3)l@FCJn@$K!h9@OV9GuP?bn-+rEwuG$5N*7PeK3yPnCnZe@HY zuN09?sh1P*-+)*=sU-j6O~c1QL4FInuNIpn+3YRn!QEF-kPji|AFs?bTOY(PokbL7p!s0HwdIMuq+~*Z7ajqzTIXHq--rydkipsB9 zG;0yyKTjLIg#4_@AsN{pgH0m&L0}hL~UgIOKZ!9 zfACOubJjK=G%$YIHWEub%MJ-9KQ%gqc;nIe5VRIq~zfV7u}H z_8qh;qWu_Q4qfDm_&VKuM~&Js6mS2bp)mPry3)eOBME4s$2+gK#qUpM^H-=A1LEj8 z@b@SI za61B!%M5I14+{+#a%vn{hs@2zL_MkHI0t)Rz2a%u2nDu(B0)Op1YG23lG35`(c-cIBw!QviMS)30uRTe>jUTv* z*lG{>dFicsdRF+=t4rmM%^s|K&;2;<Xf1NBI~!rkhtr5wB3lW1r6!B2ibxPb2~mtu@yIM4sb!%2(#rQMZxF&6#nw z@ct(s*eREq*92GLr2DXsI|}skShfH*lQf*G=|Wto6x{PxoxBj|R8F!2@xi@$=*4Hg zEJRHTI>MER2MoMDzR;(mmdDSJu}5Y=+&*w@XlR zpyTmLli+IUwEa9d5{RpcZdFnu1v2|93E-Kuu8fO6yF-QuD+TDHQDQ%@KlyxT_4e8J z774s~KYynv@?M^sy+hp|N=15D*buGho;MJ8J6Qlov*kSgQQBKv=T=u|wC^>C4M#98 zU@>qUc8iRgy*!A^+X=&g&XK~NYstCVYe#pdYkc0X)@JeNEx>4xfu#c63mc)hBItXr z8>5nZNk&>Dt~QNLv1+~c*ZJ)e8D3qQouOE=~rCGiaByfZu50T=rTv$zpz)J1_CucKC5oBo^>Tk!7@Qeb|N{=N2% zC)6B|E=8%f)-;vXcomLP3|1ZcJ7VNXKdC@zi)c^HPa% zG30x@`R*~tdW}qfh~VkXA08e9V0XgNuTu{!FRuq_=iy+C>WIRr0DtY9X+0Q8OtB^H z>m=oba9&55PDy8?AEn#}j`8kfayT+kDwrQ+cdTjIB{S%OgbvJXlklilX79ubRlVPx z=^R`=wsTIEOWpXo2!Mfus}^@UhS1Uv^fc3E>fM5lwdK#ed)_nqVxu%V#E!D=?CdQy zUA?;$YL>=^;aBjGL*`%>%PH{pLqAK=$(56JthiNz+s)deFyv=x zgi^*HXiC!(sq-$`uikY#YV-33=4U{b?eU8Zq)lLS#(^wI7t`b{1)T(pH=Q{1g#9=P_|G`5IZSMW6WLB)zoOraCIwXPmL#BQFVofFLk=*Zdj+wgn=`# zgMKB2#SV@T1tqYIkL=y=~cjN^TDiWF18X6@S z)L@dikJ<-)mUPwJL=SwT+ZH89>qm9l(s1n*<0C-ZH_HAlUYq{g7^Ll9Jx) z_dslfm4j~?%+kfZ!pFcsNWi6RKgJ6-n;_zri=C_KzRTEy zT0%&;CIHP1_;uwSG49R1BJ3MRMmLbr3a-p@D|rPo`(Aq*-(HvQO_L!IL{sJDsV04NBU{S?dMz)1)d&i+xi-OaJ%TTW)F4f`tp(V>Et0h~xpX3*2g! zl2S{lbe|i9iU0>bab4%s5cG)C0wSCjM8EV**6+9BY?fuE0EhozVJo19SXYf@-|GLDWr0pQSUy(29g~YPifEL-cz*}CC~v6F;`Q$T+4Xraz8%dh>8!aMxr@6Q ziINJ$V#KDB4a)0l_F6J!r7}b>OJ!UOI|E+N3r%P}_7PaB=CiA25irQjWD~?!i#U@P30d)UFd!QDV>gvW?Er>g7pL3N81yHxhQ`$-m-=sBX9`HW2HYuqBVKI0DtU zlBafof%ewitbq9`5cECtlqRuyn5qI zKS1bc*B_c>tjj)l8=VR4ae9s~+W^px&U9mC18AcWO$3)hhA2tE)CN|S-uBj3JIagb&E;KxQq)bO&p>lhz5BzCO#WVA)%V}FumF1}m!N2|;8FfEh zBh^ne$7LAS;M3G*fBgITsp+IN@&*HUsBL=yaUd4>6b8UjA}R7KC>=_^ZzR}-0cK*~ z9D7ys1AaGRNz14MIaDU5c^iE13wUne3{8f(J*ZxC6Iy-L832H%b>5F)9W{`1JOrMO z&ZlL(K1k_`E0>0uTh0ZgnZqv%tC7L=J$7=atj9)T{$VvW!w;SyU0y?`_KPF+k1aCxxMYaSP@h} zkY1t!B3*hC~@yYu+=$H46gp;W!q_x*;_r4V| zCOK zbho9u+rRk-YrCqOs1wqm{~|D^3rQ8qq8NhCG!&L<^$9!X?yzqzb9@u{fWqindmgSXP+94{DVoum?%_KbB z=CCGJG|AZdCC!10q*F`%yn@{16LCr$z{QEqkEy$jqf@0NNRZiE_XOXg!s9(W%%YZt z#HBvFP|6C&SMn<=(MXQ+I&NWe+XQwA_4Gxjd@=VrA57Mi%Y5CS=Ds8WJqQOu#;?0q z-z&C@y2E-jXK)_!t1U>>#d52b7}w6z)<)JZ@+-2fm({Bq()aKXSG0wv;&=WxQkW&TbjMSkDcINo*LsrKl8s=9ltZ~9sqAuC3F0m25E zjT2DxU_#FVy?_S)KrS8(Pf14wCS!J2BDt4Q&9SP&jeBhhwn>pK44o@94fR+4U1FpC z*?`h-RDZa4cr{gDRDKGT7kQMSm~W+OvY60r>O6pzi|(nH_B~3esMpC2s>_DZ7&No| z+>jGikNYX6t^&0sem-5@zqcmlH#q|Qb&vrC`H@@k>`!lBcm_Uz?L9v^YCxrtP2j)j z>=+tP!vflK@jAtmtvpc$Wjn>mQ6&v!*V6^Px}&>`YO!Hl+#L#gsBpMfK1K4QIPd1Y z=H~t+mOoRypW0lqX#sL9;E;V(ALU^W;iw8JR>M&Dc`?$xBrW!^mh-O}SKfN_hM5t9 z0o3YLd^=Z7f$rv{Ue0t{Uqk&`LSkZBCb4C1AJv9@KQS8m(!M%Y-|Jyw*Al4C#QU0D z0K2kSKq%d49I{CX<2@}#jeF@`@>uj5kvZ6X`L~okXno*`;a0nvYt&~0zoW~RL|-5c zpPgw+9nV4&UpF>*2ySIe>VDY1GyuZuuyE}dx{^@wLF_>z0m~r}7bK{Uu-sJFc92Ds z893A~8_wovp0=;eO&|0)f8$})r>^G6A5EoyB0{|2&-Fewjbw>AE1QPo)e8END@M%B z7Lw!wEd|09om;tsK(blk`KCG(CJWiyYLEa`t>ay-4)<+PAY7Z&H-~+jaiwmg@w!W* zrE?VH8-wjirrV#c9i`WDGcxdH(A{iwN8HC}Qm&r+R$U!uLV^-}{B^bcWjBY>1v`vy z`#Ou2&+>l}dj9Z=jp5I}v1jvmL!fY*1Cx4+ft@ujjwyFLfc}tu$oL~ooG#$>>5O`v zqnLgVX!Qq&B%Or6JhbX>e!3*wd8|$K7{C~!9BXeTzb?X?QyO50uaJ9N(sQVFGO zEdXlT{ybn_S~q4#WV-_yq&Ekhir7!Ozl)m9->9Fh!MdP6@bDkRz%(*Lq&X&93@}N3 z{*wNumtn|aiPJJdu28u*vNd}#<5*qyVBoplDgiWVi<~XT*s%8O!m$sR600~*MKi3K zzpDZ54KckrwTY|*ZJ5tyM%qdbZlT!B`}f!VT5rQFC1=K^1j8?h8B9J=q-T6EHK~lR zgS-P(i2So(8pT7z$iWZ@k0NE)drNDEmC)%Qy-XWS=XECN_~JU28uJzA|41pFGBf=? zl&)Kutv?Wpxf=V?Ysu5M!ocIuzcvHqLs6$^G;ev9#q%n}jxid(I$fJS zxBnesQ5qGu6!C+SdE~kT?8&#V1Cek;%_ox|7$!j?KnK zu^U7Y!68S@SI7<{%f}S}+MjJMX{sdU^QsTncha8hv%S&KvJu#L5a^#tmaevxJ~?-v zg#x=sn|JY>YV8xC=9yFDV@e+}niv1rxcFwjE=m6uo2LoI3l(_yZMK|5la4$~m#V~P)2>phzpfO0fB!g4qe%!pexw^m-}Gd|fJwPV zm!VV2C^&98-afFV$SS+sQ-AU=TsYoZlJ9=jt&RdTw~n-r~uWT!}4Up?}uH?kZ#Rq<}5RMh1nF`#$CMO8%1-Tz9#Gk%ZztbvlXO3 zTZl{9w93M8NWK|uhVXBsi`!5Ca!aD_vqyr3%s*`jleOF;#GD(ua9z-ibf5UnDiVES`k!IlXlaCTB5@)=(~! zbn-~rbM#?w1(%BZ_H(HY@22>Dx}V!xz7Qx~Oyy@yQPzvfZl9 zPR(7>ni;L7ZTaJI`NR>KCc==|qu?G9vBC1X_)IaMk$$s?qrCB-6fiXz&P;H7FxWKB z*1t#Q^@>Q%qDvusrgqGDhs{Xtq3)by7@ybpKXS*0a(`@pCS%I~^5LI_Lr+(1!y4iy zh*>v8Bb}=NSFR&n%ZkhbayVp{dzF9Y!AviZaD|G>7vtSGu_Bw(7E>|%woo!?w9)Bg z2pX_abA@(orH;8J%CK!(C{bSt&|d5N{AxMuFQ*Px*US7grQK*Q&(?bFqLm=@Cucy% zZL(i@sjKj@{Oq!lL&D_7=Xqo`Cyqa`xlSPYpEl5jBQdO%0o;=H)wA5<4(?_3fNJ>i?sE?bkP2F9|y0dDlMrJ0_ zn~)ag(*x%@qa_z2EQ#K>S}|w8zW*_BEcO>O_p9?yd=`+!c2EQGNuLvH(`uUaCW|lZ z()O>T?;WmURp_{N9@v!4Vvkh85hWvyXzG|UVzy+KmpPu_Kz&YKUhJ%6r`Ua)@Qc%m zGps~cG>{!@L!XG;IT*ata?X*ziTme1Dgv&r1USW~{7rYYk}BAApkymgfW!cYzEQwA z*?q5wbm0CV6UO#w{tUgJvY_Xdd)147;|(sklSFx?LjY61AXVR}Qu#h!i?CNS^-rQ5 zME6>?MNpP2vwX&h5VCBgsjfnN{MYRl!raOl5<~H^m2n0=MdM$Hj_3G9MhhEtD<>)w zS5<_COQRGJ{KFf^9RJn!2NQx~i$JZYOQgvr)ykjk>jf*@2d|-j2`&RU&9$WlrMZ|* zdtm1~s{1CcoyLzT^Eur)ZPgaK0y>6WO|?c=B$OU6Ygdp^dF(?a<{RNbR(jzrEHl%u z)vv5DpEZvs^#LstJ!0&B@oVPOD^+qgMZVlAjd&FlbabYsMWjJzPXS3;>v(qMhDq9 z(bt}8oJmukq_`hT#Noa4P#v9S-4$(H;Y6{V$_W_v*!@Q__I)3hpBA~+Z)sh zj0M?+^cgNfFuz|@9^2QIYBY*2Xf;}STQ2v5qdS@Jg^y1a%lxbFaQf7)nKXMIJ#*s> zrZjWkTeZ@fMS()&a`@tgz%oy-@%xFot_Mc3hRfw^eHPR#$V(6ttp~5>YL_>v04oE~ z6o$-Wv>n=JAHz~XZ=2AYVr@a?OIqR`d(z{Xc>2u`D1hode>K*Lb~zMTIq4^-pPp@E z+?o7K9RM)P)p#AMSng$xXCKHDW||R}JL`{P=UZtCja@Do!b35s3gdR6R-WTBrOMA3 z+}gr_3JjcBqB=|L(#N;;|7uuERoyX5$}EonT*`M3XZ$uEdSVQoQuCa1R396x(`JC0 z8ZJ(rOmKy(+0W^7;0y^->7f}_KSHXj-^uV-dIZR#=A)0+q4ID)YKp@4+eSI}kD2Fv zwTtAITWvX1cJ|-Mb`!7h=?%?!q{U)lQTt~J|KfQMA&W23CU>*QzDZG&*w;YO3_Lxk zQH8lh?gJ5Nlvsb|yoLxjjJs_sr|!_udtYB}s9W~Ca-D8k!zjP~trh%8uSSC+Osm*` zc>_&;NP-s?Bpr*I5 zdKVY%c*ocNdN_9rOVA2YF_WnzpVvl}*Xn~*Nw?wEqPpoPTr6GJwk`3$4Hk6~jO|Bjr1NvnP!39ooE;C5>oi9rcLh#=}leW^lOJgq` zEd|<9RYe!js)Y*O+kPdF;}$KwQIlIZne+ag93W&wkZyedjqTYb*JJVYvqIs*SX^<-eUD0fI4Xo3*3L zs)y64409<=Ec`jkEJA&&Az<`(3Mh#vu33RecX+2fEF5|h|6qns4SDzX$9*}e8>t4T9cCgtieu6 zz;MzSZSqK|#?%B7Pe>sv$sxgEjb$9CB z$6Dqf@4(k_g_b1dyRMJ5XD)ZO_npgrajo*NFA3PXdkZP^a~WbkX9-5l_Vz}Bs?j+% zib--VVgvPN)nb(i6ZO{lX0Jct%ea!C-R=cbuJWYs=~TaV-9|jy43yLkYPW=j%R|Sd z=cwpqftxY9HeHIZ5*Nps%MZ`qdt_fA$mdgL9Tl~aEV7+ zO)*E-G5Te$^RxiQWAMLr1TBe|AcR2>!Dv#st*xQ`0|EJvCu-Jl%3YXJvxDz@Sm2 z^Hb_)xE+DqhGZxPDo=LIZ#PNTmjj}L<(d(lrjM}deoUnvy#%fde|iNpk!>CtN@KLt zM9fD8;57UB;_@Ssx(C@8mK3@gm480+Qy-0m8&cn>E6q3P&bLpW84@8G;)|fu#RvDh z(831z7s1y}4OC0dt6Z<8pLORC8URsp|FME{IwO+i#TX7!8s;Fr$wg{Z8YSIr02<3<7L6;$b9CY^Z_ zgK?W8qom21)S%i@y?G|o>s{{_T6a3%e+}KXpR7k6hv`JnTO< zL+C{bVBKFJ4#KxE5Wf$K$+A_82~SQJFK3-)F`pppILFgk#IQHw^McQLm- z3H`4joEzynaoXC3j3|t@Z z-^Fd_&qrAu1Q4)qX?!FR6QcHq%1IrGecs80oxKJPqnVDI4`Yt(D_%WIZa*c2ZxHJ` zI8UT+FPcQWz#m3B5Q7T(vzxv;Z;jL`e2nfkcD9d}&C=1(dyRTYO$YO#Hbx1s7Vw4Y zP-)eX{>!cFo!Y?ZQt!Eb_&L?RivEsx^}h|GP^Ep!z3J*cH~cT(>NifCsk9tQSeP2h z{F$kFHpNm!Zh5DXH=a=HDeT%)wABFw0oyM&4+n%N=x;72PvFYOnb! z`1s!bKJ7>MdE`Xb7w9cyliok?HX|{t*#>4@5obiue!s7RtvucCs3&(V^3F~{@4W;e z2lyDyjE;;Ek00o+(0!u1S2A>welphtQM7yU9>{n@iBGu;fA!-bH8NLp(Eq| z+xQj>LBia_!EB_8xjtsU7eA{HrbUUNsG`X~&NJh<-jvQe3Eu$>jzlBNWvpXEcVJz#-%^G8#hn+AF8!|hwrRM!_<1jH7N&JVrfjpbf z1(WjGTT{{=fbDkzVR;Cof^0ICzvTwZMth9S(5701t!!rm?3Hq0AWFr)TbnxSI#nmo zTpR<9_nBgg6UU%v$lTv4(iPqjSS{V8jQ6n53URcu8@ z(i|7f52K0ay$rs=e2o6nSBBkw8$5Hq@l))GbeLI*Lb0bI-)8dDyU9Xcln0P6E9Zhf z7^Wh& z`1Nat;GeZaH3#S;qfszze^2{F9|-49|K=GtKQv!Vv(#o+M!qeOu45F*Vq)*KZ@AD! zu|1?Ec=b>i$k*ZW1dR!QBr`>vBeR~$YOy!AoR)d)v~%7)A7Z&BsV?(kt}B`I?qKnT zcN(5xX;ln8+;##Hq}>ue5VPmE!)UA|=Ep-A8-HqM_84At=`X3#jXx5PZY_SoW?Mb7I>(O9~XHgbiFDhH?E(SBf2+ECK)9 zXt73mA`WjynAupLUtRv}imdR~L+!=P)qc(vDb z_hAC;+@~zUh+5gz7m%wN{>Q;{koGD113;zx$B8GBCp1ZRGsXMpVVak~;I23`{_JTr zk6`Os9Mf>q;FCI5(;quNQ4cnei?P#e+uQ+pBl%j;wEI_-!iqQzDt&{er|<{y@X_AB z`&o^TEi~%HmyZ$h8L^?3=9Sa9o^6}Sx%cb|9U=f z&Sol5He4n;M9CAjTJvw|2U*}B?NB1<7Ic?cUlcjoLEb&e7iK1VA59BTcS^oMju48Y zB*87*woVsqn%90AQ3a`XqjmiOyfhSN0OS}$`kra>hia? z`0#4-pxxmZ168(>Mm5Bhy}u?-_@d)^W!1k^bhzhhq9WvEPCI^L(t#{IYebNM1oqrn z0;&ajwQH^~j3+3Ic)yL4^>#+rgU2JQ(!Q`a#Wnk5+*(Y!qkxw4QWR0|;5&ry3I2@e z&BGKUuT2w0GIcC!5tpxvq)ISrREW4I8yc3j5E3lCM?{ngehf_)B`ZDFBgcm~-LA_7?G2Z2Z`Y(TeJL@FYSgGASrM?7MBxana;E_6(R|R_g!1nnm$y9L zZ`XXBMrdNB7%}F0DW)hJwKACKmpX4|!X7ur62vkhB z^Ppd-zW&A`h0XA1Vh{^8+B~FgB zfKz2=BtS%c?HGNtF+trZA1HGk-}rJy`Qb6Qol*3wuz|*Kf=J6Gl+I6F+lnJpF5CI{ z7*Iy9K8-ppfy}q9MFEmfmy4MsO^7Qh7|FuZX@!8;#u_pL@OF$8PI1W)u~QLa8rqn2 zDp`I0c6UJ+?OFC?Bj|MS!4IgnHD^f-8+)*Y4>P?Hvg^ZLog*Dj9qP{Gpd@fs8Stop zCaZx*1!O;USTWfRJSvE~egtsK41a6^w=8J9diw=7>Axlg`Fa1Jy&Ta;9S8SMNGM=S z(xjW-gf(Cxu%bZM0anx}FkPvM97&ppl=+(u0dhHhzI2NwV5Q@6TE~OGh4UZpu7p1G z|Lq(#LlVl1$b2gxLF8DBKAvx@E@_xt@S_yL3y-V(*P-@tMXzY~5Y>y@@iVju_}0_y z)Yeh5g`sc}KF+C*G)N}x5#XLW#? z-T4aT+tz81gKxoSy3a2A7F_a^eX&ORw+Czi;&gEpV?_|hP29g_NXp+H(DB%rdOl&m zHaatap>cID2IJZkdJOVwl^b#y>T57IGYFZ z8%1YetC647j9VUhDScP*5cRvqRr*??;B}pL@M;ixYuTE0F1)zhqK=p^s%2EY{dE3j z!;17rCGxAft#5nk#T6go3yuBb5pik8kFmAlMXORVkne}$8GR6zx(Z+ zMcD?&@3!g&^W$lo16sl#mt*B3#V?&crT$_wm25&%0<$;aqv|+ z=a>)?`{24qB95z_fqvhOf3{fDIxk(d#_wKIMJC$xx=R{uKi5~l@xa>BStxyEl_KEL zI#f8ntoqtfERA^J#)?rvOcsfB9`D{vbuS&E!cM+jBihk$L=K77EQM@2u!rCuqZV#$ z%~$^kJktCH+73$C1+>CIG<`kH)7L)3ldAnAhU$t6Ery4eUfqAPBwz)pefl$iXJ`OB zn~Y?{2;;*i&B{h7js*sHt$JX_vHzH*4H^lwscdkuAjFB-4R{-O%?xOPV{fI1)xKf}1%bNk%~qc2ZG4(NBcQ}j;E|NNjEzGTg5ikFh@IZ`-w9Kwp> z@bGZyT2%a66jkj6iFjB4=Ez|7r`;QYtrJ}kgRD{){UWjK5>g^~%RKaBL(^N0WwFEH z0&*IbAFzfr&#GA2b1oUQ;R%qJJvpO!ymnHFqK0RVq;ZpMP!pu*yRDYzq85K%1iZYm zu0Fm~^NXptsm^;oWjck6a>i|xV_kU2*Rb(P+)}K$hRr|jtEFP`V)w+1BXq57ENSVz zUxq_cBQ0Is7uWP?VbsrnV4!h)2|0;WqtLieUw~}{vNG)o?KhOCkq^ddnUh!-OM2JN z5_H$yvp#2hS2~w(dng}Sc9$RVD?wGlI5EpNLxC(K??mX#%_tAr?Jr5O?j&8;Q zSS~{knw0bcLi^-|FlUIz5%Xzm!Pzcml5zh(`t(A!lQb#ck1I=ZEUJQ;;PnNTTrW1A za_pBOF`a=aM;FHHmM?8VluKk3`5ah6Q)+=!qMBC~T&2X<`7JwFCR|hzotuqi4RoyeLjkvE-`qVF zeCz1U9DQ30`TS~KOv?<&DWEO=ASqC8!p72~vg&xjtu?0%!uw&h_dFf_r3(TxKnc4; z^1`1L0F$yxoIU;A4EbF|U*|uurW99|g&j>HLw-RE>C%%|erAr6ib6fRZ(3QRdDK6L ziIf)s+@gA&mB|QVX7|9SN>?CypvPdSmZ6mhEDzSZhpuQz;a@pv6q{? zkHea=jO$e%W#qg43L(`~(e-CzRh9van;4L6HQmRUXLVJZkl2V9HEZ79JE}6f~-T3_aO>Q8YVxYK&YR#>|$C~_Y@B; z^IpI%4CmK<$~=OVow}7n+H@I<(q6klehEDBX7?KaO2+6=+cWI-(-xj3i z(I9}xeBP{fvBM35&minn-P49~oi}IvQ~31JK~v)0>4wQUTnvRBu-()$yy|3`7lT(e zzujA!8p{G%jQp(pC#*)|>!-WiXL*k5@SURvqSXA&ed!AQJh&h!8A<--fmT=f{x{v3 zAHA%KLZ6g*8RoB?vh6*sEEeyP>;?_X0CC^4O7vR7JR8ctQ2IbuF4hX{=8)#?4pm~8 zc<5qR_NA`BC@d1?hfD0q%NE(zQO-Lwt8m^Mh{4&|LI4rO^f1O_o*!Zagb1Z}Rhx#Y z^x_LVughYuYTo{Jl~u_JT` zp$Xh)uY}UYDlOB~U%vj6?!_i=zdMm>dj9^9Ysr>Gvd~z&z7g>4m2*2@+SpuU42;M zRcb9`g!gawejt@!xwv>(TU%Sw6X>}MLvQA8Sf40IYoW$0#-QgnAv>eJz0|4Qk2?P* z3(U~qaJA!DMV+o}@e#b!sqq%o+lNxGKTxXCXPYf)nA$CtcdS~&*kK5+`)`!yXv6Vn)6dQi% z%OenlZ(wfa8CZsMjGoGA5G?viyZ&eM7yG31i8gz1dNPzEPCzy@2P@i&5k@lY=iIqh zRTB#P7X}~QS4!h!{Q}(&x%K?d&$u4}X~&t-NO%1}JbDxLhQ{N>LTbUWPJWxVz64Il zlX)cI%=`XXaRA?qG*8?DsucH1q&i=ZJx)c{*z@sg75k2kE`MFUsRb9^zQBBb8`Lhz zP3*w9@V-oWn!n|v`lY3YZ`oMIR3GP+C=^MIIl40Q62PRnF}SS&v*L|m6*5{)(W~Cx zN`LWT;!*aeER$trBb>@LkUljjJFXR54txL$`PxJo_c?^3_y-e8^*L92v#_-b*Qy_B ziFeXi0h#?C35~e_gp^vSH^0peOKhK5e^P%_561fImtD2ip4rb&gwt=nr!699(*$Hk z)cFB)N9JWzj#ZEQTw}FI?w=cb(ZlJ+n5!~fchhjE0@I+@z zI}2#dW?;%ZK4OX|6E+e)E31xSH^cEBKTL+5l-q1KJ;5-Y&F;at@;V*Mjbq!jH2{|K z@}>EIU@6n?OQ*=gcq9j8HVb+g`C^;J+7D_~JA^I?7^gJcm9K|ZUU(9@mGI$FW3EXe zRQI6kM1s!f&rD!M5CsPjD((}_;^w37;aY;g6(glqW^rZ-b~Wi;to+=))~{#T(&GBx zf?v=tC|kc)*Aii47&@>{4B<~*a`jSjR^XcG?ef<)iQc;21DkuH`<`1%U@&z$w$8e$ zU%bTTxFHTaND?6iwgB(5IzRnK`39GnC;jdW(Y!wxso~K-RDYa%;^6s{?eo}2z{AL8 zd*UPRz;$5r`Nu!&JO`L|{);U#3qAfSbI+gFigP_Xua-ft0X8I^B0pL|o<&Q4v@DIu z{o|5odwY1ciVzm|O=|}o*xw+O{0K2tUCwtZGx?FH@-f?iAvF>0%GSOMzfVf`pq9<| zc+kP}JcLwPS?-{N%c}+}YlQFcnit8DRgx~umRnmB{iCKXOpXt_4Hk;9i_p7fpFeWZ zmmG{VmmBP9BAyqK&Ef+ybrxaON6Oym=L#eK#9{=;r&jA|U7&Iwv=?5q@s{5XO#_D4 zDkCp{uIg~l`O6&S5X{Zkq+{l-Y?NRf)jgv*Wdpd0Nk#!+XrQw_W2Q~+q5Omdq@Kt( z{1-=s(WYhYb`jZDjDhg_Hyv>;87nPu$E#IPrIPV|iy)}>IZdN)n8|=zB}~q7^)M~0 z8;chCDG8g?j($d}CM+p{mCNp>Y(=wF21%lYxVdftOJ{HB9vH<{UfC^}TFQ06n@+<6NUis_4Tp>iI{M#+GLdd96 zMt-nM{G8SMM|wJOzv&ntQ|ubUfT_Z_|Jzhy5j&}e;|arI0r>Gbbv4NNeu*EVqK)(W z%nsdP(m8PInfa!IdB*WqNbu%PkI-JrvAkk(&i-eKZb2s zd7D3|fBFoG2U!kx#Jhs@hfA-@e8j&Js=NF%?u@X>Cx7MBbs$CYWj4vj51) zuY>$`Unp~6x0j*$>5rPQd&N^PWh2rD9wo`gBihksp88OH)I=4oZ4s^?-a4AQd7a$= zee`lNw%mPswcNM5c>{ghUES(6P!r*)xvwuv^|b^nhlBayS~K5QEN`ZK-?g&M>%XDR zY4i0;J9sXl@V-sS;U*jT4#lJH9rQHidKIA|GR&cxc5Nu>@B?k=X?xeoy)e7YhotR7 zDHPBalO-vALk}vHrshHa6el0OiB*XQI=GV(!04Ruz;GgUo-L>=^Q^ii-t}fLZ{EOW zuyD4=RoMsYSKT})VEa;&r)ephIQy)}PZ;#*8OJdC%G1VP6>gsS=kd8*wF+F*j~k{- z_-d@>zm~Zue|X%|pH}=W+q>3YC9qdACoMe|otUKVfqfwz1LZ(p$RdK;1EI{tmlFpm zGWlN`e?it!TMGhT%bvmXfZ#)Th4UyA1GB165 z{7q3Uphzs?Eh;*Tghgr3!`3~5QoMDs<2z-%t>+;%5BMCi9{IJapbCI7XXI_#U}gm^ zVjgiu6JjE*9SI6Ih z>ABhVk4t5?Zy$akw>L%(CR2>W0p3RukJnWRuoZAzKxAo`CE6{DX@3yAA0Vu5<4JGK zoO@u>CP`Ta+gj!uB1zDzqownFW(kacvWVlQp*%)TLyRRgO{&iCh6k@?j3NT5AIaL z+s8lC*p*9TPrAgz1m+DC*?cOfGt9Og%Ha2XW)}GY?OXeMpSS24PMfL8^NwVl?CtZ+ z-NsQkg+uKSxZ_v9zGjYTVL;FPqEr(>E5%RT!5`IU`(9GDtF;Yb+`@0MqvG+ow>0Z6 zH|n_6@8}feDsSFua7!IqoTD5k+T9b=7b^_xpQKIejMsE|k0c^`U{(d*fm&sa(Enp% z$L62X$xz1*X6k(}XAM$a^;=ccb z#c;;n?>`G^+~)kS^#|%Y`4k<7*K;LShM4Lzhe;gO3=+Pu>Dwki_v$picykaNvPlEO zHdn#{gK#@nHL8p#_%{v~`NbF+3sqQWHeCHH{a0@>!Fe^5dP+8Ja$3Xa(-ID62B$a4&z>(=Mt_G~qcbP{1#(AQ;kGkBa{J1^|B zQR$wb{TFyvvmR#$1!!^g5AVR9(xpp$eFkK&?e5oTJYL+_2u zw>5H>Aruca(?gIjw1ka`$~E!xzSm?w z-ZtH1bb(o?v#Kkp-_^Nu(2HGgB_g#AMbzzaM4sZ0kGXk0Bdinw8*5r(;<`0QQ0|sr zzEE?|%T#nI(lIc%J3&KgW718jf74y*O2|@c-B_`PQ@cLk+7>c*v!rOz4Z%JDG?Ltr z`SK^8rA8}~BptO7;^ux8t_>3v0o?Q+u2^1Uu2U%uzu_P6{qi*KOyy^R;cg0?TGuGy zXFhvS%N#*tS_6Y>5`Q+GFJfO#w?A7>+kF1&YD|2UiMycB#9_?X{M|^3^uK?@C?t&jlC2}vZGi`{TZJ{fa@HjxX67L&BkDi4 zog0{q<_n*Xtvv}aU&tkQ6lxj4C+}M7XlzT3e$>!2(kA{@q?jOE?A%%*dgPXbc?#@d zP8E)tKU(LAuz%M0A4At&h?#2y&KLqYv|cF0QvWl zele@y@Er?5`^tBE0yRx-Bq))seWo0{DLI#UX|UX+ z3ze5S*y^-zyt(b`F)$1Ni{OGq$Drf+O%11)Ug>lmR!jadj*Z%yU(Omf{&)+=vKpx3 zDe9@R>L@-j(y-ZmWK~78%(SeLF7scKRj3sFWdhc{Zz2>Db}a6XWex&8NSYR{GjohEt)oBm zv5Vi0N%m^L0DQO8%XQRhh_j^CEcR^)MQQGREV<2AHh$IeRAlHU-7)i*Yy-Dvw-($S z&e{ukBP*nT0$IHSDkQ)?%zLUXy66>nxb#nCrsCqy8L*+S`Fqnf)4S^_Wa~^C>uqM$ zOyYN2c}};uqQB|fD7R^3_YII-GO{^T)Uk}l=PK5Sus5VlPeZ57$l5s-mebCkR#RT; z!8}~Du3WX>;F@KHeA+fZ*8x^jFy6)g$7(9+=o5I8)9lmAK?LI2^y|Hu!{JrhI`W#~ z)VC8cRz&m0;$yoyPr%6vF#Ac!4!V&X12|b_ivS&$ZRlm7@u;6iWX54X8j+ZrKm8hM zyx8xiZdcfv4>lI#&y;?&=<)tnXct@ju|hWY4COp{o}#}b&J`i_>dYv8g5>Y;#Kzrs9v8(A z{@hj0-;m@IsVG#-J-lmRTL=)Bsm!TLQG8+MJ}}g^0BtMn(oxrrkTeEr z;S8Lc$k{p*QY0}NHQRt#s?Z5&%kSG2`mXVVt6=-~KB_?KB>is~6slqq^e`5JHyt`a1w;_k9-kb(Dh#Z%F$A|!HxD;rcrLQld zCh2wS0MxI-7~GeD!0bAi+uA10J4v)_E?nw7J71;6uJfx!BB&U)2K^UK{dZe+LR)m! z-1_FJ$`u8EL9^;W7?}e)g}WFjXTK7_q_bdN+X4h#AL$8`7zI%gp3gKVJ-lthvtu2R z-#fc-?E06W2Vje~!h6sz;flR~#>qDa;HG($`vi2z#HId+)t`iWDv5l>7uL8P4$rdO zp^4SPUIVo45v8vGL)+e#-o1vHI5IxaB%V9mC?rN$lEh2&g@3tDj?3X^(cNNvM3>ac-E%e} z!E`LIaxSrb-U~e$;bop2G&oa{mr2$qJs-W-fTLsP3@f z&2{aK7Erl2+j&_k5W5aN+zzcf)D*at_l**AMomhdYXye2n*TJ(eNURIn^;?01xFR- z99ti$;muo$w#SO@8HP8WA^Luh7A&g|fhndWW-U#wI}3i7{Y2Nrx8r}!A(9;xM9s!J zZj-D6G7^YvbBGo{b9`PBqXCbsVDypVrTbp(N-U>~l+M2T8Oe_K-X@9Qq7<;K&Yvi{ z#6Ms;!d8?|_2-oXMVR~5`T!m9)zc~}cVmBMesLHb*&S=j8p~bEtkUbCW2Cog88_Ua zC&4!T;v(32Y68Yoi6!ANs%b+|p*bll2Vm+yz)yZC)HNEh|2 zX+!sLi%)wvH=3i1_tDeGq{EFY^3zo;*M>Ak60ffcWuoZzcZ8YsOVuQYKjj z|Fh#xV5H2!<&!TNikF&)bWn4jU>ulfo6stlW+A12y&@TkIwfZ3&|&3Y)^*cB$y3Yk zENhAOffcpnCaE6(p^=|r@B_*O*X*A^tq*n>KVNw|ad&QG+z9J550Z_QMTDal@h^xqn^EHn7Fn+kL!giJgE>q?h$|e_%3h*s&K$sY)bn036D9A4vi0 z=G16RpohQ;P0}}siy0KwW7p&xbJ1jZS+O7It zKf?2Y+YJlm_bLsFD>%iO}Q0D1hNg}a*d=l%NOW8{lais$g@#;GH8bvM1 z5L(GCACAuekKkqPWr5iY*0-=A-lWD-`bdWPZ#t2D5baLRAFmN?%12-=78n~I367rF zX3;DeQq{jPPF=#O$r@zZOkd`wr) zq5-~SlU}13h}GGandFH0?p$|)m{GzoBvN1ZKrq-Ks!54ej^&C)E%*B3ZEl5)0Fg}< zLPg6bOFthR9`wf5oA(0i#PkEoT_^P~{r8Hm`Dc3HI^+BBlKFItbekQ?Q|!H{?vuhP zG{>ev#%D`uwBii4CV3~e{ZUC;wVAV4$jj1!!{s96!Nz0g!LFKncm@}UgCYw23dEq* zq>GQ2g|*FJ$WftiqtAvYNMOMYtdhFsTp*MV4i26R100$fZw^lYY)pmQKEhq z`MmI$k8d{7zT$E_1Koo8^l{iGlz?kFue_HTj%1$ZjusFmp3Cdv&kl91%UHPBhiqec+vXs&4c{93FyHO3m9-N=XH-<>?5kM>ApJf3fzSQBAJl*C&dK0*Zq4 z5|O4LAiXDI0f7TZ??if&E z_gntqq9T0~Jrd7AhTRsqAqoZGYr^1*S<=l)QwWka4%8W#+DUiwk)Oo8oQ1H8_iE=& zGRH>d`(Z34RP~7`Usc;yS&ry)?K#9Ku7;dOM;0n@_N@REqN~p3TU%^1KT>Psxos+x zdsD|Ki#UNIyzymplJ%x-WeS_9$_l~+9+i7ig}L$k6r`ygv1F)TYA0i=VWxDa=}zTo zf7)p_6)^~AP)2}bLD~fG#WQdhQZjIl2aYjCF17fs8$*9`vAlVN8EvgUgBa>^HI);mSQJ%=YKB@&8g`C&*9Zn=Dg2 z)2$EWCCg(NP4tREA(grO8AZH^D`VOxp5=igH&rg^+xB%IfzQ@XT`xi~QoQM_(F9-- zCu(6$sxPGS};2HO){1#^lVmsP^u@vfvCRk4t{0iZN z8UK2X>uYyMxY~gh1aDr1Oz-SN)z1go!ZwILu-8-9yArVut<2QqdxSR&_C%|X#ZJ|# zca5y&D4lC(<3*(*hbm&~2T66vJYCnbnQ*&=)mlONPDMq% z>3gL{{6{+G)e}v(R^S(!nPF;Yd1PTi*Kj+8tua6V5W{Hu@r+Zp_1@A5@D=Om4bZ*S z{oWO;?jf-W5}=)j`VHq3bYMD5AQu0XPWY`x0m;Dp5>w3fJZ&4Sokcf|c1BqzQ;fo| z=a2i6Oj`!9#J^M>zXYLGnPRGkU2vnZ3Gg0B72Y10<_jh)QtzBQs#>r{eE9v_-f~K~ z(y=oym6uu3Fm`A}^Kg5$+Nk_@H&yFzrS}y z*HAR`VoFZwV-!xj@d^!5i~TBhc^p;r%qj{yE#M{+G!l-9Cm>lK~&TA>{awjDBql)*TYbd4RI+new>9G#Hp zce)n}KFEyae@bJiKXxs`=XMJ2`9%};7f!w$9h#SK2bqY-BaAh!1KU*sPQJn48}q6T z{46dLX@P26zZ78N3z)+zdgq+(#Gj=W1crQzUyd|%6|^%Ri?r7R+CBVRfiG#$`wzQ0 z=UjK__)wtoTs3^+dS_GQuf5l<_GtDKRP5Ju){pYr>h0GLvajAbkf(5VIoBEdkJdcT zM6DeUCn|btmZQ^P78^){MWNPcRJ7J6DOfxkAL*d=CZaqBOIs0PDR8ae`Pe7EzTFfCPVBSN}ZywbfxPYiJJ zD}jlAcW!4D6dS@YfqI3S`L@tL*?ecbQOE|1QgN9XG|~*NVGG7|%|4Bzo1a;Wdl;f7 zR5O`vNn*IXWE^8bE-W;aG) zcxOv_jl`SR*!^{{Zm?I3@di3XlIh8#aN5@z!#6c??X6CBw>70YJJ-`Lsc%y8O(Q+932Hlr@n^H9nPav}?!SmFGrg#vL(_Hs4po5s(wIE;Q7# z)IQvXSq|^qUL^4uC|ewc92`k&n-%d-#y?HNrcK^85c7WbRo>-hLXsVeoPr3{Ya$RK z?Hic84+*bl+-L_;ZAoWyqs)lWLM*PPr?vXFvHD@hcd~#$%jkcc1gB``vmZVdKP}p^ z&S&~=#%_~%F%Jds?Ki<5p7H8YD*z}(&&CxGB|HPO%(t-jAAV`dx&WD-J%}GZM)qxc zG;R+LT5n3v{iTRXAs2!CXb&Dn#ZPSKp=uY_ytg=?fja3+(E5F41@r?2YxS16FyLq=v%PMAf``$-x8nww9)jhvF_(?pKXau~Yh5@N68+8Gj-rFx zqnMq157m~TZ2tY4wHg@f{gYI-{Qe>zn#^6Ddxo3`7pygd`85)kWc}E~2M*IeC9cO5 zwPhxiCZQtl3*}#}+^tDUu2ie&9H^jG@eD_V_J3JM+#Ax1HuNRjw#Z1_#z*;0RL0W% zhT~hX?p=VaYssqNI|4Jvo9=W4M|i=5J&M@gC-A&&R(y%;i+fIai5Q+4zZ78VYG~)U z@Zr170UGJp`|rs+)eWxzKE%YYWHhL3;~nX_&$UKT98W6_Zin8%+je`}PsZrp{&@U+*4ZjfrF?;gOh4$_1rdQtwMLVcv=_Rl~Ho`ImR~O&C zy1%vzX3RBXjtqEqmVaMO|J&Sp$=n(haH?=moqns)4C+?V%pNa@_*OyVH6*rLnEY)o zIhPO5H+BluP@>Bvw*wiZxiu8t(l0okV}l$BOhtBE^Eu~7kXTTk=Yt~#-2b1Y8Zdy7 ztVbRT5yZ-L&Oia7?Aq?pFyXnIB=9o`s~;R|m^uF32rY^;sTJUUGmpA2d_c0-PF$8y zRGq-$H3j%r|CcoZj)cwls!5N6V|@Iagt;Q+bwwu`V$i7h}&m=}Hh zmx5|S(tlwWMReMPFfZ3*ksn@(D2n3PI%7=3!wN4ZT09p^efLr3MuFpL676D)SQXI$ zrqy_s4UFR2%r4^Q4*HFi^1g}pAX1HEWQLxAGH{(@Bcgl8z@ zd~>RHtBQHn=C-s71nXE1Z_C*1=@+dx8{?XWJKULJ!9eLn?#fd%?9Y|dVsHgl?ciD` za>lG{k2Y`dBBKerf*Cz+OxECu9Fun9y8pI6iDxxdVZ2yHYd_`MAW@nu+hCSV#5Fhe z>#ZIB(=OI(W%s^A#6jUPqi%U)dejEgu6TZD&Uf<&{NwB+nP!f3^DMiOCvUc!*dWB1 zj{kK-b096jLna=s`DcP9mvUcYF59^W2ElR%NO29zHKf}L?Ndf01iht@h$5IOE?VfS^{D5{A^LcWZrJDit||+`yXa-XdEHrHK;>M78dRfmzQoUI#ol z%Hq)+d3~DUk#H5iyUV01=U_D!M6cy(0XjdbId=5_s*>}-IOdt@F{ksWSK>tVjQd2B z$%)bRqZGr*;%0X$WC0elND>#jzIcv(u^qq`*q;cqtGkr7NeBF`P*?v0xX4^TxlQ ztb`Mc>wzK*v87m%V^N2SvAy?$!yodVBt16B6!cIrE_$&M`lx#+Q|d#nO|ovR-?PVK z_-&^k!#&LIjQL**I#E#`!{pic;ffz7iQW3IleJvBr)6t)N6S&tjVQ*`I;4*a$nIQ^ ztJ$1Dr~!)s7r-#sT`YpsFP*g{Ymc*7DLZwg=y_{)Hf{Zgz3#KosO24;NaWH2?W})T zCtH5phiX`_cYu6bdH{LT{*LX@%KmG{L)BgFlHVbt@M=((D5y8Uy>JVQD2@1j8N!Rb zv(}dVIFVYGvp*5ttom+q{HrQ+Ms2gHeqLfljgp3*no?=fY_kzK3{pg0_3$(>a6Hq@ zBETx3NkQgzv%~m*&9s*6KqBPuI11@HN?!8^R zZ&`(-T9!h!L$0~7Wfusy5!|0vrtB>ra5w9g71>b7?LJyO5{M#f@2o(&k#Uw+8mAN$ z9F~LyTI(?-J5=w#M+_uvk4&VB@`yZ<-?(gXVJ`E6sfU(9bhdc5le$L%wM6Wi3;@{c zsq}Ld2#Iu?=p)80R$r(0asJLdl`@k3iP>%u4r_c_22ts0-HFl;WhcLC~up7J7Ka7^X zM`BnO);$2x61b+b|zb0=rnvjMRR!!1#;~ zHl%_dLEX)n95eRp-y%Rm>AO!(9o(I9@dSQ@!2xKQU+AkQQQ&O6G{b) zb&Ux(N&KYiul{e_F)hH{_>Y{iMYwj#Z}jw#ccv{Z%mTY%G=YFPEL?@jlue2#Du5yt zeSU12CX<9CF_^`u*~+VPMgxZ*WV@E%aM4hXk<1BFc0`b)G#G+4n83#tI@YA%%(qTt z+?7xtF!PUCZ4DLo7L!>h?%%m`A!2@=LsS-b`;b;zXxa#2>h&$jO!Kg^Zq27JU#P23 ze9Xi|V(nqts--pupEJi%(O8VLjF8mc_fvzcS%Ylcl&elGt{9K3X*!E6B~b~@5C9Ug z>u#V5a%m^%N|o8yTU@qVYo(nxE{5wG@q({VZ}gJyhm0duK$QJoHs>#4$%%_S%)9tz zyRQlULl1eyLz#yJ)_Yi2Lyc{7iW|ML89>>PyZdc_=jG!EyCD(;!DpfC8lF6+77whn zW>@$OnXHvrXH|j~Gujp?e1_l3Ao90C736|tcQ(g?UYBCi)2Tp%dAhwl_DfxjH$5H+ zG`D{QuiP0ZmzTVqtA5No;lm8%y1%JwdaKi1Oiml4J-AVbT(1tR9)I==9QY(SY}mhF!JrIqo#|ZyW^9`CcHt(VjeViC2qE= zzpYo4Ryef$kW&ut(!RaW3yN)4bgmXwaM%TNl`#$akyn4%Y;C{z1dyk8HL(o(XBlLm z8mY4S(7(d6Il~wgK3AhMrde~-*2DKlA+HBZ^)(iOF_=}U=_ZuU2g%_4io5pLu0zwu z>}pH%S8J+ghrMJ$k~?_0n`6F7F(sCzbFi>aGM9hvL^nNUzvNZ+7SGYEf;-Jn^?+pc z*uw8)nF)qwQp}vGs(y17YoY`Js&;nhrI3*YmPTct!fn(1>S#D1ybV?t7nuitbF$z_ zYwQ*49q^=3<(QiK&#Z(Jy!8R>;v}m47_nYfZx+wEFuUWWDg$v6Asc%I;cm(v%OStA zzesZ7@?BcY+~aQb4g=c@|JpjWqFl0xO4aIexBT~@XhI*McJ@sz^8#Vf}G-{gFl?#H?ezbODc@<~Koc5qQHPso*EKD#e8Z(HJlt?DAwYo7yr_lzG-k zM%!jRo^HmXo3EvIx+BCa><-_boQClj>U|)h%7-)BT_Z|5${#JT!k5hEonK@<@^|UD z75uGlQ-bL_2a7MQo|WA#3ES0`m|!E;mmVhB77vuFVP`p*XEKx8TM!sLl1r~;=FzX-jt zDayfCT9a=&P-E0=e-?eqw=aQ5AdHojb+_tB6?mEaE@(kj@RkjJ*<9&hI~pmU->xq- zEABKL+Pc8w9K+%Ih~`G#f%Yl^hP>XE7UQx$5wJ7nL}UxxL#?f%EA zahgF|>y58^ji%RB<|GntX<-T`YKuz?g0N%DlVP}%rP9=5fI-9lVgD<=%E(Xqu^d7& zZX{`yQR#VU_<3oNs)L+P$XoK=v-dDFfez%mTh#?i3J1J6=66PXoD`=8HI#gwhxAml zNB0kqzd)4Whrop|h2ZYKavk(S<9!GRD8*Iq#RW%WI1OzK{^kGLmn+%fDNs)s@Y<69 z?9?ED|8lZgSg-aPPMcB|l#j8i%iGrXSF~P5GXB`&BmD|C@@ce;&kZ&_|BgQOjywUX zDkCT_D`;Q$S7|5H$8);0llhuCW0=hB?|ky{43#du0xMT}G^>srG=W#5Fg^%p%LmYK z5M5<$;}aai3;w&g^rns@A0eZq@`W$2zKm_dnn46>G>O6?eTI;V!Nfz>k|z_?N<0i32$4j;EeT;H}T%_h5Vggk+~9aG1mgrI(87E!?5!#J1)8 zW|+Bw4Q39QSz0W<2x6hYu_94kg>%@|S?)J;aTniLH*=}D36lDv@!^DF>mcP%oO1zY z0+-vdKzkg2m83}U^Wlmu^*=CqvTzkJdhE>F81wzdW8CZ>c#mI}ZD+JQox!IA3rlp< z-AnfQ#dII)YvL3k%Pvl@W1WXh!8Q-GrJtos^L@D2aZ_CSBg&s%Xvg1AsC(Tcn@+xS znVT&k(@yKgHm*Ryt2^1NO(r^q!5O1e1BYbV{QUgj2G4``k;He_|FO>8NOwuLjmEfhU2g~t^*QA=;a0D5yb&UJ7u;{m5ka z(-CTby&eoaWK_E=+t5(ET21Z4ZiQr9@n$)QM_3G(zO8q*!!p&bkx~vu<2ym4wH_9j zyKPACjIX!PSGZd6ys=A6GODMq6yQ17-T8SrVjh&QD%77Mz#2N>9Q45a%k0M0gYHjK zI^GR=Yki3s>S9jYGe%(1o!`SY5gm(5n1{FootUfz2`#!*m2tNPLD=AHH3g6gxkvl^ zJb9ih*??6lf?w{=RY5OLgN~R`hY;UK(2qa4tSI~rJ?ERV2xnMtjk7{9`*sK?5UZfs ztgaf3o&FT?I0qv{;TQB0`y9z~_C5sc&;2!VsVOzwmCQnjnpAPsP)Q2#9)1WCQ+3aN zq3_^L-};E7kTxXoe8+4B@8`DLQr zhn6Uxy&3&4im*O_B47r3hCVMz*&KLQPo`OLeBlUZX}kyrWG98w!%ODXH8#K&{WnjN znSR+Z+Wdy^%2db|nBFhA||#MjK<{pn#g#B~LUE0aV3&lj<2Ak%w#+TmjH$s>yz*B(X=g zTK}W+*eEk(yckPtgHTrqA)_=4X8qlDPHoGwn&A(aC&Wu=H*MhN?T(lT6Dkv6~1Vcfq#; zpSJtHhEH4~wY>2RTeW-$X9}5@L5qfw6c*`j`rD}1)Q2CMjvx12|MBFu!=CEddarEj ztd^`!0>lc@A?Y72^p(RpVge!RJf}LS_I=#4TuXOtEx}EEBPm@?n0e#%L0}qKzPPidV_8G}6=(C}ol%Ngnz9?oX>JrS`p ze`}OvvEupyfr^myc~dp{Lk*3PZsX{qmitjbZey@s^Jjz62e$ShEt{eYe z2VrwUbutpPbe+^6Mo%axai9q{hk@<~eWYtRNeE}7(9#UXNfN^0U*6|3sCCdLDy*nr z$8~JRe&?$JyYoYPt&Gr6qkzO;gWVrcFZUzC46X{D`} zUJ_&6fY8FN0R=K*`9}P5e6*!_8SYXxYpsM+ph&9gT8G=8lJXRT+5Y#hTovCAiL>vm zbp3u1LM>H6{Y&RXlC#b#Y&5m0x98NfTuV?i&C8UyO*S-_h-|aA)4rxuLEM*F^$Ty#iH)Ow{lihnqDH8H5lBv%d{~05|m>?hx=gK(bEwT{d^+c=&5GnqQs9 zZ5Mjne!uYWE2aK2v&96ZLOC@lc5~I?yxYN`n#SNy)v0-iqnM3viM%>F9c7f0^>hS2 z0(KTvW*_01k47{XOU<>6Tin=*+&462@8{C8Iq2b}kVSqyrxnKqQ(F)vxFo^$neFxc zK7Cis@ggmTA^|#|J}otb>-YG%a@RfB(6dkNx5B~&ee9F9gC8>_SuqL+=xQp7mNqOr zD?0>N5Gnl82Md^a9>NLk;yUByJ)1GqFUH$IS?goe3#tuEzaJ#dDZr)6g5Ly)6<>Rc z{STM+ewMW(tH{$;8V1At3J)pD{U{b4F8uWUNwhrwH>=~40!7=e&$HOn{@SBdEqvO; zX-gHZPZdhX{dR?MWy$~Wq2@?e;rLg+etGAcp-Heh9(Ku5PZ#?XB3C%i`-icDpIzEY zELOlyY6Tkub7Rw`MM*Hul`{}N5^I-TyfmlmFe;MtyymAgr&+zIhpNhO?T#4;jgkQ< zj{kzsF*E;y&;L@Kxz!=#L+%hXEP*4^l|WwUoWEce>#_u{Ube7NxzvZI6zk3cok?sQ zQO_|(OoUv-?MHwGNU}etD%sb@5k683X0uPdg?dyy#~*GgcRf_5m`crF)oJUJoxR=k zovolJRhVO?8-FQY+*Mmp zuO~j7P%^dS4mb9Dk+;E{I2g#>rX4oVj0Jf0jY5la5F*|4u{Ha&6>B%z4fbB&ehCf= zQa&7FPqnDu2Ut6f#yAM0 z)%S>JXFkLOEQz(%ZeT57maz5N>@Z@e@pz z&Y0UV0(iFwHzqpC!@>&s;Rm@BpDQkmsC6q_JZvTp3VRk0ayCa&9NtOsr7n9rWH0cB z%4UqyWgQ*~twKhjfT7pf@*08CofoJ(NFR>2e-{hUZnq+Zs<3{Lqe^J!(|_CO)6bdd z`9LY`MS%)kc3zT!tU!&DO8s;L-&|oACUfU{>S{T@CTUyEt4+904RQLi!PS>kmmT3r zG$7A_K?JAUV6HLOeb|$g=#7I{m6|f^jS`-3IxgBg`80IRD(lPQr*@dsS%RW64%J=V z%uiVJ<|-SavEW0tcFCq@rJ8 zK^h#n{f}+RiX1>_7uM3EP>5%berbgKpVePNDb+#m`|mf3JPEN!2x3gV_KJ|Fen8&g zZLiztiRRXt4{prh(9FbzO>JJNB7^7!B)pBDp4?aazD2$PtnvXO`pUTE&ItasNv_GI zQjXk9rc~0l)>*aKS#KAM210045~BB+s-TJ6 zX}A;=(H8dNEVog$fFy%m2-{O+#tAOVkSFSDKMUu_{-hx%axJCyyeg8L=^9;o3wjhX zfGQsj51}R84HkGDlo6}DZ1HCv>A*MzY(sSG0@IL3p|s!! zzmbV~?IAD;UcCfpZlN1^1Ac0LhG~I`BVq(f?0%W42)>)_k&Ms&LQxWu*k!WPA6HcKc z=N3#aZ{CGo+tbG3+iXUV1)CVp-FJ^dUP>oCPPWNblM|SSEaogQH$KCyw5G2WM2ey+ ztM()Q6mN-JV$kVr7kw3TDVW%wA1^ZWO10PQ^5Gy$!K8X&-3KSw__qrA}Ay_DL5j9V!4d;6LQrMC3O1>qR@jn*EI+@#oNx8b_jU#KG855?0nop7k zJJp8<_B-rfguCHxa|?co;SiJ+I%u|CZs2QsQyybpCrO$5Iim7A_g<$A4WYLudULegZ)@Htrg;^s zvS|(R-3nr*IyfpB=J21=fKxfAXB}_g4HLg~94^c=q46_UO!UbtE2SQC2%3EbO!@yk z;-Z3-NT{=nnS59s(a>22R1NCRf-EA#7PvqoHu1W+*dx&oQTMMiezhW*bg5bl$ezs@ z4PnVIDrk-POuTeMy^BQGLg!9v@~rE7^MY8bUt*Kwib?@^#?SZwrPOb8&5_cevc0!{ zL^YVrc(a&)dbjP=N2!Rg*E1h{zh@QPx08__k^vhBuI2IEDFx?;`jbH|DJOJ%ZRX(L z_BQouwn~ig2TBx$l@`p;u^aD%U!Q@eUrlxz()e>fil-5L^W%#L1qB5aOYwR1dO5tu zA%_`)TvvmO2g-SW()mss*(vy=4NeYj-y{*lHvwbyLv-u{-rx@QLL zm5k<1Vs-Is7bFKkS0EF`4BdZqP znHs$zfy?3Uu*Vb2zpQ6I;zIj3=uSLzSdQ*KnUUIq-e{Dv!}hnNL*5(_i~s=oE%Z|k z7?S=TR0@UWwT-Leof-l&*CyfaNds8K+ z&1xVqn0iGb9@wQ0jq+#iP%qcaBdL$^VKKYA-n=!>^*fCJQuyaod=Vh%|6%*%B)N`l z1lR=9gx_xI+$XL^bun;=>FEiXS_x1{UI03BI~*ao;D9rFySIqDoYCHPIr1lwu3P~i zyEsufEH5yY(a8YdCT4ha>RICF>MgsJNlo_! zvLPRCDm69qx~1$_J0)Qf?o%1)k%k}NubKCou_fLB3URwJ86o(fQ#etkMm_cXUU|ho zcgPc`s4~URKpb+zZDB3|zVMe~$7fLd+6n=F(QH;R^_mCKDlKk{@8gjnr03`&kU@Sz z?g98l3$G3#7*rM+POE#)WblhBoIH!FU;=0&OK3uI`=JyvP7(BQ;wZp+hf+1%QLh^0 zC@Xh)BFI5Wb+-yvO^5DZGR#=sfs2gk1K#`7@uOXAsw36sa=N{o##O=eNYH zX~$gqOF=6|G@#>h@|=BwMJ+4!8T)?|dVNtCOh|av_UEF882BJA{~17;1`_uyR0+d` z@qKwZl*uSi*NhmvOxi+L!iMYswefdVnkvD&()sjttTxfl3GP#X*DiMWuO|&$B+k1> zeP0-;xoOt>MXE7X_bGy%^0O(=uQE_U6Xbsgk5KwxF^>Q5qCqFH#GgmdJyrcsg%H&o zQ@%2Wsqt)UC)d02kSQ^fl?7TpeEpizL}9h8=dIpq(*YUho(4eeCGbEh_#=ofoo@DC zivL2$Y2P!`p89gxtwez1!@*UNj5h+=@jji*oEp*#{B1 z>xn0WfdLVWwo*#pZ=_r!UK`Y`0;_rRt_-rEbwXi-2SL4-QzK>(R3F!Wu6F2min_4W z7I&waRPN3#uO3HWIb`)#QhrbjTFeM~N zsgozmu`tu5RG9YU63cb^jxTpyzihBvS`1}hFWujbV{36>Xc_lTT5jq#$XDylTfuPX zCdAb@F`iVqc{R4nciN3~K1qH?GLIxayNym2kZ{S+gj|0mv*bWx$Z1F2Txy;K3qa@n ziCuv)Z>y9ZF9+~Mbt(7O)I75~xXi$+8}rTl*pw<Zqnig+rw6sywwby z81C|_8Mj`yguNl;B2_zv4j%%%89(fhnSQ+ro#$27(q)b$+qtWqBW+e>sEN_uT%+R>1k1nVU? zMFZSpPwT|Kj^4{@vT3V4U*x7UgNG$J5FQKVOifNJ!)S)?1s0x~+7S|+%a_tLrd%Il zniTsx$F-n0bl7iQEoF-$^QV+H_(zk75CQ*<*(VN{UCoMSKpHe%^Y4pEk*FnTno=%6_&%*6Zz@Q1PB0Hd=4 zYm+lI+0su(>$s=CwtrUljJt*NoVcZyeT0juA1;JJs$|{(kiR%r$P=7>YH_#Y#xDNr zfFFmCy(;xUZpA&J7~4aOvy&|RG`PKiDC$YHUueoEL&<}fQIy0$;mZAGyJJG1l9}LPQj&;I#cI<4I!tmeI$Rv#5aGMC6StCP2FWPB?aZj_WnaN z5jo$KnTsWE)@_AtUPE%6y#up2%O~Tja6(JeaRg>KTGZ3l=+<)Gg*AT(-)?(Mxk^XukZ8?c4i8-kcg0h*I$+yc;X7JWLbcB<( zllF)U3xH`G{@EiCzeKv`?r~tw*NzFdSIA3wG6Kw#Jin;*$1>UuHGd4utXS1MM$A=N zu8Wb*oY4QXa7l_WJ`4YwJO?~O4qjk^ux={;vhwpRP$} z>HhBE-rAr%u?5Ez&_)o9DWNjtJ_wi5lH?y`t9E2Icg2WXBRe;_b8_F!@V7IQLKz!R zS&QAGjlfzTaHvPSAQV7hF+v6SuwL$B1PN`Gt`jS+%<2)cz$I2vWG8z zG?gz4bFXrB9DztK%~9PRMpQ!Bw#fWHH6fa{V^voY6!TI>A50E{PTKF^Ig`ko`23&G z^As3S$k)8F-)SI~{vj(}mh=<1cMV6Y05)}2I4|9wTit=fBXFDe7|;#f6(ZeASK-(L z2UlPrLnZ%O{D^IGX5lgV%|?|c(8*!zgFH5e3vK=wO@gzz{W#rx4b1NLz(4Wt*7vrC z#7P1@!vzdl?lgna#S-qZ;alH8z7s*8yAO}Qp8H`r)$V}O!=3iuG&5(I;G{n-g4q1M zRYEm-*FznuQ~P6>golP6hd%lp{9`H{{>nX;OA?#^y(yPOlfBaZr&7ol>9WiM9g2PP zvj1SuJgi43$I3{As#`t;{oYiHJIGsbe6$Ja9-`w{U0u}^e;X*B$ujlf5waZ0oT;8V z(N9KBZj4I|gF3Eq&CjjYX!y-Y_WAbS4*O9=cKCW5*cO0h5E*(SF!Pqan6s(WGvG1S zm{0YeEL0D77E8yV$wOrR@MYPq>s4E|hT0wII1Q!5vl70Y}8UxVqI72Pa;HJV{vK;#Zx znf)`BN}hyQ^G#uH0T(eXEIq-!YyR4pqGqY_@4+IM$%~`&LcWRKR}wvGTSEbAxIu+Q z9W){hVeTqu`~y}w3lJZ_VL+8<)6z#xhz7Z`S?HUB@XSrEL$!nNd8L1Zb+?0WS= zr)f>!{pe!=892IIaRk57y?AzaSnXG?BTOm3B_-i*W;w4j<5P!Cu=Ch?#BSv0;R@9> zd&V+^iI!G>rQxUevxeKLJtyLs)UAtKODT=TMss@$gL9;IqR~3J1NJI`u>|J!yB z|4V_GlKk&ODDi*XJk-wX*0Pk_1l@K$nyB-*ksC+a6yEh3(D{Gy}hwQH>9VY!DA z<$ivswvnR0A9bibOv| zNvoE!y={i9kYRB&R1vDR*}wUGR~b3(?-2V?mV=8cn+JV=Y3)8Ajo0|PU*$}KC)p4q z)UM$OllE)(FEQjV**uV)RFe@peB3t`rM6IS6q}D2HUQGqeAST;nJT5n0BAwL27<|mi8_q7Nvu& z`u-JX)BUkmG^Uw1IY?VVnD719?qv62p{B>uL4sct!=NhX`eYip1*sg-B_%@sWgj2M z&jOSEZ*uc7=eaMOM$(RSahi=lbRi;$kFnA^IhS$mb^v!s#c&(I{#~38JCD z$VPiTK8JHMi+x$myk@2(aLEz zS_fZBs4hklfe$ zg<$bnB_TWnBKg{IF^Gmxf#H%PX#F5|y zr}vDofCc{B9jE3yV^`9Gokhx|{_L@vN(0S62G13dNmoYIF80G)pOluoo`DlgpjVIG zZxEiC+1yUgOBI6sN@W2#zUjKEm&y3@hQxcDP6@NKERq%R&W?z~fIr8g-mFuU%Ia*bq>(%BC z*)n;3p+Xe%Yzc+7Q6*aD1gs&Vuda{oJvSQ!TZ&g8eTJ!5)?|4K?*vMnKPJj9Hv(yP zrb3&0Kfs+{UFn+lifiy0uGKSMuJeDKY<9~z_}PGb8sDdwfr=R?n;xC0+spEM^ zZ~p((w2TJ0mi~W`X8t43@#y?8M>8N{hJM}pqut3wP<0P-8#S(p`8w)ureL8P{LQ$P zg(FeUo%M$Ejol*urz+F5w9OP8~x`G!_vZ=Mg?r@W9_R1cV(a}>eFhc`&Hvrt!$T? zdEXOjm|o4j7B|5i*7)nR&;q4b{ZzV~1aQ1=OA|z9(qdR%)zDoh!P6 z&a(%;8=u=4tvgxwB-R+OjE<+I9R_R@sV5PoF}GzZ70i^$vU%n@6G!Lb4>5U*gF-afqSgSzecz%$#g)lGTkQ*T=jU7^$tykdCQ3cG<1tVwEL8dTi*e8@X4 z3Lo9L1HbL1mXN(9eTXh5Prxfn7AjQVy1LJ3xcU-}8#N*A=}y7n+e-}to+n0y-IiBW zycEi})2ut%sS>R$?^b3d6`QD>O-P>Vnl=o1sX33ziGA#}vmvG!tx&ViEljwGtvvaM3!8 z2P-)NkwXD%v}pUB=Qm&ij4n9>G-D-cue+jQ^fLcrHv6T6D_HN?{>=D1lw&0p83T6+4$=5tU5h=Q|34^u z&!DE)F6FCo$iB$N%-}hSUy4LRsW1k-WxXxTHC?(Cu&Cj>@?% z(RwE^U7_BWu0bZvr6?Go6@~O36pNTvD9IVl2^p%Cu!p}6$}!8#&zRJ1YR%(Vbd9Xm zG{~Ern!&|>GlbgWj7z*(R45I4e2o{wQRwkfAr2aMS#lvd^367R^yQWJb*hZ4!`cn> z%4*Ln%^!koDUEhAw6Ua4u5l;fLDW6r$6d&k)Jt}6I5y%J%%%d^9rb#NhDFE-KcUR; z^mBhZZ4qsnM0B*>&~fh8@L_TC+es13X_W;kJ;SoP&fgJB|DyL!@}9Cq;ftbG>*@JF z1aUkCgo)OYdaCD6%&+@&bRbDn5%Gx-#-rmdue$h{BGkC>GkuGo{;p)P>XNYZ2$Mmw z{5%_nqd~FVtZ0y^w;GlQL)&G(u%(I~EkmjulHn4J(U*Ib4h&W|4JTZOZ9Zo6Y;qT? zWGOn63p}r=Xt$x5v!@7?6NC3(^hb#DGvTUsA5+(2b4Yp_UdDvq=dEVFE|($@nm;eV zrd~J6@F2la=J#auatBIxn!-MvR&LGj8o9mnz~1#dNBmqW*m&{nrUui6!HN-oWGNJ4 zD@sASt8Y{vW^IX0kEEZmvYa}9l?(Lr;AuuY_yf?KhS)_0*p8LJF7BxaUTs}RM_SL+`{PXvjKLj?b%%(3! zAS`j&t3x7<3z(nD2a8mAI?imOmUR4G1g5)7AYh=46rGA84x2QInX%x_m>uWoZ(7$s zPptETc5m#hG>$ERdl_O;&6vzKiYss`>Wb@INJ5`f54pZ%;1~T7Vg-M-vkBwZ= zI$&Dj>^P*{)_Rsj8nbdlb)T!IIcw$Jnq`s_N&iw1++=oavU_9hUYew*n`Bp>onl!w z-9Q&NpTL%OqDOo}yb7>gdEh%y7S(IbPoLZ;6e7{&m0+jR$jPUl*v6t;;UMl_CjhgD z%)c~)d}aX0;z78;SxroI3!%p7w|q56Ynl(AH&~^W2Ri%ikO<`x>f%Z9Kh30Kk<76@ z6_IJlVa_Y`s~kz+w=WkK29}*CbN1eGkM!5+Y_HMJE8Z3l3&<2JuurRPX;>o? zQbzc!y=C$xISZ)dexqxr(^vRH%Q-}~!Kce4<}BD=L07-pL9HfTCD$jQSGT_@p<7Z# zld>v(_7>hOW*|ZK82dWjWp+#S^w$5=sB3Thzf7y%TUS(|4qsRg z#au<-YoX*Rk!_*^dY9CATRP<}OtguwMM>3lO2CuFt2a0@L@cHKgMQJ`g4`EJf|o%g zG|$@*)1S_W+RO!kp$cN3gSCu)D)*YX_$4M0k6h}+Z;AJ4?Pv=Ww(24HJCzQl+5R>s zbLebe%gf@tq}UH%XI3Q*=lwm?63soxCL!MD9ziE?c=_Wuc@9zQ!r!fx=8u717HY|U z7#l!~Q+hdZD5EaDr)1VJ{^7`~>AuBtlbgB%cAq}n7pvSRco7wM7Dm|Y5YbYrnhi~w z$(m9U)8>%N;k&?9&;VLYN1lb?K>=d{g6Q&siXC5r&$VO>etyPU99Ah%tH-(~KbE|A z`dpnQ%SnzAVJPZLyz5rD&6-o2- zl_DN_hxR9_1Ke{<`k>tgZkACvKfkEDNNr8vSsmWy;ZgC}`aR#w8bLF=I_z@venjjWCREGD>fQ9BlP>PV{q?_F?ER*uya zta~X1YO3Pq8YS05vI%8?ewi--3e*MyvHT5yBATR#*5v;AKtTmUl(S5YNqm9 zMOqQ;l(U{?`W3N*5So)%=Mg1W;bf;*nXg-ILRv3+wlwvcRv$BDkVbXRWUHvFd z<5HW&7qMT(Wz8RdN9==bJg?KP)XP>(cFj0upnB_jem)*|Pa(9BRhJDe&-<*KLe6)) z4+0u?`rs%pbkpoweOJXtBaQmoJu5`$*4@r^@Kf4a+EBK~Kbffcw-U0xeUVx_0xCW& z0MIW!6F@R&ypxi~kzL_~VHVk$=x3F`f4LE1b4NEWX!^5k!!i0a8Ny)rLAr=UZ$mZB2qtmULTJ2D>5n$E>IOrOi~E2Q{}3sN{jM<799cZ=jAM5 zFn+5WmxmxDMQCJ03cVA$E4{ndX_{S%M1yBtl-TTtS);{l4r%n?1|@9XBe~f9FDF17 z%{c7+YOovr=Z~ckhXS~;3T=Wz@#>BmIH@t0A|r$hzI?rOk2387h;f}qM!#GK?WZ83 z)q34VJc|62jjgiw4%Hp0q92I)RxW&`k*TC-i&qb@=|4APXxZEHRvBEGjn~T1uAOw* zsGer0N%JjZT-B^Y$avUm8U+uUr|-*BIaHS7OTp0+}l?5OR^7TsyL zzFRl+e~m9tJ0ReJVj64{&7+I!M;GX(cX>AD^h3($jGqdqGY#vSmfCQaGpBqMB6VU^ zmb~Qn`(doW}7jvF2$=_8=gBe?8 zT&mo;MjApP(~}xIiyj_1Dp`m3-$ybAWmx7Z=daB~t1bY-BG!L=G++=`Z4e?yezf5?~V~X5b%vx1HJjXO~V@yQCHVZ;1AlZz<27>wiob0 zgtqneKr;ZYuGD?t|L*ALnf;mO|5x*LbCGdz9;u|lOu7}(4~U(4dTLHAvVYgF3q5E0 zaWu3&MoLX5ksrU~0c*QlH9jm_ht&dm?>|-_o{$mksm*MTL*FCP>zdH`(p{@#_P4?i z0X#BEGo9GhEcijepwhlPMr|G6ZUgQkvjMPuWaFD^^C!!hQ)d4a%GYzK~aa zW-qUQeM~!bHG4L)trbdmn_7~m7!s%IytypDu#2jn8L2Cs?@YCl^f!v{T{n*K+%j3J zOsd;7mUf)jQ*wu@Uy|c{s-f06k(EckuJj7ML49WQ(+4MZ2ab=Ak!{hc$~1L>d~;3EsMx zi{QuL^~ot{aG#k>1c(CHY=|CtL*Wyz$VFf7pd?;adjF^ggXQ`gH~U zo|jey;9{@=LKxy-6;oR^)W<&^^jy02k3TtLtSlhB&(Msw@7>;bU@b}7tif9%lk-HLwP9H z2?HipX-@oKDqx7a$AWhXRy(x4YmJi|ZpgmQ{e4sFK&yd8o~RAR(_s*OJ9$g*sU~@y zMk}AM*Yc!GV%l+#hR|-p)G21JSi9(SsgByxphUM|2+WoL9iEud(!BU`*OC8c4e+lJ z94H;>hmyOXloV))r(3u9f}!lxCf5*du7##p0&?Cx;Y;0xuV+SAthhYSNkd}itnAr}glrX6Lx_O9iOteVRv%sg;I#k8;s}KECTz~w2(6AQwE6(`6 z51;v`-s!F}foz?-dagq&@k#Yj6B~9K6ncjurv^2tbo)cJ5!o6o&K?$@^ADLH8tl;= zz@H_@s+BR9$5w6ujw1mXnnU&`2c z4)B4(YYuzb=T^Hf%z`j#-NZVR?tAWab(qkoLq8`pA9cV~!*T=6r%tj%+VD3#01Zbe zpu>7sn5w4|`tY>xTccFcTNNd22KHK+LUs0^KWSqXLdbOAIY)pTRO*Mc;q7;!NI&pF zvx8^9gQ}OA8_(@n8q6?kk37;g zv`?`YvnhFdqsG!)n0hjB9ex3wdJcVgE`d6B zI~KCB3tQvgw}4>MUz^ha{@Vjl$gQ1=wtNvX0@VSV4_){*)yb2~iLkdf&OZ^v%gLY4 zq#&lppVT`@OQ75tb#=qkLj}S~3cH#L*9Zu15EB>#&@v~#r?N06PlD>kd&OTbb4>4l z$4i!%tHtxb=P}vnv2d9WQPC+~=Du5Nb$yZSSJ!r@E!=O!X{H~J9|2V<1p;1kWn-M5 zTH4Ip&is~^$ES>`N=iv+i37^#8n^+r3vGMe_3-?OeABqXMUfm}FzP~&4@k8C|DU%u zeblh;$x3f#n4!D0#cS+@$~vGWRiaSQ%BH3(i`Rc?t_28@K+fr5bm-iBFd#(Ur8qjx z&AJ2lOwVX`{`HyeWNZEFGkx=K%yz+FSBC!{zH&O~Bz?)ViC;X<1|+5E#rA(CCAU8W z6|;w2 zuO+M!xHEsi<(N!Aj=wbhC2AZ^G+~@_{9tsR`b{!Hz+ScTjCjTWn_8K$U#Q9urh6<_4$_ zw?k(E*Hj-Ss(xH{=&ez1Dp zSXfnq^5P^BtMh6do)_Q{cWkV>iO)Fyn41?LfiTVPu*=w6DFOoOk~J`?E&Q$wqXQz6 zS!||jWd_W>GP5EO=`5@3ufo~DmQ|bc*X*EEpP7J4s${|&6z@YLo1#w>@V>Dq_3LpX z1@@MWMzuWg$X>OqmZXd(1=urMWjychDg-c*y=`bmm_l7~lWTP`E2HYfZx}|i2m|&P zmN)7s6i6OFigDd+g9qNhKYE@*d-vaac-z9_-+P!o?1=eJMJm*fsr@c^t-y?Owypp7 zw)uk^$(jMG44;HW{IRsZcM#$D=ZgGODj1b&wVe)kUxu0xJbA~j574a^ns9^DE+THX z{}2dLWsBq48aa=*g40hWagZ~2`?srCO+`-uPf6La(jNl$_~&Vn-rwzNic+lX#YUc9 z)~hWk!r*xnh4mquVX7fsecc~~;LY}}!C~jVlm7!M6gl>tXLmupBKV{v&jEsBlvNfo zT@bp<@VlY=enH?JnTl7|Z3-AKU{G=&0L#nxuE?RITheB`{OwH_W@1U{8K3hh9X=kr zsvafsud7G@xFq}!fHTE9?{$616=S(~kY1>yjIf2J?DTTfAW4e@qi{3f6!onSGH&Jy z-SZ=_m<__5u{FgD!ui{miHc; z^9zG6a3yH}<|=gn$vkdeMr$3&Fi1NcKGVt%fng;qgM4(O?g2|U83&Jeo&qK|-Nx(4 zHg=<>ZrTvQnFXdV#f|_y&Z7U1MOe$GeC#DM?M&E-cEB08+aTo=5zCh0f8jP>;NT{& zF74>Yc2*_R(k?SxVqv$=83ak?JQ$T0^;^&oYj>!N1#)QqmkYfjjaQBVKe3nGChuamNKVipj3k~P` ztH%59eR7T{;xmyGrvP7u1CZVVR>F$ww;Ki}p(UV8xAZ>*%C66#1dR#ifD9E2h0NUg zb)M#wo^M=YbLK6e&?tPW(du3C7Pp8w?gHOyxwFEC$;!EowE^0VZG9{2BcJ}~aWQXV zEzVp99=Vx6#Q7lsxt(Gjj)cdE9^Stao_Yq=#JpRdvlXL#@N{x`cle{o{Ee>j@S{NC zxcF~DX6I-JEP(iSL*8k70)0L64O0;<{;X2*xj+A_*Iv)==L@`10ZTCIp4@J8J8e<_ zV)67H7t&3&=yf#r>%fAigL)=hFNC!08VZXz^2GD-)ErQ}O1eRbqW1?fag@ofs)k*k zfOZCOMynnBMid;DbKRQ6L-A~|PUYIKxfu79b_)E1qBq~hvxj}dKHv9BYHx1zauv8i zr|o=tvK83ElY2$}tMrNsF(NjrIk8Sxf4`4L8luCs3mCn8stiv>YyTcZ#p{$kj$-IL zhwkmPAC^pBZ{V#cn$3wbT*yASTZR@;s|L$4xZn)Z_qgP$k`|AQKnBUbPta8!`AfS) z>lyU{YPpsRJemf8*xqZt=+$G!g3AU>X=^|MjDo&#L7WFV_=a39I_m$9XOWl^O120k zCi|#+m3uD>Sev;nV!i$*>IhglRbV7nFVH{qrbOoRR!JA@#9Gv2Q|}%Q(3>g0)%>)w zytn#;xEI0z>rz3;x|yLXB1PYbMhhEEJbHKz5gd}|*d!1btYCYf8~0_&mtx-(z16cK zjN4m}jq=?JJ!ldBzMD+BBc-3@nFrzc^oD7v>FwM1L^t*tkRkV0vuz~Fb<{XB?cKi> z6)H@Y0v}8l+A{8tHs)i-%@eUYRW&%B?o6PvVxxp^wBo_6gv2?ONzIqcnd)b!t zU$=0cx&p8ezo0t=EW}$U`Y+}ku!6@XqW{k4E-?LTNOU_hSV5*5`wM3Tf7ot)_yET( z?ZcOs{BvoiJcwh(7VP%`m|xnKcP@pBnqxU}ofI*!_pzk7wA)$hn+~wbUC+ywf#1zx zXWGi(l?4!UQorwM^WW=^VQ^($53D*CrH3&-Ec;QtKtxV)5;>CuKYx3M8x z9An7*Lyhr^U)G&r_Q6TEKCTy8C*)>=?C2V6Cb90A z{K0aiIg3B#lfM~n*PwV6-@7Ln_(#(5Q8MbBYS`a==!MWsqUGz!`2Mzq-IaIRr(R1 zcGMmc@&HN&?BcyCwe!+ZDpp|%R$kV{zK!aT*y3dU!m}l-iRHt&*<4Dt zmECe-69B$X$5^8`pEGkQ4{4>VqjLf4sf;CY6pKR%?|?RyR!m3dZ{o{yr*?O^_)3-?SR8&nA+F`5mlE(XRZTb2)m`KLQ$EHAu(I<-ub1QV~ zRSR2u7jgekR@lZpimRH=3hnDisKq)c8dOyg=rN)QjA+82rSU8lX^sU{4q^%|moq61 z+f5S8{^Q2OATz9eIG)rQ7ISqyNPK^nUCObyX7yQlZQbtJ@X7m>x7AX*m~wKVMBT)M zjWl(R){TmRWgpNZTsNMC2RZgBfEYk%N6OLdrh#HP>W$SO_*olA3vD9sy4>@UeO|W! z>Zc={4eNZn6@30ebDkf;|06oQA`a}p zPwpMLc8F5?$bj3sdN39 zSd%6(EjZ&b=U{=TlVQEbCdy-YBKlOiA%*&LH-c(goO(DhH)-kJncbUnp80vP3+Am3 z(4vkRE)K)7im2#0ytjx`>oLk}9&&JV0H?k$DZW?Zl2JF?VcA{(LPCOg5^TE~{R2M? zCK5#%B4*Vp-QM+jJ#(Y1qg%b+;wG+;TyHbOnL3u^7glRl1Fux_aF93Xf{*}~+*vNa z!k#B-o9oZh^>kTusr5&d9|=gXk)U9XMK-u@Ob();Qvy5M6oSSOhu_(AaUl03j7i6c z56#!PQ=ig@k*~35A-0c-U0!385VYQtuU!-49S28WM?lM(RaJagSRP9B_VbkKq>dcB zYA5KsxvFqXC!sh_tC|dsrD1c7h_bB?&G{guDG!j)%qkFuohJ8b*fydOnU}KCjDL`E>08D9IGWh zEwKm^1%Kwhx9~@&1LnaXw2m-YX8+uN0I#h)G+$bOR=bu?TgjC*Dh}Ra!`e`u1#Dp3 z4^=i=t|sY);fhQLS86uEjdYs;psLTJvc$g}_Ehi2MdUgts0*T+7a*I+BrW8G$K(=Dus_InG)_EJk1##B=tYN=Bacg}CWX00In zs29F`^y&2UZ=rP#Td)OIEEuD()$0fQyh4gGjSXvgJ+nTD@_0J5GwV$LKvFfZGm$|2 z?LimPj-Ds5(pyGON~d>F(CNYJ#1s)r=@PNh3pcj?{RMyGo(8DGhi8`Zl6+Phbj_+- zGdt4db&jT{98DP%oj^QSJJ$NT7%GnNH|{mS3!@KXP<%w0F2yGFK3XH)~u#hhw2Um)DN}HO(3~P)TsgEE4zo4x&_ALGUW5B7m zI6&B6_uuM<%qJgr`}#pJHZkSje?3DBon^VbGtfFnPq|Kba@OnJA{|r_F}!Vop4iAJ zU{rH5g^UDblo+40#JGg#g>~wcy>U}eSoWHPWUUH!fi1^q@#9AD4r4L2dVf%V2=7+% zVE5~pM{yO92jV;pPf~tr9mS@6{K|$D-CckK@T=!I1f%{mUdpaXW`ukdm$1G2NvC}L z$+;u$w88~Pi5>;bFCsjH5SK+34*pLDrL7wE=9wI$+WhB-#13+6-T#xLtCiu>oor!L zXC9Vwr%|Q%l1^3KbiQ7c*X&?`XFryL4-vw|E@jv>%{Ha&u%N=TsM}~X{-J#S*d_$F zmf?t@RkFbp^ui<3j=9!}rrL%-wHk38-@%?Yd6lq`0j-$H6+^6{gF`IEu2kX-s!1(! zMBB9@cqPKaT3uUP+-xq(Wt-ImZR)a`z|DqqKh|J~T+tiK#y4$ce~!xI_H2 zZTo4?uUOIzt^#h#1oM$Y*p7jm3h)bq0!Ga#+DP#ID}3e@IDYx6wx~Dh{x4Pr$VLjq z>(;^&qmi!h-?rEu@NDzXpR%I)_Yc=1OT2%lNskb9seIE+Q(*#t4d%O2H_Tjs`IBIS zIuDi-(;GcmIK?JL?B~(U`nrxi4Ch&)a-F8;?Y0IEbP`pWQGSoU4oi@Bt{ZgB>9M); zJE?dn(DzPIhDR}W83 zzV)G2|AoFa{vnv%OS8JKgt>XEp+SXrV)^VPDOr`mqwQhvmu&^{zX$8?Ttt8)*x%F? zC0S~)r)mzlw;}<=iZ#ld$Y1N2f1lK90&0JqEkd6gI{>2_ap9o2=#5tyrQIdi`qAqz zauMlmX6s&P0R14=%?0e;&nd%F%Am+g?uB!3?G}n6Z=q}EOvqkJZ;36+|7*)bVez)R zOkNeae{T?t`;N9oGBq~~6wUn^Ag6M$P}ZT8LeETvGu<>f;0=LUE~3PHu&WQ-XwAjK zFsvGmN8HCWEv-h95A%)lHR;7&u}bR00OSRh3LJsf+0 zkD^dPRYHQ6wka!5tyfL*#jbyx-}eQm@wj!QcK!S6_qO<Q?{(ZQR>cUt{ z+z#6G@QMO`aop8(7PR2Q(6^<>!Bxr{7fD6zyh4?wOg6wt_-%Jp=Q;;Z_&N9Jiq(y8AX5LD@46-c~WUNME`_;YA zY>n+J&*{VINWTnwbMw@54IO9HJ@m1%Lq1h6IjXQ@EGZm(J(0`MJfq4zI=a0zEa>AT zq-8iOBWt)a3ym3_RW<5TnYT^%wX=rmT*@x(!K-ch!BpPe+7pK@YT0(a(OY4nrtkWe z2J6m<6gZq)?&l@G&9IV_`cg10qxOBLy?(40Ot#ZR6TQwQL-B2hceA?mt4wHSt{#gC zWB&@fL5#mA!ZiR;4Fk;#E5h2X)JQW`X{8DxYe`4U6g9{MTe| zTcV9KaS0!Mt6v+M8L#-xoQyQgLRw3a`AdMiv16%{AJ+_WbXnVgnU zY>gGw6Bpub#ammeeISA>L!6r*V(e4>%Hv577&-3ZpXv$d^PcNsUMUU=*_t45ccRSi zFJhsOlFY`i)8itGFy^a!XtQjm3-PXI&*a7ZDzdoid^Wvc4PUGHR?Wvt7ioJiTj{vM ze}l>8?k?1}z~9$bwolQl(m$fJVaF`WDN6wL(n{+k65M%6fuC5RNl=;E=M`1w`YPQV zdm43vaL8g%Vt{e#w^dAV#73`+!PM?XL+PsrdO&D5*gDZTQ%O6eR!w0vhi>3Qg`d&p zi4dstCH;%2be9YZ7SDx^zz_|^vkfP8+2u07IUF2YjXn&$Vl2XOAUm7PQgU%e%&se| z>i8k~8&g_%ebdS{A*SMZ`94%m=%Z`OOBbm3bQ`_5n>x;NEt!@@41**CzdD+OO!9t3 z#oHV-XuoLO3H@-Dl$sYXWDZ20R*>zPNmT!6RM&j@sa$TpaOwKHGOCq3^s zfzwO*=XAqny#0n8@lHD+t#)4XcVE0{J#qf#u=&sR>GkA|%~wP!fHjglK##z)eDyy{ zVDx5eA^ul@5PBKjqkxOH{Jvyv%!`F*M^gJy1xF8%R$E06eTt{Mnp@6t*rAvwMwY^B zfcHLadlc%Rki&I)#|Adv#3`0pMNfMW~Nqu0vzKg!mn`Wcko%y|8-{Akc|GED*(Duu$`L6@9xAsvQCfUqu&yE!!D=qQVTP0PIusJI_7$*?W)eXqWZoe@NZu zDZEaWV;MlxuJH%E`@en0Z<*IsJ}g$2TiX0P>he5lRovBKUjXoCEQ#tDm?#)_!a_5A z0QoLK1LSgC+wPyK6Q-)W1TS5E2D>wKC|$8%k$wpo{dWsc-09yfz%hKg$>gIz042iS z+ob}aM4IRf9RZYxqQzC%3$FJ6E%gw0yd49=rc7I7K>NoSQuVj2M^IVVrdn+B7R^C` zra4S?6a2PyCl)tMA%p1P5uEh zc!19zZrQ8O@6-AUUvW|#%Px4c;$VbJ#<~B(O!7k%0hr0@d(g1^P56Hl4*z4GS)0to z<6rW?>g9uV1RJn=xqR=L7_fSoBY=OIP2C&t%besH&=EmG(pEoth{k~AWYH^0gJoTA zRB;!m4^D)Y7QfO^wSO(+GygtQ-tJuAvvBBs7?$#EZBpIcZdsT~ktNetJ4eqi|oTa^HW)H>AD{S9DX%Q&k10piFy3H{5uq~{@krC9>7G^Zm%|0S8GW9i!#v4^~X zHhbK>@4W>+o&{1#HBPSoJ`S#km;3lo3*b(PB?;|EE6(SE0PfW1vE!5MQyO&3ubtQB zxH-pA9RU3E;|mZfXyh?HCDr?V4j{<+Q(T`~!CF>_3C~J|d(EWB@ejR0I&B!<9#8ZR z_R!5kBn)J)NB^u1-<{1$?Y=XZJN2l1u}aNz<%*xRzx zTCIZl>Yvn7kv;D=yKL)@_-zVAhXixbeP6EfejuSfwPtKSc5NofqF@9fRsf+$hxtmV z&8HK+2q^gI`>|NsATFS%jjj#Xi4oStog*WCc#+ddHGrG3(<78YFCzK%`M$}6>>t9Z z6i?*M)&HI)>mN(08)F(8BQL*4JMyNYR)1!r-Ecy^zd9jdA9|p9*OEs~thgqABOk5| z6E9t9M{JmmJ-hw^wvEN7b|o zdH#o>*Bk`1H4jN6>kpSvEAfW(GEl=)_$t54zf0bfey8;HQL3&m^{v33%z_L7qPF1c zD&VDWj$If-*c;*?TJ@72(JWYA1NC-SXi8(GvmV<`mr#oa!Wv|t1X$W3ixzi!scajG z-aYQPFb~p4(k%2fvmdE5z5YW$ubi07*ue@CL(L6dBTkm+HMx^-l2?6SmBy}2_owPi zETzmkK@cm@#U0D;brs|cpK5xElivPy=Ke<6d09RdcfAN51=fBTix$08usZ0J7#X?h zS8eodlP#LLW7S)M#0xi7u9wc^vd+1T%TgZ)hg`L$poUm3)bJchApcH{&5|i%7Lt-)f)I0IhoZYLW8+vl-@N@{nl}wim7VU3a`sf>EMpy*vR067RTJOHiF+|FzD+|mM2_gh@UXJk` z&`@PX^Ke-)|M*F}k_yQVm^81M&RJG3@issJxYO-<5j2E9Poty3+T^k%`?OzmcTDI? zk&{f5%|N7QR3IeJ|@#BW5;CMj`)77_*rcHRSOdu^V?NxheFEon)5oem13+!!tIK6>`*p;|{;ehK!F z+J1!-7rqXE##X(TGCICMIUZ#%zW@%Q|4L~#@crsOnj-j$9ypIJD`e<_+AmxC=JQ{^ zR-`uvF9!Pi^Mp}mT7k7<%wv*X8HY65vlTV)RYv8FarIYaXq($4?&KtIwi_k$lVpc! zw~H{kY5Oy(B`KON8Mhm!u8?2n1u!nnGggq{CcD!nmgUaN9#1{F)M>;&es~|bbf18F zx!aO?kgt__q$Nci^nhpcA?Qr_+IO=BVg@u1&?}a<2nbGDhVpwiS?9BadHQDxb-s@U zs)Aw8e#s&gqWPu?ump1V0qh__7-STPBD3q7 zj?LAb#VZ44E#c1AlyTSb%e)uONQ*jpO#su;_42CKVbdJP0}8hM1o;^M+p^o z=?s;|?Oi^_1u0FQruSjkCXF=T7p%;w-}}XF(l^3_$`=k^@q!HWPqak_;gqDhY`kS& z6-w&pJ<0eswVq%nw!{>#B5Uj^6YymHUOi>6f8dFKdD=v(?E)~~KLn!cc-{3wU_((=E)4iax)rZnugiFICfh(bj@b@hvWcpp zavc2Hedl^RyT9Q3&%6D@-wV)ZR}a&b90U50>tW%dhv5qo8C|m}{NyQbr9zJM!U<)G zP-Pu+#MCFte|xeEYn#H9Y8)6hjw|wk31x-mS<3krIh2h~lpxi+o%bThkXUc?1<@^i z1NhQg|v-?oFjhpsLLxPzUJFwI^EE$s)e(~Hf&JMT`${!7}4FVfaY0Jcz;Ta9ILeS)fj z`pWMA)y#O?pr+BBCcwy?IafT?vKB(?O`&CKph?SLwW`x6-V@z1un-ncWN_=FtL&tf z66T*0py(;J>#61fLgQNiAmaXV(X7GiJ(@_%cWvq?;IrvC{4q>`Vx{6G*9gzX+)qnq z>}F6?ThWen+Ww^7xp0a=$3&mSMrav&zHvPv7kxCIpVk<4cl3fJxKV>kmiu?#KRrt_c+23j%RQ3rzO25cZ3 zhhHq?CLZ}YQheGu<^AhOe*^vr7>bgXVDXrO7?0RhTkySXIr{N(lg+12;TC+1+1w28 z$8taW&ThXkzklsiG0RLhksTOSTv%?M`Nl}VaiDG$%$uUzdtUupa31_4Z2CI4z~I5O zIH%RLsE_I(7h9uGtFh7>%ocJJe#vHsCqu6WpMY`7Ep|n3^0H#{w|F_j3I#7}dh=Q=z;%mx2|hsY(6~N*2HUwS?)T&>VZp zM>>W`>?jVl4kNsRqG$VfA9fp%6(j!2~TduYNkH$|%v}ah@9GZ30B>S(0mMG+M-vZm`udj>$5WGW4V?Ut1!euPc z6($&^z*9A8gO;pC^;Wm{GTe9F<5UKj9_ap#5v=h5S^nL5(FlubvN8(mXs5#kpnXyn z>cagTCk)%=@g`ujrfd(JO*T?SHMa$vSZcBk< zx4*N{vbv<4Z&qS5-tDz8t}Vdv<$@#B3_cg!S!_s zI)Hdc`V;KVb(pYY&H{c*5!zmJ76nE;Nl|m~m(P&hKm~8!p8AQWA>81dYhY|usZhoF zpjW$LWHMxq2y>zx&x>dJ|NMw}d~Ed7CDn>E+49rS1LK=*i=P`NZ$x((gwSe@Hib2^ zHFCMuT+e#>87I?3Inn@W37Xx8En?h>#ZRA3Y@Q`RrzI22j;iX;lB-(cD=qs2XeX`| z5b3c*yB8jHW#4zdoRcwkIYm(Iv&nv5EAjYA{3zo5BRHacEvb!74^ofoUyCUNzZN(5 zc2YdWpTOcXfFtb>U~Eu-b4%%2jjz@IXbS34gZLM${_{(q;W@hh;XOJg7P|Y&1DEr? zP<<7+3=n0Un=`xDk;iIH*`&N2a{n&2ya~1!>wxWv?*;gn@ zcW@-05U^2&PF!>wPS)-b#g4?N&&<+HaFJ17-6aMKND@=8wWHMvfS(ClQ!H7#R#=g4 z50iV`JQ@E)kj<(w&NQrABr*p6xRiqWiU*@~_3*gotW6Bf8@<_z4n6w4;$TKCM3b&c zcV7OD7^izlB_4g_5XqZq)(KF)O5h%Fw&& zqRD>5hFO9ha_sI4?gOp(rbL#MSP`1?rTVi{|457MB*LG$L~*wxH`!!Mkc{|&!@Uk5Z+ zWV8UL$6HhA(1dcac0{YC5zeOkY6McaZNMSHI|L)_hc_?&wgO5LUZ9S&1I_m=juq`l zdG%?M^b8+-_*^|Tt)ys+ITn-bcq6>Dl?Leg21i#;jT*deu(76@0)7RaCRbqHV zTuEQrdsE0?{|Mm1?HR_OmskzuThTnY&{ zR`%k_0>$|V}RJAOR z=68|G0*T51mqf`jkCFItR=$5BEu=yi7ruf#8WjUPkQCm0?+<~W zlY)S1zI%<(lwGZ@xq;DkiyWky$M)1nrkGgR`Z|e|#=~(az=!aljLQps*b80%ur!lz*qr~UzMF3jVH zzx!MpnC1NUThrQt{vOT!_X#G#g~=jHcLl^3GEeHvV16!WBaH9mTU?2F_~|cKD?R5uHPK{*%FYeH|692MeZ#|BV?VQd@tqUbEQmJ zo=7y-=f%)Q%L6{;^DjI^9jwm%tne8DJPlHqkE#2G$9hSBnsan|i+$eHKJD#8dg=Mx z-?OP`J?}lTz)>Dmk@P$sMU5T5UyhRO(?%-BN>-_tT>qg7{HK|~U~5MPSa zv#y`9Umpl>S^}|MSN5adW7os=fzgKHWVp4?(K5exCop1aHaJGAOADX&9F%_&rNR6& zX{W>YbILJI3!ttxMExNEtAhTv8t@+u=AvCZ-$VejxBadrrP-VL(x+Bgo4a}uk{!F3 zUq2GNT`#yq<+0P1)c;CVQE*dx=cuGnkG6(O-yu6~#XQ-ZD~v0rZ+J&_O5AkP>q8C< z4Q@^0z{pGuN29$iBd9oS|A>24nu9kL62z_aylRsmwuKmS>{Ah zWS3un7QGN37Q(Q;SBmI*YycR!Q%hy=hoBq^RGl47p5+Eu$aNN!6ceMP|JWz6JQaj3T_GTAp5{8HKFNYD9=u-4-YR>j$6yx6{9fOA;uox(Z|`&zl=k7ilx zQVf-OH`sK?BnJE_Ii5F9nzYBx%&IJ0nj5nuK~Py<`y=+5b)zC-o(Y&T|K zbGcmc4*~WLVEHY~344uZiFL0htGcW7HC`INCT(archalf3e5NHp!5?t@%Y0|u`)>X z`29myhEcX3Zvy9Y@Cz`ssU$MN8hYbs zfRsCcNZ@TeWK#Zc;y&we!tfb5KR%Ph?mg7eGK!p%V~_aWH}7M}CCqF$`^8dscLME0 z1^kHLXwU9H+e-{%%Fb5xTlhn0p2O@(;cF)e+ruM)-A#i7ClVhD8%_7CfWMA#@j|sF zCxg?EK+)CjpRDd5?|+wbVgMgSvoG|>n&J{@ zNq*9L80q4IdHK z7R&izj_dKK7YDWZo6?H4sgDoWCqJ9kkdyN(9UoVa&M^Pso1WUY5NgV0$ZS0L`I{wB zprF+MJUt^O!YDBWu$O{dnzFax9l9~A5`CwM*VdzF>#McdH?gtT!aBg=FRNLya=g3x{kxa`bf9e$=e&x{^`kyOY8~*BltZ`y;)L58 zS4gmIU0X}P;nABmzv=d&NKe7^f%k;#Lw3HD3-J1!+ZmklJ$F6lgHMFu9;P#rm=6EE z2A|tZw5_bm3@Vs0rOV=Xxn*n?#u3<7fce)s&Z;FJ3e5${Ql>;uUqBC zIzZ^#wVC;)YOUZ&x^6EG(cteT6!ovy^KxVZS5geVRJCE<`xyY$UANWI@#sYllwtQ9 zw(&>t%-^)ZbgW69hw*940tJ3%1!A4+a|_c``C2B=PG2Cuo8KjfcPnzoK*4mn1((e-NXq;&L;V_$#OH`s{-K~ zi%wV9z5O-rB~08~jER>DbV?bedAR<`E$VHKK%0$0Ll6z;faZ>Vtoft^Z_z*<%*g63 z;!RMK9~NAa#k4K zen*5Io5BwI3+Ejet1Yzq&}gzjOHZy$SglzP2a^=F zfU&JQPpW?!=W6zV2yQiI!9@FPk2$w@yk+HFEFA0TsSVrz!1Hi>vX(>4V?1FAXPoVgXdK=ItVE%3)VMTWcOR zvh}KJ^ewnte93rwks|7ysA^!X6KIsGCqvp(NjxecyRk?CH( zd_?JQ%wOfJ=5(dL_wzEVDbamT{;!eE3O2yI{# zbVDki{HmdKFLw@O>vXMG=hA^O+#oX#tpV3rz96ux9Exubyh*w{&&7kqa0RAgwaUVN zKhj3@-4KM_J5HBUH{?wott|&u@MfDV|7Qhnc61hj``5skgul8%9@!`Gy>QH&p7e66 z^GiRtug3U1tkm?@|NZfLq4O`EkcMx#ZBLBhG||LZl5VcIwpx_TM{>cF;nX)jcAkU8 z+=kA@W(DI*xLjVYZmFE8Y(TClU$2bIHSKU(bfSLh9(`@B^Beb!erI@L#>t7c{+T4B zb}FM9r2XmaSo%`{E!eAa0?-2BeLARJ!RV2*-D&&AyoiCnF;aF58#`FvF7cQ}Hb$@d z{z{pbAmaOTsHFIZsI&r{H$v-fQ{SxuLglI|CP8dRW#GFZWL9^(FS+MC{(i_xG08pB zV1{+TqS$fgq{uwx;LUKRywdksbB9*HRS{S z{>-2eAY&fu!n}e)(o6*~IfmW;qH-yGEbsgx+P;r~j&N6^8DY2zlV6GZI!^CEne|L0 zSTGO|V^EeuM(vLxHTuRMiFLvF3ds!L6P~Ck?n1@M%6qojwuHxp^aV6Opxw`l0UVUX+@pRyJQ3N{DGIyNCB?6d21H-2|@eI86Ft@V6h(#t}2%qYP zoRr8-M4}8{Q~xm20hXwXI<4VJ{ct9{&IvzQM96C)CC)xuIi>rO!%29sjy@dLjDYGMf?}Ym);xCr6z)C?F2-lQUOA1W@BQ!uU36qj&-mg!mAMQC;3lH9n8bIb)Di*^t$;;gnZ5g}~ zX&q;!-UsJ8j29wHTwmS=TC#Sxih8>ypz!mf%A$MR;N8F#P$v9`YP;IPU?wvjxof=F zwNw0uiWAxN6mxY=jDFheIYB*y_f_$vou`BINVl)>lS!+$`$xvB1N8!nI_-VT7Kq;z zMp8%KDGz})==AQqcha-rB9F)8{25kvOryJ0chRh9L4 zOu+XwnNLLyxUC(*L$IT*F#ulinowA;{sdupl73WTKd{@n{`dPOj-$BNNaW$Gqqh7 z*Xzl+ID2A4jbl-5YEmc|+INAZfUWhXn5FDLrOh)E9jR8M9T24*MdJaZ{&A{0 zmqvg3bjG}4%CLE2eQIAVR;)1kY3dn^p*Pri=`RLY3Ng#hTsXD39HjB+N`(+#c^02- zewb%f@?xs3v9O2#FTI46z-1rt{1=*pXWOy9cGE?kNCparx6@o7c3P&ZDbcgC(vxt; zfw}SaiQ;L`aHxPnD6dVGgTt*6u^Y!n^(kw}odO>6Fy(P{1LW=|U?8T|!_XvfV%3C@ zCbYlf3zw3ICdX-9sXn0kgo~PMlx8>;nw_v}IvlA*1=l0zAtCZFMQTO-5nWqu<`VcF z#(=u9@~?*r7@H!kq(z&J`7*YePTYxIZ)(b3QX_4nT*gGs7c0sB=Y;|GBC1o>OlCj<^hrdg(eh_Y9S!4Aoi^3Y(ug>SLiEp8i3xq#Jsb5--dHED`^>Sk}#Ok zS(A0yewtk^e>bUm*``+M#{H7dTLE16fB45IhU#lG49@7*?hfCbnje@ax#Uc&Be+U} z0Ee+qOSAh|MGYARsibljsm|<1RXA=8aB=rL{V?mrq)?6bwa--ywli1XVfO7?wiQOMZb2YDtiCdn~OxJDqoztXf7>Y)j;tYI-aq-s?n+um#M*&L{B`HIK*^z0caEV~IH}(mm z!*^(oPU4fLvCMqbiZ3HXH~Qt2bO6e}Vs!R~D84vqe1uF%>+^M@b_sGGh{vA-g*JuA8hxTuo&PKmbkHj;$8iV(D za3UtmMPIz`mRaGvSLyt$hR72~aYTj^a5+OOI26TE5waLq;kUEpfA#?aW_DkaR^ntV zglRhF*m_h8=w28IJv&W1<6VZ7K4s6k#XMH*h+!^r_}*ObZZJBLlM~4#=F7TufPXYQ z@6{AdV|Q$y>AdF2nEex>b@XIfv=rIEqi|+YnrN&;r2A0BgImbjTAUqk9sr2wxOG?c z9wDC9J0P4-g*@2i!zywyVe!Il^xdP3<(;tF?YOxek|3s}0IvDut*D0s&9tJde=b#} zeQtiK<>d0CZeGW+nTID>>3Y7Rb?|lM-1qd$)p+Rzh)Tv7Kxu4NDS+;tJ2xpM)y^3! z!4P!IEv_r)(EIpg!3YbXqYNr@`Eytdygd+8p3s@$2no<|65QZX(myWV5C#W9=-?uF zTg|v;AgFpf;d__l9-o$XahZgU^wjd_lRNwkxh|FT_s=(^l4~=z#5}f+e0<~z8@6`3 zs=y71;4k9rE%kbbi(6?rFh6C#JvUck#Xjb=)+}$pUX;R`U^(#3F!Cso86=i}_=$m> z)Bp#n%moR2Jm99OHy<6EtjIVGtP2=CHq8xe1y-xy)&2+>TZLM(_@5o^m;9F@in;I9 zfMmuHq0H%>qCJ$^iVC^6zP0^;BeB&Q;NEa&D1>aQ!ky@CU=rPH3#&h@_`2&_*ZKCs zVJrUpE+4$>nV%|p!E}VgUQ?d&!$|7-#iZbQ5eY^gtZZWcbd!Lez6V_$;%k)pOo6Ez zAmy?1FgCE#ejOMLNO>}Ofa@CvQ3kGEX+;e`0u#}pxD->nCyfd|jI(3C3JCp;Z@+Ef z^fHJ{xK14Nzv6#Rk#PFpJq|acyMb=>#?MBwXe)idI3@ewe`r8U0o1Gr`BCctc6>zT9h*QcxSU#EKP zMiCATKdlkN{a?>`?9Uz!uTwUWH+81bNz$L+kh2@-GLk(C_mPBKB&94s17yzB?RgwO zc86b`AhbK?_j6YBSfcHC3w#mIR|rT`__f5O2F$v0uSYxx$qETqv|hY4l#EA__}iNu z9_`JGefLB!ss%{G3^Jj0Dp?VCkP_W-cdbVb)q1U5{)cc$&YeftH}5k^i@t6%@H(5Bb_h5)gj%PB;D|{A&C|HL{sZ8eHp!gd(rHBi~zar@W}glnj)6 z-ytSde^S5l)#}~iaOlnRoF$4jHQ*png%=ha?)#&Xa+&ZZsBGcFh2&A|Pddn`ucBdD z?2uTo;#2re&&eMNc=-{m(xk(RqS3Pq@y196>9%?zaFaPX(U%hChF)7_l z8Lj0Hm=kmRSzGlnD$bU0rlQMmV1BTqJzk#!DvxaPh0E?{236SBz$teJvKZHI-72!F(W_jWH+sBlim(| z(Wa*kgZku;a2J2~Fc0dUcVpO;M;^4V^pVlN`>63u*$~P(6926Jd#fM`hA|&WSrOOo z6N*oe*ecUKKo3twpYnoAE=5#$#6Gb!DBg|HR{ot$8N290TB08w_BK3xPJnD_WVg=` zN^MLy1>8Ql7qk3^75a+K?(=FA&1J5KXwbNy1q*ht0UerKL^R6La{En8{em-@AbtZ# zo^eAQi|EPdc@)+Oq%qG0Ydd!M@##*KEkw%ZeegwAyWs@tZQ}@c^pi5e1vJq-Z8nI% ze5kzP5nmejh-&QgZOa&WsU^vqtLKW`fI`?VgQPovj3?jUE`%$2fkZ%4oXhsNp2_$?vOzktQ z(AS`~LcL`#yl*xt2u#q1D=uDk%Z%Ug@a6?9${Iyn>pd{R+*&Q(sfM@XMRHw-!{dFN zyeE1G>PG#{`HB*m<}mp)T)>IHIfJ@NkafOV8C+WuIeja%|} zJ?mWfA1Y>Vv~E>DZa;ocT-@gV4aAc(tTnG&1ZiWJ-kss4Icje%sd^8dE5r!arr*;a zs=rz#^^sEz^QJVmQAec80tO&&9&?3y3+h`v=0D?OAW5CSR5S^wG1G zdosaW1D)TJKJ9H%MptVG~VX5$}K`IBDV(Tz>(aXdcb}bT6-|{E+of&(&LU&;u~y^WAM3i z(z`nC3^b=gzrofV%N4=cL1-zo_n2!-IB0&m(&kPze7VZXQ|D>W4&*uI*Bw|g82EkD zPAxl%web^=b-d$j;dd67oEa1%{Adq(lTQy7JM5Od?R|>$<0D0@{pn>-p?27 z0MFi9*b!bi%!9X6$*X@N?Pi5&xlU6!9fQPdAgN9 zUVW(2`N{2rFePh#t=`Xx*l{}uCTArqW&>=^)YPaGbm*wp7_<-Yv#kcp1)7y=aoK546`+E%vjL9%x^*x69kM#77yB!|?;ylT=m+@K zQ)Zs#D&?C5?v(HAzOoxEzOCY#LhJ$I(45J8I%og6_%S!uHN=9$#XJ~5-ktcA@Io_#hP0<&0mkb` zmq6m{p7bTd;dUUGbT0T~;(c`e6$kgS%3pl4RS&289^ce@f6ylKa*(~5l%SSiTCud& zq_^_%W`>B&c6@eboU32vX~@s{y-x8gP4{&PsDOgz3kP#Pn?(-0*s(oOn0y)<*o!_f z1p+_Ivh(nxO=8>`3$&X)=dcS3gWWPsqdO8aF9Y7u1(!1IueN|c`bxAlel%?lKKQj* z8SuOm#;^YzTuN#_vda1OC?<-&-{R6@-m{OHPUU?}-YVgBhl% z&Z`KmtvZd$>9jtM0n9~8{|q;N3C!?T^pr0bDpSm%#lUE;ecQTfE$Vk7Z>bO)2M33m z7q`v;;HKInh_vbZcno=ub5tI*a;nvuHqg(R*iKz}a8diW@40m52b(><*Z0~9XD?M% z`2ZSjVvkfBpyA%gM}ApT1^>NalHMC1Wwp913^K~2ekA^KU@2Ncu|o63FwV=mklD-H z_sEH19&g}Z&L?!Q#;SX#i|d}LcqeXpt%4)BjAUT|xayh8t{CgXD+^{GfQc6Sn*~qY z{Zug}PV&c2CmVpM!K3k$!1mzHbZ{`9uL0ZPoWxMc{&_prghAEnH2Q&%-roWP(Fsa} z%fN&tNYg_wYDZl>y*P>JU(jJBH|j2IKW3&5Q%Alf8iPK!uKKH`>KzPtbCszel2acZfS-zx&@F zmwzx5V)4?uuF>(VUOsgtZGT^* zAQA(h=5B8OQ#i#p;^- z#tRRz%hH$mUa*+CnRf!g9$*oQtyyUPP&a-o+1Lx({5^2_`Vxw_=nqwrs-OLVh3y9a z-%&O_>AK7nx{2PzAY3feHY2szD-%rMp)!|m^u198$L zPWv?uOCV84pQEI6q8b8jbg5?%Nq=_+M`)#6A4qju7boy$StrAwY8ski5OY24K7%sl z6Ory)k=P%Pnar}&*Ruz8`g1m9|31=>{%yd>{q$Hv%x#AvVTnVm$0DN6`$j(+E9!4z3#f2OCm5s_IQH(SkZXQ-tA>gN3>1FjDA?^65EaC+4j z*|29rSr$;e4@n~R5sZI~KsfI-+yL3vcz~SdLrk|Ccr42;~8)4kADqn1~$3 zeLH!uj-oC<%B=dmf3_AKiH@VI%+C?B&N&(Xd4Hoj2UI8ht?2X|ITLevtO78qqX^lh zi&q4(NHrCWiR!gTA~vZ`qVr~Il-z*6`;MFIp?Ub`bqEV< zAeH{B1}cDZ_f{WZJ^USK&`$RT9AAmV|KYq1aDe{`)HL3WPet9UQXaXZVRB{2Qy7AoaPx7N* zPW{NGiqa>7lK6e3Js~&(-FAQrXk`BJ0gSeqPgaE@Ik!uc2ekik;cFgNsp6pnjB~6eu zHP|jOa3vpfT*^I)X20XL2a14{WCx#cd4~gZrmNP!R|wI8?gj517E+XSS(djKV?tQx zb&B2O_9#>3<+v-H;p=# z?~+Rp!iatlgS3OrQcSTX?$N~Ng~F1>R6A4>ay%}$fAbUY zs}U1F_HD#*oEW#`CFY%i=JE7jtQIa2;!7q-P)o}z<&z)MJ#k0OCUWQf=cFz^+3h1i z(UFi+hiOdVVh3DgLE_@f%S_XczUDPi=2xs=eSdsLU-JCELKRa)L;wVQDqlBJ?|&)a z6f{3Mwp`!8vph=S#uN%)sE(XuHMK5GE4b-hdPbO5#QoYW?uG@(CAbASYd;)(mK5;Q z%i;_kxAKj8_`qxvEe}gjXIRGWMz(ySNtIewGo~B;-5%&Vm463o#Vqu&M!qa}Ag`l) z=p~cAMs9&$Xrp}=yG47{-jt(K?U?NgDNW(jS1G~L2}3^$Z4M5TUq(vT9KJ{~^S^z? zNGrjyNP^KivfT`?_5h4JPo9V!8Q^-|k4C3-V1g;frQm7E(vy>6JvICQT(LN6&JF57 z)AoB+1bQR)ob8<4f%Kcdh9Fbm2{kD3_RW}v1|0Uk1Nr{z!s4vXIxQADe>$K8nk2$0>k;ceQ zZk20u>aWp-=tPA4rV$GN95O)<3Y5Q|#DY1Cf7#`=DE8>K{*-oRV3|q;rzFqsVw?8u zHbhx~^8xo8y4Oj3@>ldz8x!w9Pp8r{n1_J~FotV}ADXo27klKZK3Yw8NbhRc&pwVS zBfce9)HD77d~!UBY8Lxw*GFkHCRGuR2ga{zqTC}5pLE{6$o@)u%j#k+&WP9p>~eWH zeIYFj7d7bG8Ls6%RXy@hN^L~ZcHD_nMfzw%|NPt@-3BuN{@Ukj zx@aX-f&KXkB5R8ZJl6BpZzSQW@J`r~9v>)y0qX{_lBisDGe@cYJPlnpX{XR!!fS6| zs2fuB&sIl9VI+b*@bRKr`0`L4!|eU#fyHf?uYXcxOa~zdquI4#73Lj zdL)lle_89qKU7!dw0y32Coz<=7b|wW+*bqt+CQ85Ob)Q@oA}WKSoURy_)i*aTY>sU z%6-uEe0IxwN27qu_DRC~UbDjzm!lVdsN~9)8`*#W+!X@rhlB7)(7aA-X#ImqS8~vD zxs=!zzo6%}&X&L{AKKY(x)(t3no3ShzK2^ou=$fKhP@|dVHzG+UboJYZ)+?$T6;KZ z=6`&krrt^K3R}+^Olf5T#-vFe-CDNj=~|1nho=o9t(g0WmYHkhjMGOmxA3P`78eLv zA5%AvwJlS6*%uza_^w@FeJkox&-<`#?5YVr&m}$K1R+bS7rIG`)*CQp-uQ(9N98@l zX07jp8D~Q2RBseN+kv!&uC`*KpxuN+YxY25_(Ff7c(l!bNl5HsK~`P@+_1$D;6jAD zM*%PTiASC@68-a1KYy9gINp9P>AO!e#Sl|te+-^KY;m}F*zB1c75T%=J6K~V#i5W~ z-)wa+m|{}HMcpgcHWP$#lbxTkfv^qdK?jnsFBp=q?Z=KEhLqC@HUmDXU$I=7XVn9!U9LvowwL!t6c@#QM#UX$BO;N$?OxS zF?c(rt9Q227GMGPiTV~4pcT(7bQO(H86L^jRZy9!?V}^UqF?MS*vofx`bFCMil1fpsT%zCwDiDYv`y_#0h&Q_VSh z7ai3_C`Z50ep$AXy?t1gs(-@~C(DbgRS%3^ykp{dF_D!uC~v#KLb0sh!GmQftsWJp zoci~^(Bp439M}p2J+es+txOAbQz2;0L!#k)rOyiB#pKc%L#1<1oA2yT)oViYNSA_5R>?69>mUuAFDnN-+x`7$Z2Wt59cdN`ufN=Xzl%{9e(O|k$Yb z=b1}CUTs%#T9AmaP#&&_y4>as%@{8!9U$QXC!VxBmy{^MrV(6lK0GSuRF)h*N2bSO z4P_jb`}pE-%Y6*Ul{id2E@O(BiMGTZAqlpk=Gwm-|+Y>gnsHRNB4C7J}PTXXD4Si+M_Pb8gCf+>NM}r&6rF*sC9oTF22)sYyAA~Qi9=0 z=7)Dea(V-GeI$WP5#LgXkMP|$#Ns8V)(e$U1*UBb$D)K^UftuXenLhfQ;lqF%sYRF zw$Yy(ZOk9d5>3e!$^vldYF2d}!js_E8$4hQc8bY!fAh|O-_(F$KI-jWL<;l!K*1OK zKCnlUkqO_Y1Ux6>ll5NIr$ALFRo*Xeig)L}&XUuaaMO#=+$qr1E!7Y#Xf5DPm{3mp z`@v=TJCXFS6S&G>Q@f8kh!1n_lD-=T8w45xL~dhvmDa=~U>h;i_b+|ZjcXeJq?CpelTbYD%Qq83vy%!zD|e#gy3%K6%nxnaRE zP~p84n(#Dn!+PM5&ZqzWQG8ULe#9sMsWgeYKa*7_C)RKJ-_;3knNX|n%bt;c@EtbJ zi2dl0yfX{bS|Jcp@I{;dnS=-C1FamKOW52*jS#YhB2eWG!B><@jH&EKV1 z_-NXZ$+N$z?^=2Nf*{jIq&aGfv zXw#5qw3twJmG+BGN_RR7THj*hsNjkTKt6$qQ?>`b*{-qMsrg7T!aP9$VU zT3)vW*-cR#SGn58Le7=kt`XF41)$2Vk~lYXWFAd|nQ#8f(U0&rquhZ~t+;3OVI|)* znF*imatE-FfHd_P&+@EQTRVZ-6!T|5jq}1P+#^TSi+tadx!M6MFzND_F7ITQX0Gw_ z-epi9riLleA(o=IuGcrTC;#^wZIkTt=OKHJwKy3FI8aB`C7IvAM4C%&aDkqS=EoeM_?i4JqN_lJQ8iYO9za=)HFyA zBg!F1HfU2-@ArxRkfhyT)=@V-EdOf=?eZSHsM0(<{Tha_QSm~@KoFC!*`wTjD0S)~ zYQud$%uG4jeI!!4KPO{P8A2`uuD+CFNNDL12=5qG*B{5eZdWeRPQ(KX5* zpDfh~)snhDRnHB;WvDpuvN~93^;u?}J#^M!7-5JJT&9=YKQZ6kUD);gxxN z{*uvpDyW@(`7PJm*fiTL_7nctRqe}K2@2*jjImlC9yULsLl(r@I@cGVD{jErOM<7b zVAv7Fmp9!;bL{f$ez8F+Q_l=S1w-h zNiDk7yaz6ydOnFrsE`9HAnY5S@_p@%EF0XC=_=t4v^v$^?$vy}I5i&Foi^oHtl6}Z z=fHeAfrc!?m3~GWn;x`ohOxUj9$kn7P9qpfMf7MiE++vy(NKf7hm9cZr@v;BX=g;q zfYZgiB;j!_=w~AU0$ivCg1jUrAJ^U zxHq9}5FzUwPQb#@xF_7X=`7S;I3TWg+@g7?z6l5K1Pt$iu9XJY!e z1Z(rvBT^mizr6+1`0KvJbs_iF!n(D7!-w%9r(}TbT(uQ1F_9dd@;XXIREzkfPzOeC z-5!JxcP0)}5FuS8|G8-iwcm5Uar^#Y)q%H04%sM&v#sYl{!l5&ypKq)R$PrUS{>mZ zT(NW5VV{q{y?7<%vR;Rg*N^K13<|ktrk4PN!pVD`o`6ANejdg48}lmVF1dojb$XK^ zHX3xW!wB`1uS_&l2$4m7N}!h)+W0|#cLw9c5YT3|(eeCaexH~1(&=Qy%ntJIcp(rN z0L?Mf{pe`~l~DDQh|wbI>^07-j3M6~Atz81wY^@*f^l+z*C7x#)ZiO^3?izZR-V{? z0XWU4JA0(p^>xH2wZK8qo8xNOcj<7hGVLu{`5E9Ih1IWp-l_DCojX8!H1zIo-_ zhg{vXS@Sa}tv)liBtQ&iT1;IX}1DwJh^ z@W1GHkHwV>BF)~fQ>)yUpx5q-)vO% z{$@0Zj!^#e_qPl~{Tp$6jM9o?qwv^KB%_}3FG5E7M%)V_Tf2P@c@v#l!m(l6`rPlF zw|*`%9}aGa&HH>C_-0Nho}|m!o?MOuk(?Sl7hF?saTLB;Wm+W@V>F#p0qeE1(_YY~| zIP8);k5JW)1|OU1A1YrB`_bLDorWro0>ltSnOu1KU_$n%`Hg1`kKXynT1X9B?tZsk zVm$wr{)t@E%}U>obEAB766dCnP0E0Q7wE*yw2{CNj1YQI$$H$gcgD-%2M>#(tHv$k zj&~+ek0Z3WK8}uinsOyI1BCkhI#n~qz!R=|OKq2kwv2a|4%Mk>0Php~*>Oxeppya> znoRdO(HBTJPKb(kkf$^Imosh>SC>WQu#!8b%Tp!+2FNlV)fY_$FXJHBC;ar|C+gz) zpqa5ziMk^z-rd31*2$g*=1-q0t?h?Z;v+mYH3<$grqgBp<^Qwx!`d66$O+*8>lmj| zg3`bc)GE+&l%KzG^a9m151{;SxkB#lre5<|JQKD=`Po?htPy90ckLZD9pZ^=#ayL@ zAsIf?4az$w!TpzAhN5II68lhyDbU2sMRL}u1VPw=;rXcI-E1hsSJ*Y<)|HCy<+0%O zfZw4qiJVt5uhEM8NFmrGMJXnRFpf@6V&sv5hF}$S9yD{h5GIor_bemhPVcgwP!#y= zR#umf>1k+r=EM${lRwk&T2#h71h?*wKD8*pLn0M9{P4t03sDE!8L{Dt%`0={o}S6+_+A_6Ne=vqIQc z_P>ex4UrnHHG_5VD4f8Ktl*xQkM*S4R{zVppN(1{q03R_AK%#ZcDRY~6Ezf+#A9_F z26_KbsZf3a)6MMLJut2@je?{z>P6z81HsmZ$H-<{BvmWS3Aq>@nxv6of^7<;b?vnN z@^I}^XJ)E{L>*YnpGiFZQwFThJYbL)aD4roc#IT0U1D;?IFzYS3|5` z!HVL@VnrSfy6Yl)O1(;lOns31Q8Gpn)V~9T2Yc_(?Bnyar}=d2^rCw$_9$D{PA$xD z%v-fFto&Ded_(D+&yP#$&o6bm z9U4SWJIw0F5Tc;TdU**WE!9T3JKEpjkzEx3Ud^61Kh>)3&S?%s(ZOKJ`|MaQ?XUzv z=zZz#cx1ZJtnq=C_iVoUzzta}g#Hx#f$fyx>zcgucm$OwAlV89R8QF{R05NVtA!4K zyJ*u%ZUkBt0I`HpMDaaX`w4Ie59=+fqwJWznIk``)F8;bu)jz*(%xyJ0ddhAtuk<` zkO^#OO$ada`fh`G;?$s zaf~tz^kmK_+&c~FGq#j2+z7^zBz6MboKYa`d{1ad^F-^L^~jL z`87J~UCsG~^H;i1S$}oC$?KJRYGGoc+sd~i(%PD*rirrv=mZ7X^~q&JKkDv&i_G45 z?xb#$49#gs_JpZPo%Ei(MOjXhld8#OPBVQ-34pglTz|1q(*hn#*O{y@sRD1*HxhxK z7d{C2o0mtC*+P4p1U02|1{7yVxL9EeNr^nk?{uZ*Pg<1vclrU_-57GLCUQS{;Sn{L38hs z`xlAmjK8#%u*F#te@;sexP6vOS!To2fiE>VJ&U`}l52o%0tQWYSVCKND*`(yCDSRAXQ_^-EQFuEvN~uX2nd zGNgB_6~$f}cw6Qc^g5`D=hQD!R{OWU{f86F>3w`sbU8@E z{I`39{i5e|)rjuPXDhz&4J4MCpq+pZSO_Y^FU+>1@Rjv?(1mFzlTlD_=Zj?co1ZaO zk{_6ZBrmu1_jO{?13+h}(^e2Yp*2UJwAl5BN*u(fzG4iilu_Y%{NO$pm9s(hnsLoV*kpry@u(D ztW8l7%KuQ#974GqiH~bxy*q7gcZgsaakaU-mi#fXzfI}2nrQg;*#n%h45TEfH9E*E zR%@;?GI`6p!_B_(ZB1k38h5psF zkda=-1)t7Z1EFSR_=ZK;ox_v?!KI$ksSN6bCj-lQ0^9k|nq3hui@-AbT87>dxO0TY zMfKJYMP2-(9UVM6N}BzJLP{Nqwp}!6s7bhcGMbuU`=>~S&nsoZSxhB477Rr*oH~+V znd=suUw$Y;=O@|TN-Ob`6~BD7i_smAE8w4V#(sK2cb#A^`;+0F1s6G1@xG$$d>ur_ zU-e^^?~l2Ahu4t4o~PQaYf}Ciincg|6UKGK-P+(*3d@j$q7Z?m_}24Eq6$JSmn#*gV}LvwY3$+0?)rJ z>PxiAWP34uVb^x0I@`eW6N!I{zDOFeJBa3jA*2W^g*UcrMh-5qIYGpe|igND9DYVPt$VAW!e4mvKE?}E-=IYrX6v1k<9z%-I2wm;#nokMLG z7^P4O<_nNDR%?Bo+WM%RMrP3Imo(I5!ulVo`gvjXUg5itBheIqf~S+S|3CZKf7xNc zyNW2Y7QBNtk@X&U*#-J&n2k#4ez7$5w@*lRz}0eI%l%-}pdMfqUSJt+v;)Kxf2b}g z-pYri^Vdg&ccr~xgh8{u&3!>QR$q$zY5UEoPMh;mn$`>v7Wd<5ZoSnjeo^2$#&@e| z|1yxFQoahG=IP>-IT0*RK}zT(XqzeNXbJn%WFDTNtYe#Pe}-6L80h; zYQBiK5~>i)QyAZE)}5}(@NB3BsXlbenOdvMh{>#-9X4jKp9Qv2X<4>RK#myjp7d@Z z|9MTuC=Gj%yN##UIOZh>Fq3rYH!I?}U)`}s)tx)33yUKS{^#pd;l<0|4w`wVEZ8K* zq^e)r)GTem)^J0(XNDKFMCV8GRylj$oH`4X?k|=_R|H0PqK^huktD&LkP09b%BdMb zv*nmsRZU9xfrUCcYpL3D>ykQ zJF{9+Y{-DaR<0GF6saE2bZ(pDVcB?z_I!`y^@N0VA^cgmj_1V5;`M1p#+`8-7C+u> zFHTyFJBlP?*}6RPZ!XIS#;My@X|33Fj8 zJ