2015-03-22 6 views
9

मैं "नया" JSONB प्रकार का उपयोग करने की कोशिश कर रहा हूं।जेसनबी पूर्णांक मानों को कैसे अनुक्रमणित करें

मेरे पास तालिका properties जेसनबी फ़ील्ड है, और इसमें एक क्षेत्र publication_year है। मैं एक साल की रेंज के भीतर सभी दस्तावेज़ रिकॉर्ड्स ढूंढना चाहता हूं उदा। 2013-2015। [संपादित करें: मूल्यों की एक श्रृंखला के लिए पूछताछ यहां मुख्य चुनौती है, भले ही मैंने नीचे एक सटीक मिलान उदाहरण का उपयोग किया हो। अनुरोध किया दृष्टिकोण भी के लिए लागू होता है, का कहना है कि डॉलर पर्वतमाला (कीमत> $ 20 और कीमत < $ 40) या टाइमस्टैम्प पर्वतमाला)]

मैं कोशिश की है:।

create index test1 on documents using gin ((cast(properties->'announced_on_year' as integer))); 

ERROR: cannot cast type jsonb to integer 

के साथ-साथ:

create index test1 on documents using gin (cast(properties->>'publication_year' as integer)); 

ERROR: data type integer has no default operator class for access method "gin" 
HINT: You must specify an operator class for the index or define a default operator class for the data type.` 

मैंने इस पोस्ट से http://www.postgresql.org/message-id/[email protected] देखा है कि यह संभव होना चाहिए, लेकिन मैं सही वाक्यविन्यास नहीं समझ सकता।

जब मैं सिर्फ एक सरल सूचकांक कार्य करें:

create index test1 on documents using gin ((properties->'publication_year')); 

एक सूचकांक बनाया जाता है, लेकिन मैं एक सीमा चलते रहने के लिए पूर्णांक मूल्यों का उपयोग कर क्वेरी नहीं कर सकता है, यह कहना है

select count(*) from documents where properties->>'publication_year' = 2015; 
ERROR: operator does not exist: text = integer 
LINE 1: ...*) from documents where properties->>'publication_year' = 2015; 
          ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

किसी भी सुझाव और संकेतों की अत्यधिक सराहना की। मुझे यकीन है कि दूसरों को भी फायदा होगा। टीआईए

उत्तर

1

क्यों आप पूरे jsonb के लिए एक सूचकांक को परिभाषित नहीं करते क्षेत्र, as described in the doc?

create index test1 on documents using gin (properties); 
+0

धन्यवाद - मुझे लगता है कि यह वह जवाब है जिसे मैं चाहता था। भले ही दस्तावेज़ इसे निर्दिष्ट नहीं करते हैं, फिर भी आप इस समाधान के साथ सीएएसटी का उपयोग सीमा परिणाम प्राप्त करने के लिए कर सकते हैं, जैसा कि: 'एक्सप्लान विश्लेषण का चयन करें COUNT (*) दस्तावेजों से जहां (गुण - >>' प्रकाशन_यियर 'पूर्णांक के रूप में)> 2012 और कास्ट (गुण - >> 'publication_year' एएस पूर्णांक) <2016; –

+0

मुझे यकीन नहीं है, अगर इसका उपयोग कर इस पर प्रदर्शन पर असर पड़ेगा (जो मुझे लगता है कि लक्ष्य है)। दस्तावेज़ के अनुसार - "- >>" ऑपरेटर इस प्रकार के सूचकांक द्वारा समर्थित नहीं है। इसके अलावा - आप 'x> ए और एक्स <बी' को 'एक्स और बी' के बीच 'x' में जोड़ सकते हैं – murison

2

1) पूर्णांक के लिए कोई जीआईएन इंडेक्स नहीं है (कम से कम बॉक्स से बाहर नहीं), एक btree का उपयोग करें।

create index test1 on documents using btree (cast (properties->>'announced_on_year' as int)); 

2) त्रुटि सुंदर आत्म व्याख्यात्मक है, पाठ के रूप में पूर्णांक डाली या तुलना के लिए पाठ का उपयोग करें:

select count(*) from documents where properties->>'publication_year' = '2015'; 
+0

धन्यवाद, यह सहायक है, लेकिन यह मेरी मुख्य समस्या का समाधान नहीं करता है: श्रेणी पूछताछ (शायद मुझे और स्पष्ट होना चाहिए था)। अंतिम लक्ष्य कुछ रिकॉर्ड ढूंढने जैसा कुछ है जहां 'publication_year' है> 2012 और <2016. –

+0

@WillKessler आप इसे बी-पेड़ इंडेक्स के साथ कर सकते हैं। आपने कोशिश की है? –

+0

मैंने कोशिश की थी, लेकिन सही सवाल नहीं मिल रहा था। लेकिन अब आपकी मदद और मूरिसन के साथ, मुझे यह मिल गया है, ऊपर टिप्पणी को मूरिसन की प्रतिक्रिया देखें। हालांकि आपकी सहायता के लिए धन्यवाद। –

1

आप पूर्णांक के रूप में डाले जा सकते हैं और contrib/btree_gin एक्सटेंशन का उपयोग कर सकते हैं।

create extension btree_gin; 
create index tt_jb_int_idx on tt using gin(cast (jb->>'price' as int)); 
explain analyze select * from tt where cast(jb->>'price' as int) > 3 and cast(jb->>'price' as int) > 'price'::text))::integer > 3) AND (((jb ->> 'price'::text))::integer Bitmap Index Scan on tt_jb_int_idx (cost=0.00..28.06 rows=6 width=0) (actual time=0.016..0.016 rows=1 loops=1) 
     Index Cond: ((((jb ->> 'price'::text))::integer > 3) AND (((jb ->> 'price'::text))::integer
2

मुझे अपने अनुभवों में मिला है कि जेएसओएनबी कॉलम पर जीआईएन इंडेक्स का उपयोग तेजी से नहीं था। तुम बस एक पूर्णांक

CREATE INDEX test1 ON documents ((properties->>'publication_year')::int); 

करने के लिए इसे कास्टिंग द्वारा एक सामान्य सूचकांक बना सकते हैं इसके अलावा, जिन कुछ limitations कि बनाने से पहले विचार किया जाना चाहिए है। यहां तक ​​कि पूरे JSONB कॉलम को अनुक्रमणित करने से बड़े पैमाने पर टेबल आकार के इंडेक्स हो सकते हैं।

यह मेरे अनुभव पर आधारित है और पोस्टग्रेस दस्तावेज़ों को देख रहा है।

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