余弦相似度是指两个大小相等(由实数组成)向量的点积除以各自范数的乘积。
我有一个大型的float
数组表,用于表示向量,例如:CREATE TABLE foo(vec float[])'
。给定一个特定的float
数组,我需要通过余弦相似度快速(使用索引而非序列扫描)在该表中找到最接近的数组,例如:SELECT * FROM foo ORDER BY cos_sim(vec, ARRAY[1.0, 4.5, 2.2]) DESC LIMIT 10;
但我应该使用什么方法?
pg_trgm
的余弦相似度支持是不同的。它比较文本,我不确定它具体做了什么。一个名为smlar
的扩展程序(这里)也支持对float
数组进行余弦相似度计算,但它在做一些不同的事情。我所描述的通常用于数据分析,用于比较文档特征,因此我认为Postgres应该支持它。
<
也是一个二元运算符,但是Postgres有btree索引支持,可以加速带有过滤和排序的查询。<@
是数组的二元运算符 - 同样,GiST和GIN支持可以加速查询。 - Nick