前模糊匹配的原理是将数据反转存储,查询时字段需要反转,输入的值也需要反转。 原理和前模糊匹配一样。
全模糊匹配(%xxx%)-三元组匹配pg_trgm
使用场景:pg_trgm支持前模糊匹配,后模糊匹配以及全模糊匹配,但是全模糊匹配至少要三个字符才会走索引,在全模糊匹配不少于三个字符的场景才生效(abase一个汉字为一个字符),也就是like '%xxx%'不能少于三个汉字。
pg_trgm扩展的前模糊匹配和后模糊匹配也均可走索引,后模糊匹配btree的效率比gin要高。
全文检索-zhparser使用场景:单个字段全文检索,多字段全文检索,行级全文检索
目前abase5.0自带了全文检索支持,使用select * from pg_extension可以看到zhparser的扩展。在abase5.0以前需要手动安装
全文检索查询 多字段全文检索前面是单个字段的全文检索,如果我需要对多个字段做全文检索如何做呢? 比如我需要对案号,案件名称等字段 查询其中包含‘北京'的行。由于pg_trgm是三元组匹配,所以这个地方就不能实现。
行级全文检索[
权重排序
可以看出当查询的结果集大的时候排序是非常耗时的,因为它要求查询每一个匹配文档的tsvector,如果一行较大,可能存储在toast表中,这样就涉及到大量的随机访问
磁盘io会升高。不幸的是,这几乎不可能避免,因为实际查询常常导致巨大数目的匹配。
结语
1.后模糊匹配(xxx%),可使用btree创建索引,效率比gin索引高,using btree(c_ajmc text_pattern_ops).
2.前模糊匹配(%xxx),btree和gin的效率相差不大,但是gin创建耗费时间,且gin比btree索引大。所以推荐使用btree reverse函数创建索引。using btree(reverse(c_ajmc))
3.全模糊匹配(%xxx%),可使用gin创建索引,但是pg_trgm支持最少三个字符。using gin(c_ajmc gin_trgm_ops)
4.如果需要对多个字段的全文检索,比如查询案号,或者案件名称这两个字段中包含‘北京'的值,或者案件名称中包含‘北京'和‘华宇'可以使用全文检索,具体的创建参考上面的例子。
5.需要注意的是当全文检索返回的结果集很大时,按照权重排序效率会很低!!!
6.需要注意的是使用全模糊匹配,查询的字符太少返回的结果多,会影响查询效率!!!
7.如果该字段仅需要后模糊匹配只需要建索引:using btree(c_ajmc text_pattern_ops)。如果该字段仅需要前模糊匹配则建索引using btree(reverse(c_ajmc))。如果字段有全模糊匹配也有前后模糊匹配就只需要建一个gin索引即可。
7.pg_trgm
8.zhparser
参考资料
参考资料
ts_rank
到此这篇关于postgresql模糊匹配大杀器的文章就介绍到这了,更多相关postgresql模糊匹配内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!