में रेगेक्स स्ट्रिंग खोज को गति दें मैं एक प्राकृतिक भाषा शब्दकोश को लागू करने के लिए मोंगोडीबी का उपयोग करने की कोशिश कर रहा हूं। मेरे पास लेक्सम का संग्रह है, जिनमें से प्रत्येक में उप-दस्तावेज के रूप में कई शब्दफॉर्म हैं। इस तरह क्या एक भी शब्दिम लग रहा है:मोंगोडीबी
{
"_id" : ObjectId("51ecff7ee36f2317c9000000"),
"pos" : "N",
"lemma" : "skrun",
"gloss" : "screw",
"wordforms" : [
{
"number" : "sg",
"surface_form" : "skrun",
"phonetic" : "ˈskruːn",
"gender" : "m"
},
{
"number" : "pl",
"surface_form" : "skrejjen",
"phonetic" : "'skrɛjjɛn",
"pattern" : "CCCVCCVC"
}
],
"source" : "Mayer2013"
}
वर्तमान में मैं कुछ 4000 शब्दिम का एक संग्रह है, और इनमें से प्रत्येक औसतन कुछ 1000 wordforms की एक सूची है (करने के लिए विरोध के रूप में बस ऊपर 2)। इसका मतलब है कि संग्रह में मेरे पास 4,000,000 अद्वितीय शब्द रूप हैं, और मुझे उचित समय में उनके माध्यम से खोज करने में सक्षम होना चाहिए।
एक सामान्य क्वेरी इस प्रकार दिखाई देगा:
db.lexemes.find({"wordforms.surface_form":"skrejjen"})
मैं wordforms.surface_form
पर एक सूचकांक है, और यह खोज बहुत तेजी से है। हालांकि अगर मैं अपनी खोज में वाइल्डकार्ड रखना चाहता हूं, तो प्रदर्शन अबाध है। उदाहरण के लिए:
db.lexemes.find({"wordforms.surface_form":/skrej/})
में 5 मिनट से अधिक समय लगता है (जिस बिंदु पर मैंने प्रतीक्षा छोड़ दी)। जैसा कि in this question का उल्लेख किया गया है, इंडेक्स पर रेगेक्स-सर्च खराब माना जाता है। मुझे पता है कि regex खोजों में एंकर को helps a lot जोड़ना है, लेकिन यह मेरी खोज क्षमताओं को भी गंभीर रूप से सीमित करता है। यहां तक कि अगर मैं उस बलिदान को तैयार करने के इच्छुक हूं, तो मैंने देखा है कि प्रतिक्रिया समय अभी भी रेगेक्स के आधार पर बहुत भिन्न हो सकता है। क्वेरी
db.lexemes.find({"wordforms.surface_form":/^s/})
पूरा करने के लिए 35s लेता है।
वास्तव में मेरे पास अब तक के सबसे अच्छे परिणाम हैं जब मैं hint
का उपयोग कर इंडेक्स को बंद करता हूं। इस मामले में, चीजें काफी सुधार लगती हैं। यह प्रश्न:
db.lexemes.find({"wordforms.surface_form":/skrej/}).hint('_id_')
को पूरा करने के लिए लगभग 3s लगते हैं।
मेरा सवाल है, क्या मैं इन खोज परिणामों को बेहतर बनाने के लिए कुछ और कर सकता हूं? जैसा कि वे हैं, वे अभी भी थोड़ी धीमी हैं और मैं पहले से ही प्रदर्शन प्राप्त करने की उम्मीद में MySQL में माइग्रेट करने पर विचार कर रहा हूं। लेकिन मैं वास्तव में मोंगो की लचीलापन रखना और आरडीबीएमएस में सभी कठिन सामान्यीकरण से बचना चाहूंगा। कोई सुझाव? क्या आपको लगता है कि डीबी इंजन के बावजूद मैं कुछ धीमेपन में भाग जाऊंगा, इस डेटा डेटा की मात्रा के साथ?
मुझे मोंगो की नई text search सुविधा के बारे में पता है लेकिन इस मामले (टोकनिसेशन और स्टेमिंग) के फायदे मेरे मामले में प्रासंगिक नहीं हैं (मेरी भाषा का उल्लेख नहीं है)। यह स्पष्ट नहीं है कि टेक्स्ट खोज वास्तव में तेजी से रेगेक्स के किसी भी प्रकार का उपयोग करने से अधिक है।
सुझाव के लिए धन्यवाद! यह निश्चित रूप से बहुत सारी अनावश्यक जानकारी प्रस्तुत करता है और समग्र संग्रह को बड़ा कर देगा, हालांकि यदि यह खोज प्रतिक्रिया समय बढ़ाता है तो मैं इसे मान सकता हूं। मैं यह देखने के लिए कुछ परीक्षण चलाऊंगा कि यह मामला है और यहां एक अपडेट पोस्ट करें। –