2016-07-05 7 views
15

मैं MongoDB उपयोग कर रहा हूँ, और मैं निम्नलिखित संरचना के साथ दस्तावेजों का संग्रह है:सूचकांक सीमा मोंगो पर Regex खोजें

{ 
    fName:"Foo", 
    lName:"Barius", 
    email:"[email protected]", 
    search:"foo barius" 
} 

मैं एक समारोह है कि search मैदान पर एक नियमित अभिव्यक्ति खोज प्रदर्शन करेंगे निर्माण कर रहा हूँ । प्रदर्शन को अनुकूलित करने के लिए, मैंने इस संग्रह को खोज क्षेत्र पर अनुक्रमित किया है। हालांकि, चीजें अभी भी धीमी हैं। इसलिए मैं कोई नमूना क्वेरी पर एक explain() भाग गया:

db.Collection.find({search:/bar/}).explain(); 

जीतने योजना के तहत देखते हुए, मैं देख रहा हूँ निम्नलिखित सूचकांक सीमा का इस्तेमाल किया:

"search": [ 
     "[\"\", {})", 
     "[/.*bar.*/, /.*bar.*/]" 
] 

दूसरे सेट समझ में आता है - यह कुछ भी होता है, जो से रहा है बार में कुछ भी है। हालांकि, पहला सेट मुझे परेशान करता है। ऐसा लगता है कि "" की सीमाओं में {} अनन्य शामिल है। मुझे चिंता है कि सीमाओं का यह अतिरिक्त सेट मेरी क्वेरी को धीमा कर रहा है। क्या यह रखना जरूरी है? यदि ऐसा नहीं है, तो मैं इसे शामिल होने से कैसे रोक सकता हूं?

+0

: यह रिक्त स्थान के आधार पर प्रत्येक शब्द अनुक्रमित, तो यह अधिक का उपयोग

यहाँ दोनों शब्द "foo" और "barius" है, जो हो सकता है पर एक अनुक्रमित खोज करने के लिए सक्षम हो जाएगा कि के लिये दस्तावेज है क्या आपको एक ही समस्या है, क्या आपको स्पष्टीकरण मिला? – kirhgoff

+0

@kirhgoff आप किस मोंगो डीबी का उपयोग कर रहे हैं? – barbakini

+0

@kirhgoff आप 'mongoDB देशी' या 'mongoose' का उपयोग कर रहे हैं। इसे देखें - http://voidcanvas.com/mongoose-vs-mongodb-native/ –

उत्तर

5

मुझे लगता है कि यह सिर्फ mongodb regex के साथ काम करता है (https://scalegrid.io/blog/mongodb-regular-expressions-indexes-performance/ देखें)। बस nscanned/कुल के लिए एक्साइमिनेटेड मान के लिए देखें, यदि यह बहुत बड़ा है तो सूचकांक आपकी क्वेरी के लिए बेकार है।

यह भी देखें: MongoDB, performance of query by regular expression on indexed fields

+0

सहमत हैं, जैसा कि मोंगोडीबी दस्तावेज में बताया गया है और https://stackoverflow.com/a/33219393 में/8291949 यदि आपका रेगेक्स "उपसर्ग अभिव्यक्ति" नहीं है तो मोंगो इंडेक्स में कुंजी स्कैन करेगा, फिर मिलान किए गए दस्तावेज़ों को प्राप्त करेगा (जो कि पूर्ण संग्रह स्कैन से अभी भी तेज़ होना चाहिए)। – wp78de

0

इस तरह मोंगो regex के इस प्रकार और एक सूचकांक के साथ काम करता है। मेरा मतलब यह है कि आप/^ बार/के बजाय/बार/खोज रहे हैं।

जब आप उस फ़ील्ड पर एक अनुक्रमणिका निर्दिष्ट करते हैं, तो यह पहले वर्ण से अनुक्रमणित होता है। तो "फू बैरियस" को एफ के साथ शुरू किया गया है। चूंकि आप फ़ील्ड में कहीं भी "बार" खोज रहे हैं, आपको उस फ़ील्ड पर पूरे इंडेक्स को * बार * दिखाना होगा।

आपकी व्याख्या में पहली पंक्ति इंडेक्स में प्रत्येक रिकॉर्ड को देखती है।

दूसरी पंक्ति कहती है, मुझे केवल उन इंडेक्स दें (1) जिनमें बार है।

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

एक अभ्यास के रूप में/^ बार/इसके बजाय एक व्याख्या करते हैं। आपको अपना डेटा नहीं मिलेगा, लेकिन पहली अनुक्रमणिका सीमा कुछ/^ बार/से/^ बेस/जैसी होगी।

मुझे आशा है कि चेतना के उत्तर की मेरी धारा सहायक होगी।

यूडीयूडी

-1

सोचा कि मैं अपने दो सेंट जोड़ूंगा।

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

एक और प्रकार की अनुक्रमणिका है जो आपकी स्थिति में उपयोगी हो सकती है। मोंगो की टेक्स्ट इंडेक्स। https://docs.mongodb.com/manual/core/index-text/

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