3

我有一个大约 300 万行的表。每行代表一个具有 5 个属性的对象。每个属性值都是浮点数,范围从 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++)。

4

1 回答 1

0

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

你要做的是,基本上:

  1. 查看支持的 GIST 运算符。

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

  3. 创建一个运算符类,将它们与 GIST 索引联系起来,最后

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

对于一系列问题,这些问题中的每一个都非常广泛,所以我认为你不能在这里期待一个解决方案。但这应该给你一个基本的路线图。

于 2013-11-12T01:34:39.887 回答