gpt4 book ai didi

PostgreSQL 遍历行并使用自定义距离函数找到最接近的匹配项

转载 作者:行者123 更新时间:2023-11-29 11:28:08 25 4
gpt4 key购买 nike

我是 PostgreSQL 的新手,我的问题与这里的问题类似:link

例如我有下表:

| id |       vector         |
| 1 | { 1.43, 3.54, 5.55} |
| 2 | { 4.46, 5.56, 4.55} |
| 3 | { 7.48, 2.54, 4.55} |
| 4 | { 2.44, 2.34, 4.55} |

一个示例查询类似于

SELECT * FROM my_table WHERE vector CLOSEST('{1.23, 4.43, 4.63}') 

应该以排序的方式返回结果行,我在其中使用自定义距离函数确定“最近”向量,例如calc_l2norm( double precision[], double precision[] ) 返回欧氏距离。

最佳答案

一般来说,您可以使用用 Java 或 Scala(有些人可能更喜欢 PL/SQL、C 或 C++)编写的存储函数来解决此类问题。

PostgreSql 支持(基于 Java 的)存储函数,因此让 SQL 查询获取数据,并将其传递给存储函数。存储的函数返回距离,因此您可以对其进行过滤/排序等操作。

基于这样的表格

create table point(vector float8[]);
insert into point values('{0.0, 0.0, 0.0}');
insert into point values('{0.5, 0.5, 0.5}');

像这样的 Java 函数:

public class PlJava {
public final static double distance2(double[] v1, double[] v2) {
return Math.sqrt(Math.pow(v2[0] - v1[0], 2)
+ Math.pow(v2[1] - v1[1], 2) + Math.pow(v2[2] - v1[2], 2));
}
}

和 SQL 中的函数声明:

CREATE FUNCTION pljava.distance2(float8[], float8[])
RETURNS float8
AS 'PlJava.distance2'
IMMUTABLE
LANGUAGE java;

您的查询可能如下所示:

select
point.*,
pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist
from
point
order by
dist;

结果

    vector     |       dist  
---------------+-------------------
{0.5,0.5,0.5} | 0.866025403784439
{0,0,0} | 1.73205080756888

更新

存储函数也可以用 C 和 C++ 编写。 C++ 需要更多努力,因为 PostgreSql 的接口(interface)使用 C 调用约定。参见 Using C++ for Extensibility

关于PostgreSQL 遍历行并使用自定义距离函数找到最接近的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17169754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com