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

PostgreSQL迭代行并使用自定义距离函数找到最接近的匹配,第1张

概述我是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} | 一个类似的示 我是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.866025403784439   {0,0}       |  1.73205080756888

更新

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

总结

以上是内存溢出为你收集整理的PostgreSQL迭代行并使用自定义距离函数找到最接近的匹配全部内容,希望文章能够帮你解决PostgreSQL迭代行并使用自定义距离函数找到最接近的匹配所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1170569.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存