2013-08-21 154 views
3

我有一個約3百萬行的表。每行表示一個包含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

查看PostgreSQL的KNN搜索。見例如http://www.sai.msu.su/~megera/postgres/talks/pgcon-2010-1.pdf。我真的需要樣本數據來產生一個實際的答案。 –

回答

0

快速KNN搜索需要能夠從索引中完成。根據您的要求自定義類型,需要爲該表指定整個範圍的索引支持,並編寫函數來完成計算。所以你需要做很多工作,答案並不簡單。

你打算什麼需要做的是,基本上是:支持

  1. 審查GIST運營商。

  2. 編寫函數以支持計算任何或全部這些函數。

  3. 創建它關係到這些成GIST指數操作類,並使用該索引方法終於

  4. 索引你的整個表。如果你的表有很大的字段,你可能會遇到問題(這裏的表繼承可以幫助你,但這是另一個大問題)。

這些對於一系列問題本身都有很大的廣泛性,所以我不認爲你可以在這裏期待一個解決方案。但是,這應該給你一個基本的路線圖。