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/