2012-11-30 24 views
5

मैं एक मोंगोमैपर मॉडल पर खोज कार्यक्षमता प्रदान करने के लिए टायर और लोचदार खोज का उपयोग कर रहा हूं, जो रेल ऐप का हिस्सा है। मैं सिर्फ एक समस्या का सामना करना ठोकर खाई जहां इस मॉडल के लिए मैपिंग अपडेट किया जा रहा नहीं कर रहे थे जब मैं एक वातावरण निम्नलिखित विन्यास का उपयोग करता है (config/वातावरण/env_name.rb में) करने के लिए पुन: वितरित:एक मॉडल के लिए टायर/लोचदार खोज मैपिंग को पुनः लोड करना, जिसमें पहले से ही डेटा संग्रहीत किया गया है

config.cache_classes = true 

वर्ग अकेले didn पुन: लोड इस मुद्दे को ठीक करने के लिए प्रतीत नहीं होता है (शायद समझ में, नए मैपिंग मौजूदा डेटा के साथ असंगत नहीं हो सकता है?)। इसके बजाय मुझे निम्नलिखित करना पड़ा:

MyModel.index.delete 
<restart the app or reload the class> 
MyModel.index.import MyModel.all 

मुझे आश्चर्य हुआ कि क्या कोई बेहतर तरीका है)। मेरे मॉडल कोड में परिभाषित नवीनतम मैपिंग को प्रत्येक तैनाती के बाद elasticsearch द्वारा उपयोग किया जा रहा है लेकिन बी)। पूरी डेटासेट के साथ इंडेक्स को अनावश्यक रूप से दोबारा हटाने से बचें?

हम आम तौर पर शेफ का उपयोग करके तैनात करते हैं, इसलिए मैं तीन चरणों को स्वचालित कर सकता हूं जिन्हें मैंने बिना किसी परेशानी के सफलतापूर्वक उपयोग किया। लेकिन मैं लोचदार और टायर के लिए नया हूं इसलिए मैंने सोचा कि यह अत्यधिक संभावना है कि मैं दोनों का दुरुपयोग कर रहा हूं या चीजों को अनावश्यक रूप से कठिन बना रहा हूं।

उत्तर

5

युगल की कोशिश कर सकते हैं:

  • टायर सही मानचित्रण जब वर्ग भार
  • लेकिन टायर नहीं प्रयास करने के लिए करता है के साथ सूचकांक बनाने की कोशिश मॉडल के लिए इंडेक्स बनाएं जब यह पहले से मौजूद है

तो, आपका प्रश्न उचित वर्कफ़्लो के बारे में वास्तव में अधिक है? जब आप एप्लिकेशन का एक नया संस्करण तैनात करते हैं, तो आपको इंडेक्स को फिर से पॉप्युलेट नहीं करना चाहिए, वैसे ही आप किसी प्रकार के बैकअप से डेटाबेस को फिर से पॉप्युलेट नहीं करते हैं। (MyModel.tire.mapping साथ MyModel.tire.index.mapping तुलना,, आदि यदि अलग फिर से पॉप्युलेट)

स्वचालित रूप से मॉडल में वर्तमान परिभाषा के अनुरूप सूचकांक मैपिंग के लिए जाँच निश्चित रूप से संभव है, यह कुछ मैं ऐसा करने से सावधान हो जाएगा है।

डेवलपर आमतौर पर जानता है कि उसने मैपिंग बदल दी है और डेटा को फिर से अनुक्रमणित करना चाहिए। इंडेक्स को छोड़ना, और फिर से पॉप्युलेट करना भी खोज डाउनटाइम का मतलब है, और बड़े अनुप्रयोगों के लिए भी संभव नहीं है।

डेटा का आयात करते समय my-index-2012-12 जैसे विशिष्ट इंडेक्स नाम का उपयोग करने के लिए एक अच्छा समाधान है, और इस सूचकांक में my-index उपनाम इंगित करें। फिर आप इंडेक्स को स्वतंत्र रूप से फिर से पॉप्युलेट कर सकते हैं, और डाउनटाइम के बिना, उपनाम को फ़्लिप कर सकते हैं। टायर इस तरह के वर्कफ़्लो (रेक आयात कार्य, आदि) में आपको समर्थन देने के लिए कड़ी मेहनत करता है।

+0

संग्रहीत डेटा नहीं, मैं आपके पिछले अनुच्छेद से थोड़ा उलझन में था, मुझे समझ में नहीं आता कि आप शहर से बचने के लिए किसी अन्य इंडेक्स में उपनाम का उपयोग कैसे कर सकते हैं। परिदृश्य में आपने वर्णित किया है कि मेरी इंडेक्स के खिलाफ खोज नहीं करेगा, केवल मेरी इंडेक्स-2012-12 के खिलाफ चलने के दौरान इसे फिर से अनुक्रमित किया जाएगा? – concept47

+0

विवरण प्रतिक्रिया के लिए धन्यवाद। मैं इसे सही के रूप में चिह्नित करने जा रहा हूं, क्योंकि मुझे कोई विकल्प नहीं मिल रहा है। ऐसा लगता है कि उत्तर की जिंदगी है कि आपको अपने परिदृश्य में डेटा को दोबारा अनुक्रमणित करने की आवश्यकता होगी, और आप इस परिदृश्य में डाउनटाइम से बचने के लिए लोचदार खोज उपनाम का उपयोग कर सकते हैं।लोचदार खोज उपनामों पर अधिक जानकारी के साथ लिंक यहां दिया गया है: http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases.html टायर जिथब पेज अब इसके लिए लिंक करता है और इसमें इंडेक्स उपनामों पर जानकारी है – willjthomas

+0

@ concept47 टायर गिथब पेज के मुताबिक: आप अपने डेटा को एक नए इंडेक्स में इंडेक्स कर सकते हैं (और सब कुछ ठीक होने के बाद संभवतः उपनाम अपडेट करें)। तो आप मौजूदा इंडेक्स को फिर से नहीं बनाते हैं, आप एक नया संस्करण बनाते हैं और फिर उपनाम फ्लिप करते हैं। अगर मैं गलत हूं तो कृपया मुझे सही करें – willjthomas

0

आप यहाँ अंकों की इस Update elasticsearch settings via Tire

+1

refresh_interval आवृत्ति सेट करता है जो आप इंडेक्स में डेटा रीफ्रेश करते हैं, है ना? जो मुद्दा मैं कर रहा हूं वह इंडेक्स मैपिंग को अपडेट कर रहा है, – willjthomas