PostgreSQL 9.6使用 cube
首先安装多维数据集扩展
CREATE EXTENSION cube;
现在,我们将在50个维度中创建具有100,000个点的n维空间。另外,我们将添加一个GIST索引。
CREATE TEMP TABLE space_nd
AS
SELECT i, cube(array_agg(random()::float)) AS c
FROM generate_series(1,1e5) AS i
CROSS JOIN LATERAL generate_series(1,50)
AS x
GROUP BY i;
CREATE INDEX ON space_nd USING gist ( c );
ANALYZE space_nd;
现在,我们将生成一个单点,并使用<->
算子使用欧几里得距离找到最近的点。
WITH points AS (
SELECT cube(array_agg(random()::float)) AS c
FROM generate_series(1,50)
AS x
)
SELECT i,
pg_typeof(space_nd.c),
pg_typeof(points.c),
cube_distance(space_nd.c, points.c)
FROM space_nd
CROSS JOIN points
ORDER BY space_nd.c <-> points.c
LIMIT 5;
PostgreSQL 9.6+支持上的其他距离运算符cube
。所有这些都可以使用我们创建的GIST索引。即
a <-> b float8 Euclidean distance between a and b.
a <#> b float8 Taxicab (L-1 metric) distance between a and b.
a <=> b float8 Chebyshev (L-inf metric) distance between a and b.
那就是一个警告,
为了使人们更难以打破事物,多维数据集的维数限制为100。如果需要更大的参数,可以在cubedata.h中设置。
您要求150个尺寸。这可能会带来轻微的并发症。