शायद एक बेहतर विकल्प cube extension होगा, रुचि के क्षेत्र के बाद से व्यक्तिगत पूर्णांक नहीं है, लेकिन पूर्ण वेक्टर है।
क्यूब जीआईएसटी इंडेक्सिंग का समर्थन करता है, और पोस्टग्रेस 9.6 भी euclidean, taxicab (aka Manhattan) and chebishev distances का समर्थन करते हुए केएनएन इंडेक्सिंग को क्यूब्स में लाएगा।
यह थोड़ा परेशान है कि 9.6 अभी भी विकास में है, हालांकि 9.5 तक घन एक्सटेंशन के लिए बैचपोर्टिंग पैच में कोई समस्या नहीं है और मैं अनुभव से कहता हूं।
उम्मीद है कि 12812 आयाम अभी भी meaningful results प्राप्त करने के लिए पर्याप्त होंगे।
यह कैसे करें?
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)
हम एक सूचकांक बनाना चाहिए:
पहले एक उदाहरण तालिका है
create index vectors_vector_idx on vectors (vector);
यह मदद करता है:
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 आयामों में, यह मदद करता है।
आपके उदाहरण के साथ यह बिल्कुल स्पष्ट नहीं है - क्या आप देखना चाहते हैं कि कितने तत्व भिन्न हैं (लेवेनशेटिन दूरी) या वे कितने भिन्न हैं (मैनहट्टन दूरी), उदाहरण के लिए (3-2) + (2-1) + (2-1)। – hruske
@hruske: मैं जानना चाहता हूं कि वे कितना भिन्न हैं (मैनहट्टन, टैक्सिलैब, ब्लॉक) - दूरी –