postgresql模糊匹配好用利器
  • 作者:admin
  • 发表时间:2021-06-02 07:52
  • 来源:未知

ArteryBase-模糊匹配大杀器

问题背景

随着pg越来越强大,abase目前已经升级到5.0(postgresql10.4),目前abase5.0继承了全文检索插件(zhparser),使用全文检索越来越方便。本文会对abase支持的like模糊匹配,全文检索,创建何种索引,如何使用进行说明。针对于各种模糊匹配均可走索引

前模糊匹配(%xxx),后模糊匹配(xxx%)

使用场景:如果简单的前模糊匹配或者后模糊匹配则可以建一个简单的btree索引。

--1.后模糊匹配(xxx%)
create index i_t_msys_btrre_c_ajmc on db_msys.t_msys using btree(c_ajmc text_pattern_ops);
CREATE INDEX
Time: 4189.886 ms (00:04.190)
db_15fb=# select c_ajmc from db_msys.t_msys where c_ajmc like '北京%';
 c_ajmc     
------------------------
 北京决定和华宇
 北京和华宇信息
 北京
 北京华宇,北京华宇
、、、
db_15fb=# explain analyze select c_ajmc from db_msys.t_msys where c_ajmc like '北京%';
    QUERY PLAN  
-------------------------------------------------------------------------
 Bitmap Heap Scan on t_msys (cost=43.92..2177.91 rows=4204 width=80) (actual time=0.570..2.667 rows=1570 loops=1)
 Filter: ((c_ajmc)::text ~~ '北京%'::text)
 Heap Blocks: exact=500
 -> Bitmap Index Scan on i_t_msys_btrre_c_ajmc (cost=0.00..42.87 rows=632 width=0) (actual time=0.477..0.477 rows=1570 loops=1)
 Index Cond: (((c_ajmc)::text ~>=~ '北京'::text) AND ((c_ajmc)::text ~<~ '北亭'::text))
 Planning time: 0.956 ms
 Execution time: 2.841 ms
(7 rows)

Time: 4.848 ms
--2.前模糊匹配(%xxx),查询以c_ajmc以信息结尾的记录,使用反转函数reverse
db_15fb=# create index i_t_msys_reverse_c_ajmc on db_msys.t_msys using btree(reverse(c_ajmc) text_pattern_ops);
CREATE INDEX
Time: 4011.131 ms (00:04.011)
--查询以张三结尾的信息
db_15fb=# select c_ajmc from db_msys.t_msys where reverse(c_ajmc) like reverse('%张三');
 c_ajmc
----------
 华宇张三
 北京张三
(2 rows)

Time: 0.910 ms

--前模糊匹配也可走索引
db_15fb=# explain analyze select c_ajmc from db_msys.t_msys where reverse(c_ajmc) like reverse('%张三');
    QUERY PLAN  
 
-------------------------------------------------------------------------
 Bitmap Heap Scan on t_msys (cost=114.86..5312.88 rows=1787 width=80) (actual time=0.064..0.066 rows=2 loops=1)
 Filter: (reverse((c_ajmc)::text) ~~ '三张%'::text)
 Heap Blocks: exact=1
 -> Bitmap Index Scan on i_t_msys_reverse_c_ajmc (cost=0.00..114.42 rows=1787 width=0) (actual time=0.042..0.042 rows=2 loops=1)
 Index Cond: ((reverse((c_ajmc)::text) ~>=~ '三张'::text) AND (reverse((c_ajmc)::text) ~<~ '三弡'::text))
 Planning time: 0.236 ms