सबसे पहले, यहाँ बनाने के लिए एक महत्वपूर्ण अंतर है:MongoDB एक सामान्य उद्देश्य डेटाबेस है, Elasticsearch एक वितरित पाठ खोज इंजन है जो Lucene द्वारा समर्थित है। लोग इलास्टिक्स खोज को एक सामान्य प्रयोजन डेटाबेस के रूप में उपयोग करने के बारे में बात कर रहे हैं, लेकिन जानते हैं कि यह इसका मूल डिज़ाइन नहीं था। मुझे लगता है कि सामान्य उद्देश्य NoSQL डेटाबेस और खोज इंजन समेकन के लिए नेतृत्व कर रहे हैं, लेकिन जैसा कि यह खड़ा है, दोनों दो अलग-अलग शिविरों से आते हैं।
हम अपनी कंपनी में MongoDB और Elasticsearch दोनों का उपयोग कर रहे हैं। हम अपने डेटा को MongoDB में संग्रहीत करते हैं और इसकी 'पूर्ण-पाठ खोज क्षमताओं के लिए विशेष रूप से Elasticsearch का उपयोग करते हैं। हम केवल मोंगो डेटा फ़ील्ड का एक सबसेट भेजते हैं, जिसे हमें इलास्टिक से क्वेरी करने की आवश्यकता होती है। हमारे उपयोग का मामला आपके से अलग है कि हमारा मोंगो डेटा हर समय बदलता है:एक रिकॉर्ड, या किसी रिकॉर्ड के फ़ील्ड का सबसेट, दिन में कई बार अपडेट किया जा सकता है और यह उस रिकॉर्ड को इलास्टिक में पुन:अनुक्रमणित करने के लिए कह सकता है। केवल इसी कारण से, इलास्टिक को एकमात्र डेटा स्टोर के रूप में उपयोग करना हमारे लिए अच्छा विकल्प नहीं है, क्योंकि हम चुनिंदा फ़ील्ड को अपडेट नहीं कर सकते हैं; हमें किसी दस्तावेज़ को उसकी संपूर्णता में फिर से अनुक्रमित करने की आवश्यकता होगी। यह एक लोचदार सीमा नहीं है, इस प्रकार लुसीन काम करता है, लोचदार के पीछे अंतर्निहित खोज इंजन। आपके मामले में, तथ्य यह है कि एक बार संग्रहीत होने के बाद रिकॉर्ड नहीं बदले जाएंगे, आपको वह विकल्प चुनने से बचाता है। यह कहते हुए कि, यदि डेटा सुरक्षा एक चिंता का विषय है, तो मैं आपके डेटा के लिए एकमात्र संग्रहण तंत्र के रूप में Elasticsearch का उपयोग करने के बारे में दो बार सोचूंगा। यह किसी समय वहां पहुंच सकता है लेकिन मुझे यकीन नहीं है कि यह वहां है।
गति के संदर्भ में, न केवल लोचदार/लुसीन मोंगो की पूछताछ गति के बराबर है, आपके मामले में जहां "किसी भी क्षण फ़िल्टरिंग के लिए किस फ़ील्ड का उपयोग किया जाता है" के संदर्भ में बहुत कम स्थिर है, यह आदेश हो सकता है परिमाण तेजी से, खासकर जब डेटासेट बड़े हो जाते हैं। अंतर अंतर्निहित क्वेरी कार्यान्वयन में निहित है:
- इलास्टिक/ल्यूसीन सूचना पुनर्प्राप्ति के लिए वेक्टर स्पेस मॉडल और इनवर्टेड इंडेक्स का उपयोग करते हैं, जो एक क्वेरी के खिलाफ रिकॉर्ड समानता की तुलना करने के अत्यधिक कुशल तरीके हैं। जब आप इलास्टिक/लुसीन को क्वेरी करते हैं, तो यह पहले से ही उत्तर जानता है; इसका अधिकांश कार्य आपके लिए परिणामों को आपकी क्वेरी शर्तों से मेल खाने की सबसे अधिक संभावना वाले परिणामों की रैंकिंग में निहित है। यह एक महत्वपूर्ण बिंदु है:खोज इंजन, डेटाबेस के विपरीत, आपको सटीक परिणामों की गारंटी नहीं दे सकते; वे परिणामों को इस आधार पर रैंक करते हैं कि वे आपकी क्वेरी के कितने करीब हैं। ऐसा ही होता है कि ज्यादातर बार, परिणाम सटीक के करीब होते हैं।
- मोंगो का दृष्टिकोण अधिक सामान्य प्रयोजन डेटा स्टोर का है; यह एक दूसरे के खिलाफ JSON दस्तावेज़ों की तुलना करता है। आप हर तरह से इसका शानदार प्रदर्शन प्राप्त कर सकते हैं, लेकिन आपके द्वारा चलाए जा रहे प्रश्नों से मेल खाने के लिए आपको अपनी अनुक्रमणिका को सावधानीपूर्वक तैयार करने की आवश्यकता है। विशेष रूप से, यदि आपके पास कई फ़ील्ड हैं जिनके द्वारा आप क्वेरी करेंगे, तो आपको अपनी कंपाउंड कुंजियों को सावधानीपूर्वक तैयार करने की आवश्यकता है ताकि वे उस डेटासेट को कम कर दें जिसे जितनी जल्दी हो सके क्वेरी किया जाएगा। उदा. आपकी पहली कुंजी को आपके अधिकांश डेटासेट को फ़िल्टर करना चाहिए, आपकी दूसरी को आगे जो कुछ बचा है उसे फ़िल्टर करना चाहिए, और इसी तरह आगे और आगे। यदि आपके प्रश्न परिभाषित इंडेक्स में कुंजियों और उन चाबियों के क्रम से मेल नहीं खाते हैं, तो आपका प्रदर्शन काफी कम हो जाएगा। दूसरी ओर, मोंगो एक सच्चा डेटाबेस है, इसलिए यदि सटीकता वही है जो आपको चाहिए, तो यह जो उत्तर देगा वह हाजिर होगा।
पुराने रिकॉर्ड को समाप्त करने के लिए, इलास्टिक में एक अंतर्निहित टीटीएल सुविधा है। मोंगो ने अभी इसे संस्करण 2.2 के रूप में पेश किया है जो मुझे लगता है।
चूँकि मैं आपकी अन्य आवश्यकताओं जैसे अपेक्षित डेटा आकार, लेन-देन, सटीकता या आपके फ़िल्टर कैसा दिखाई देगा, यह नहीं जानता, इसलिए कोई विशिष्ट अनुशंसा करना कठिन है। उम्मीद है, आपको आरंभ करने के लिए यहां पर्याप्त है।