Postgres/Postgis 支持点之间的距离计算,按距给定点的距离排序等等,我试图滥用这个功能:)

这是一个例子,只是为了说明我正在尝试做的事情。

       Width    Height  Thickness   Hue Lightness   Saturation
Item1  220      157     100         270 60          75
Item2  221      199     105         280 60          75
Item3  210      150     105         100 40          75

暂时忽略这些功能,要从下表中查找物理尺寸相似的匹配项,您可以执行以下操作:
SELECT * FROM items
ORDER BY sqrt((i1.width-i2.height)*(i1.width-i2.height)
            + (i1.width-i2.height)*(i1.width-i2.height)
            + (i1.thickness-i2.thickness)*(i1.thickness-i2.thickness))

(称其为伪sql :))

我们可以将第 4-6 个属性视为维度,使得相似(或“接近”)颜色对于这些属性中的每一个都具有相似的值。我们可以通过添加这些字段来扩展上述查询。

现在,Postgres 似乎能够通过索引做一些非常棒的事情,这样可以大大加快上述查询的速度,但数据类型似乎只能达到 4 维。

什么是计算数百万条记录的 10 个尺度(或“维度”)的相似度的好解决方案?

我目前正在考虑 3 个 4D 点并按 3 个点的距离排序。

如果没有 Postgis,我想问题是:-

在包含以下项目的表中,根据 10 个输入值(每个 val 字段一个)之间的差异之和排序,利用边界框、空间或其他索引等任何可能的方式进行排序的最快方法是什么?

例如。
SELECT * FROM items
ORDER BY ((item_val1-xxxx)*(item_val1-xxxx)
        * (item_val2-yyyy)*(item_val2-yyyy)
        * ......
        * (item_val10-zzzz)*(item_val10-zzzz))

其中 xxxx,yyyy, zzzz 代表在前端应用程序中输入的值
item_name: string
item_val1: int
item_val2: int
item_val3: int
item_val4: int
item_val5: int
item_val6: int
item_val7: int
item_val8: int
item_val9: int
item_val10: int

非常感谢任何想法/替代方案。

最佳答案

PostGIS 非常适合 GIS,但正如 John B 指出的那样,cube extension 非常适合处理 n 维欧几里得距离。

添加扩展,并在表中添加一个带有 GiST 索引的新列:

CREATE EXTENSION cube;
ALTER TABLE items ADD COLUMN point cube;
CREATE INDEX items_point_idx ON items USING gist (point);

填充 point 字段,您可能希望通过将列乘以标量(两次为 2,一半为 0.5 等)来使某些属性的权重高于其他属性:
UPDATE items SET
  point = cube(array[width, height, thickness, hue, lightness, saturation]);

现在使用自连接找到一些距离:
SELECT i1.id, i1.point, i2.id, i2.point, cube_distance(i1.point, i2.point)
FROM items i1, items i2
WHERE i1.id < i2.id
ORDER BY cube_distance(i1.point, i2.point);

关于postgresql - postgres中的多维距离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24405310/

10-11 22:36
查看更多