快速最近邻搜索

时间:2013-08-21 01:04:35

标签: sql postgresql optimization similarity knn

我有一张约300万行的表。每行代表一个具有5个属性的对象。每个属性值都是float,范围从0到1.

表格声明为

CREATE TABLE tbl (
  OBJECT_ID integer,
  property_1 float,
  property_2 float,
  property_3 float,
  property_4 float,
  property_5 float
);

我必须找到前10个与指定对象最相似的对象。

我的查询是:

select T2.OBJECT_ID,
       sqrt(
         (T1.property_1 - T2.property_1)^2 +
         (T1.property_2 - T2.property_2)^2 +
         (T1.property_3 - T2.property_3)^2 +
         (T1.property_4 - T2.property_4)^2 +
         (T1.property_5 - T2.property_5)^2
       ) similarity
  from tbl T1, tbl T2
 where T1.OBJECT_ID = 42
 order by 2
 limit 10;

如何提高搜索大多数类似对象的性能?

接受任何解决方案(oracle,postgres,noSQL或C ++)。

1 个答案:

答案 0 :(得分:0)

快速进行KNN搜索需要能够从索引中执行此操作。根据您的需要执行自定义类型操作需要为该表指定整个索引支持范围,并编写函数以完成计算。所以你需要做很多工作,答案并不简单。

你要做的事情基本上是:

  1. 查看支持的GIST运营商。

  2. 编写函数以支持计算任何或所有这些函数。

  3. 创建一个运算符类,将它们绑定到GIST索引中,最后

  4. 使用索引方法索引整个表。如果你的表有大字段,你可能会有问题(这里的表继承可以帮助你,但这是另一个重要的主题)。

  5. 对于一系列问题而言,其中每一个都是广泛的,所以我认为你不能指望这里的解决方案。但这应该会给你一个基本的路线图。