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 치수를 요구합니다. 약간의 합병증이 나타날 수 있습니다.