7

में उच्च आयामी डेटा मैं ऊंचाई आयामों में सूचकांक डेटा करना चाहते हैं (की रेंज में पूर्णांक 128 आयामी वैक्टर [0254] संभव हो रहे हैं):इंडेक्सिंग और क्वेरी PostgreSQL

| id |  vector  | 
| 1 | { 1, 0, ..., 254} | 
| 2 | { 2, 128, ...,1} | 
| . | { 1, 0, ..., 252} | 
| n | { 1, 2, ..., 251} | 

मैंने देखा कि PostGIS आर पेड़ कार्यान्वित । तो क्या मैं पोस्टगिस में इन पेड़ों का उपयोग इंडेक्स और पोस्टग्रेज़ में बहुआयामी वैक्टर पूछताछ कर सकता हूं?

मैंने यह भी देखा कि index implementation for int arrays है।

अब मेरे पास कोई प्रश्न पूछने के बारे में प्रश्न हैं।
क्या मैं एक पूर्णांक सरणी पर एक knn-search और त्रिज्या खोज कर सकता हूं? शायद मुझे अपने स्वयं के दूरी समारोह को भी परिभाषित करना होगा। क्या यह संभव है? मैं अपने प्रश्नों के लिए Manhattan distance (ब्लॉक दूरी) का उपयोग करना चाहता हूं।

मैं पैटर्न v1;v2;...;vn पैटर्न के साथ एक बाइनरी स्ट्रिंग के रूप में भी अपने वेक्टर का प्रतिनिधित्व कर सकता हूं। क्या यह खोज करने में मदद करता है?

उदाहरण के लिए अगर मैं इन दो स्ट्रिंग था:

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

परिणाम/इन दो तार के बीच की दूरी होना चाहिए 3.

+0

आपके उदाहरण के साथ यह बिल्कुल स्पष्ट नहीं है - क्या आप देखना चाहते हैं कि कितने तत्व भिन्न हैं (लेवेनशेटिन दूरी) या वे कितने भिन्न हैं (मैनहट्टन दूरी), उदाहरण के लिए (3-2) + (2-1) + (2-1)। – hruske

+0

@hruske: मैं जानना चाहता हूं कि वे कितना भिन्न हैं (मैनहट्टन, टैक्सिलैब, ब्लॉक) - दूरी –

उत्तर

11

शायद एक बेहतर विकल्प 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 आयामों में, यह मदद करता है।

+0

मैं वेक्टर को बाइनरी स्ट्रिंग (v1; v2; v3 ...; vn) के रूप में भी प्रस्तुत कर सकता हूं। क्या कोई विकल्प है मैनहट्टन दूरी के साथ बाइनरी तारों की तुलना करने के लिए? –

+0

टैक्सीकैब दूरी को मैनहट्टन दूरी के रूप में भी जाना जाता है। https://en.wikipedia.org/wiki/Taxicab_geometry – hruske

4

(चयनित जवाब देने के लिए परिशिष्ट)

100 से अधिक आयाम इच्छुक लोगों के लिए, सावधान रहना: वहाँ a 100 dimensions limit in cube extension

मुश्किल हिस्सा यह है कि पोस्टग्रेज़ आपको 100 से अधिक आयामों के साथ क्यूब बनाने की अनुमति देता है। यह तब होता है जब आप बैकअप को पुनर्स्थापित करने का प्रयास करते हैं जिसे अस्वीकार कर दिया जाता है (इसका एहसास करने का सबसे बुरा समय)।

जैसा कि प्रलेखन में अनुशंसित किया गया है, मैंने अधिक आयामों का समर्थन करने के लिए घन एक्सटेंशन को पैच किया। मैंने इसके लिए एक डॉकर छवि बनाई है, और आप github repos से इसे स्वयं करने के तरीके को देखने के लिए डॉकरफ़ाइल देख सकते हैं।

संबंधित मुद्दे