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.
とはいえ、注意点が1つあります。
人々が物事を壊しにくくするために、キューブの次元数は100に制限されています。これは、もっと大きなものが必要な場合にcubedata.hで設定されます。
150の寸法を要求します。これにより、小さな問題が発生する可能性があります。