再看大数据最大的技术难点模糊检索,PostgreSQL是如何克服的?
例如:
物联网往往会产生大量的数据,除了数字数据,还有字符串数据,比如条形码、车牌、手机号、邮箱、姓名等等。假设用户需要在大量传感器数据中进行模糊检索甚至正则表达式匹配,有哪些高效的方法?
医药,市场上发现的一批药品可能有问题,需要搜索药品条码的正则表达式,找出有复合条件的药品流向。但是,在如此复杂的系统中,如何用高效的方法来实现呢?
公安和侦查的时候,可能要调取线索。比如对用户提供的不完整的电话号码、邮箱、车牌、IP地址、QQ号、微信号进行交叉搜索,根据这些信息加上时间叠加、模糊匹配、关联,最终找到犯罪分子。但是这个过程有没有一个高效的方法呢?
类似的需求还有很多。几乎每个模糊匹配场景都需要正则表达式匹配,类似人脸拼图。我们已经看到强劲的需求已经产生。但是从技术上来说,什么应该做得更好?
在我看来,常规匹配和模糊匹配通常是搜索引擎的特长,但如果用PostgreSQL数据库还是可以实现的,而且性能还不错,加上分布式方案。
(比如pl代理,pg _ shard,fdw shard,pg-xc,pg-XL,
Greenplum),处理超过100亿条数据的规则匹配和模糊匹配效果,同时不丧失数据库固有的功能,绝对是多面的。
首先对应用场景进行了分类,介绍了现有技术下可以使用的优化方法。
.1.带前缀的模糊查询,比如像' ABC% '也可以写成PG中的~ '^ABC'。
可以使用btree索引进行优化,也可以使用多列索引对bit和or bit进行堆栈或者进行优化(只适用于定长结束字符串,比如char(8))。
.2.带后缀的模糊查询,比如like '%ABC ',在PG中也可以写成~ 'ABC$ '。
可以使用reverse函数的btree索引,或者拆分列和stack bit and or bit or配合多列索引进行优化(只适合定长结束字符串,比如char(8))。
.3.没有前缀和后缀的模糊查询,比如像' %AB_C% '也可以写成~ 'AB。在PG中的c。
可以使用pg_trgm的Gin索引,也可以通过叠加bit和or bit或者用多列索引优化列拆分(只适用于定长结束字符串,比如char(8))。
.4.正则表达式查询,比如~ '[\d]+def1。' 0|8]{1,3} '
可以使用pg_trgm的Gin索引,也可以通过叠加bit和or bit或者用多列索引优化列拆分(只适用于定长结束字符串,比如char(8))。
PostgreSQL pg_trgm插件从9.1开始支持使用索引的模糊查询,从9.3开始支持使用索引的正则表达式查询,大大提高了PostgreSQL在刑侦方面的能力。
有关代码,请参见/postgrespro/pg_trgm_pro。
pg_trgm插件的原理是在字符串前加两个空格,然后加1个空格,形成一个新字符串,并将这个新字符串按照每三个相邻字符拆分成多个token。
当使用正则表达式或模糊查询进行匹配时,将检索它们的近似值,然后进行过滤。