Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgreSQL中高维数据的索引和查询_Sql_Postgresql_Multidimensional Array_Indexing_Postgresql 9.3 - Fatal编程技术网

postgreSQL中高维数据的索引和查询

postgreSQL中高维数据的索引和查询,sql,postgresql,multidimensional-array,indexing,postgresql-9.3,Sql,Postgresql,Multidimensional Array,Indexing,Postgresql 9.3,我想索引高度维度中的数据[0254]范围内的128维整数向量是可能的: | id | vector | | 1 | { 1, 0, ..., 254} | | 2 | { 2, 128, ...,1} | | . | { 1, 0, ..., 252} | | n | { 1, 2, ..., 251} | 我看到PostGIS实现了R树。那么,我可以在PostGIS中使用这些树来索引和查询Postgres中的多维向量吗 我还看到有一个 现在我有一些关于如何执行

我想索引高度维度中的数据[0254]范围内的128维整数向量是可能的:

| id |      vector       |
|  1 | { 1, 0, ..., 254} |
|  2 | { 2, 128, ...,1}  |
|  . | { 1, 0, ..., 252} |
|  n | { 1, 2, ..., 251} |
我看到PostGIS实现了R树。那么,我可以在PostGIS中使用这些树来索引和查询Postgres中的多维向量吗

我还看到有一个

现在我有一些关于如何执行查询的问题。 我可以对整数数组执行knn搜索和半径搜索吗? 也许我还必须定义自己的距离函数。这可能吗?我想使用块距离进行查询

我还可以用模式v1将向量表示为二进制字符串;v2;。。。;越南。这有助于执行搜索吗

例如,如果我有以下两个字符串:

1;2;1;1
1;3;2;2

这两个字符串之间的结果/距离应为3。

也许更好的选择是,因为您感兴趣的区域不是单个整数,而是全向量

多维数据集支持GiST索引,Postgres 9.6还将为多维数据集提供KNN索引,支持

9.6仍在开发中,这有点令人恼火,但是将多维数据集扩展的补丁移植到9.5并没有问题,我根据经验这么说

希望128个维度仍然足够

如何做到这一点

首先有一个示例表:

create extension cube;
create table vectors (id serial, vector cube);
使用示例数据填充表:

insert into vectors select id, cube(ARRAY[round(random()*1000), round(random()*1000), round(random()*1000), round(random()*1000), round(random()*1000), round(random()*1000), round(random()*1000), round(random()*1000)]) from generate_series(1, 2000000) id;
然后尝试选择:

explain analyze SELECT * from vectors
order by cube(ARRAY[966,82,765,343,600,718,338,505]) <#> vector asc limit 10;
                                                           QUERY PLAN                                                           
--------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=123352.07..123352.09 rows=10 width=76) (actual time=1705.499..1705.501 rows=10 loops=1)
   ->  Sort  (cost=123352.07..129852.07 rows=2600000 width=76) (actual time=1705.496..1705.497 rows=10 loops=1)
         Sort Key: (('(966, 82, 765, 343, 600, 718, 338, 505)'::cube <#> vector))
         Sort Method: top-N heapsort  Memory: 26kB
         ->  Seq Scan on vectors  (cost=0.00..67167.00 rows=2600000 width=76) (actual time=0.038..998.864 rows=2600000 loops=1)
 Planning time: 0.172 ms
 Execution time: 1705.541 ms
(7 rows)
它是否有助于:

explain analyze SELECT * from vectors
order by cube(ARRAY[966,82,765,343,600,718,338,505]) <#> vector asc limit 10;

--------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.41..1.93 rows=10 width=76) (actual time=41.339..143.915 rows=10 loops=1)
   ->  Index Scan using vectors_vector_idx on vectors  (cost=0.41..393704.41 rows=2600000 width=76) (actual time=41.336..143.902 rows=10 loops=1)
         Order By: (vector <#> '(966, 82, 765, 343, 600, 718, 338, 505)'::cube)
 Planning time: 0.146 ms
 Execution time: 145.474 ms
(5 rows)

在8维上,它确实有帮助。

所选答案的附录

对于想要超过100个维度的人,请注意:有很多

棘手的是postgres允许你创建超过100维的立方体。当您尝试恢复备份时,最糟糕的情况是您无法恢复备份


按照文档中的建议,我修补了多维数据集扩展以支持更多维度。我为它制作了一个docker图像,您可以查看docker文件,看看如何自己完成。我还可以将向量表示为二进制字符串v1;v2;v3。。。;有没有一个选项可以将二进制字符串与曼哈顿距离进行比较?出租车距离也称为曼哈顿距离。就您的示例而言,这并不十分清楚-您想看看有多少元素与levenshtein距离不同,还是它们与曼哈顿距离不同,例如3-2+2-1+2-1。@hruske:我想知道曼哈顿、taxlicab、街区距离有多大不同
explain analyze SELECT * from vectors
order by cube(ARRAY[966,82,765,343,600,718,338,505]) <#> vector asc limit 10;

--------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.41..1.93 rows=10 width=76) (actual time=41.339..143.915 rows=10 loops=1)
   ->  Index Scan using vectors_vector_idx on vectors  (cost=0.41..393704.41 rows=2600000 width=76) (actual time=41.336..143.902 rows=10 loops=1)
         Order By: (vector <#> '(966, 82, 765, 343, 600, 718, 338, 505)'::cube)
 Planning time: 0.146 ms
 Execution time: 145.474 ms
(5 rows)