我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL的相似搜索插件有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL的相似搜索插件有哪些

这篇文章主要介绍“PostgreSQL的相似搜索插件有哪些”,在日常操作中,相信很多人在PostgreSQL的相似搜索插件有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PostgreSQL的相似搜索插件有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

类别1 : 元素重叠度相似

类似倒排,以元素重叠度为基准的相似计算。广泛应用于数组、全文检索、字符串、文本特征值、多列任意组合查询的相似搜索。

代表的PostgreSQL插件如下

1、rum

https://github.com/postgrespro/rum

2、pg_trgm

https://www.postgresql.org/docs/devel/static/pgtrgm.html

3、smlar

http://sigaev.ru/git/gitweb.cgi?p=smlar.git;a=summary

4、smlar+海明码(向量相似)

《海量数据,海明(simhash)距离高效检索(smlar) - 阿里云RDS PosgreSQL最佳实践》

5、pg_similarity

https://github.com/eulerto/pg_similarity

类别2 : 向量相似(类似knn距离)

向量相似与元素重叠度计算,显然是不同的,基于元素的重叠度相似,可以利用倒排来实现,如上节描述。而基于元素向量相似,需要用到自定义的索引接口,典型的代表是GiST索引在空间距离上的计算,以及imgsmlr插件在图像特征值相似方面的计算。

1、imgsmlr(图片向量相似)

https://github.com/postgrespro/imgsmlr

原理如下

64*64的图像,取16个区域的平均值,生成16个浮点数,作为图像特征值。

一个值求相似,相减绝对值最小。

2个值求相似,可以理解为平面坐标,求距离最小(GiST knn距离排序)。

3个值求相似,可以理解为3D坐标里面的点,求距离最小的点。

...

16个值求相似,与上类似。imgsmlr插件使用gist索引接口实现了16个元素的向量相似索引排序。

例子

postgres=# \d t_img  
                Table "public.t_img"  
 Column |   Type    | Collation | Nullable | Default   
--------+-----------+-----------+----------+---------  
 id     | integer   |           | not null |   
 sig    | signature |           |          |   
Indexes:  
    "t_img_pkey" PRIMARY KEY, btree (id)  
    "idx_t_img_1" gist (sig)

数据量

postgres=# select count(*) from t_img;  
   count     
-----------  
 319964709  
(1 row)  
  
Time: 698.075 ms

图像特征值搜索例子,速度杠杠的。(以上使用citus+postgres+128 shard)

postgres=# select * from t_img order by sig <-> '(3.539080, 0.243861, 1.509150, 1.781380, 8.677560, 4.232060, 8.979810, 1.665030, 1.294100, 4.449800, 9.200450, 1.859860, 5.440250, 7.788580, 0.514258, 8.424920)' limit 1;  
    id     |                                                                               sig                                                                                  
-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------  
 148738668 | (2.554440, 0.310499, 2.322520, 0.478624, 7.816080, 4.360440, 8.287050, 1.011060, 2.114320, 3.541110, 9.166300, 1.922250, 4.488640, 7.897890, 1.600290, 7.462080)  
(1 row)  
  
Time: 337.301 ms

2 CUBE

https://www.postgresql.org/docs/devel/static/cube.html

a <-> b	float8	Euclidean distance between a and b.
a <#> b	float8	Taxicab (L-1 metric) distance between a and b.
a <=> b	float8	Chebyshev (L-inf metric) distance between a and b.

计算图片向量相似时,cube比imgsmlr性能稍差,因为cube使用的是float8,而imgsmlr使用的是float4。

例子

cube

postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t_img0 order by sig::Text::cube <-> '(0.435404, 6.602870, 9.050220, 9.379750, 2.483920, 1.534660, 0.363753, 4.079670, 0.124681, 3.611220, 7.127460, 7.880070, 2.574830, 6.778820, 5.156320, 8.329430)' limit 1;
                                                                                                   QUERY PLAN                                                                                                   
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.36..0.37 rows=1 width=76) (actual time=147.432..147.434 rows=1 loops=1)
   Output: id, sig, ((((sig)::text)::cube <-> '(0.435404, 6.60287, 9.05022, 9.37975, 2.48392, 1.53466, 0.363753, 4.07967, 0.124681, 3.61122, 7.12746, 7.88007, 2.57483, 6.77882, 5.15632, 8.32943)'::cube))
   Buffers: shared hit=16032
   ->  Index Scan using idx_t_img0_1 on public.t_img0  (cost=0.36..13824.28 rows=754085 width=76) (actual time=147.430..147.430 rows=1 loops=1)
         Output: id, sig, (((sig)::text)::cube <-> '(0.435404, 6.60287, 9.05022, 9.37975, 2.48392, 1.53466, 0.363753, 4.07967, 0.124681, 3.61122, 7.12746, 7.88007, 2.57483, 6.77882, 5.15632, 8.32943)'::cube)
         Order By: (((t_img0.sig)::text)::cube <-> '(0.435404, 6.60287, 9.05022, 9.37975, 2.48392, 1.53466, 0.363753, 4.07967, 0.124681, 3.61122, 7.12746, 7.88007, 2.57483, 6.77882, 5.15632, 8.32943)'::cube)
         Buffers: shared hit=16032
 Planning Time: 0.096 ms
 Execution Time: 148.905 ms
(9 rows)

imgsmlr

postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t_img0 order by sig <-> '(0.435404, 6.602870, 9.050220, 9.379750, 2.483920, 1.534660, 0.363753, 4.079670, 0.124681, 3.611220, 7.127460, 7.880070, 2.574830, 6.778820, 5.156320, 8.329430)' limit 2;
                                                                                                    QUERY PLAN                                                                                                    
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.36..0.37 rows=2 width=72) (actual time=40.284..48.183 rows=2 loops=1)
   Output: id, sig, ((sig <-> '(0.435404, 6.602870, 9.050220, 9.379750, 2.483920, 1.534660, 0.363753, 4.079670, 0.124681, 3.611220, 7.127460, 7.880070, 2.574830, 6.778820, 5.156320, 8.329430)'::signature))
   Buffers: shared hit=2914
   ->  Index Scan using t_img0_sig_idx on public.t_img0  (cost=0.36..7032.36 rows=754085 width=72) (actual time=40.282..48.179 rows=2 loops=1)
         Output: id, sig, (sig <-> '(0.435404, 6.602870, 9.050220, 9.379750, 2.483920, 1.534660, 0.363753, 4.079670, 0.124681, 3.611220, 7.127460, 7.880070, 2.574830, 6.778820, 5.156320, 8.329430)'::signature)
         Order By: (t_img0.sig <-> '(0.435404, 6.602870, 9.050220, 9.379750, 2.483920, 1.534660, 0.363753, 4.079670, 0.124681, 3.611220, 7.127460, 7.880070, 2.574830, 6.778820, 5.156320, 8.329430)'::signature)
         Buffers: shared hit=2914
 Planning Time: 0.091 ms
 Execution Time: 48.210 ms
(9 rows)

cube相比imgsmlr的好处是:cube可以计算任意维度的向量相似,imgsmlr则仅用于计算16维(signation类型)的向量相似

到此,关于“PostgreSQL的相似搜索插件有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL的相似搜索插件有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

window10搜索文件的方法有哪些

在Windows 10中,您可以使用以下几种方法搜索文件:1. 使用“文件资源管理器”搜索栏:打开“文件资源管理器”,位于任务栏的左侧。在搜索栏中键入文件名或关键词,系统将实时显示匹配的结果。2. 使用快捷键Win + S:按下Win键和S
2023-09-12

golang 函数和方法的相似性有哪些?

go 中函数和方法在语法上相似(func 关键字,参数列表和返回值),语义上也相似(类型化,可重用性,模块化)。具体来说,它们:语法上:使用 func 关键字声明,接受参数并返回返回值。语义上:都是类型的;可重复使用以避免代码重复;有助于将
golang 函数和方法的相似性有哪些?
2024-04-25

javascript与java的区别与相似之处有哪些

这篇文章主要介绍了javascript与java的区别与相似之处有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript与java的区别与相似之处有哪些文章都会有所收获,下面我们一起来看看吧。随
2023-07-05

WordPress的插件有哪些

本文小编为大家详细介绍“WordPress的插件有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“WordPress的插件有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。  插件一: WP Mainten
2023-06-27

Xunsearch搜索的扩展插件与集成方案(Xunsearch支持哪些扩展插件和集成方案?)

Xunsearch是一款功能强大的搜索引擎,提供了丰富的扩展插件和集成方案以增强其功能。Xunsearch支持多种语法扩展,中文相关功能,搜索优化扩展,以及其他扩展,如地理搜索、数字范围查询和表情符号查询。此外,Xunsearch可与多种编程语言、开发框架和内容管理系统集成,便于快速部署和使用。
Xunsearch搜索的扩展插件与集成方案(Xunsearch支持哪些扩展插件和集成方案?)
2024-04-02

C++二叉搜索树的操作有哪些

本文小编为大家详细介绍“C++二叉搜索树的操作有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++二叉搜索树的操作有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。二叉搜索树概念与操作二叉搜索树的概念二
2023-06-29

win10搜索框打开的方法有哪些

本文小编为大家详细介绍“win10搜索框打开的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“win10搜索框打开的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。win10搜索框打开方法:1、
2023-06-30

maven常用的插件有哪些

这篇文章主要介绍了maven常用的插件有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。背景maven 常用的三个插件对打包有不同的作用:maven-jar-plugin:
2023-06-22

好用的Vim插件有哪些

这篇文章主要讲解了“好用的Vim插件有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“好用的Vim插件有哪些”吧!1. VoltVolt是一个插件管理器,你可以通过它来安装插件并创建名为“
2023-06-16

openfire插件的作用有哪些

Openfire插件的作用可以分为以下几类:1. 身份验证和授权插件:这些插件可以提供不同的身份验证和授权方式,如基于LDAP、数据库或其他自定义方式的身份验证插件,以及基于角色或权限的授权插件。2. 消息和聊天插件:这些插件可以增强Ope
2023-10-18

编程热搜

目录