2016-12-06 9 views
6

अंकचेक प्रत्येक शब्द डेटाबेस

मैं अगर एक स्ट्रिंग के प्रत्येक शब्द प्रत्येक शब्द के लिए एक MongoDB संग्रह खोज के द्वारा की वर्तनी सही है जांच करने की जरूरत में मौजूदा रहा है।

  1. डीबी क्वेरी की एक न्यूनतम राशि
  2. प्रत्येक वाक्य के पहले शब्द अपर केस में होना चाहिए करने से है, लेकिन इस शब्द शब्दकोश में अपर या लोअर केस हो सकता है। इसलिए मुझे प्रत्येक शब्द के लिए केस संवेदनशील मिलान की आवश्यकता है। प्रत्येक वाक्य का केवल पहला शब्द संवेदनशील होना चाहिए।

नमूना स्ट्रिंग

This is a simple example. Example. This is another example. 

शब्दकोश संरचना

मान लें इस

{ word: 'this' }, 
{ word: 'is' }, 
{ word: 'a' }, 
{ word: 'example' }, 
{ word: 'Name' } 

मेरे मामले में की तरह एक शब्दकोश संग्रह है, इस में 100,000 शब्द हैं शब्दकोश। बेशक नाम अपर केस में जमा हो जाती, क्रिया लोअर केस जमा हो जाती है और इतने पर ...

अपेक्षित परिणाम

शब्द simple और another के रूप में वे मौजूदा नहीं कर रहे हैं 'गलत वर्तनी' शब्द के रूप में मान्यता दी जानी चाहिए डीबी में

सभी मौजूदा शब्दों के साथ एक सरणी इस मामले में होनी चाहिए: ['This', 'is', 'a', 'example']This ऊपरी मामला है क्योंकि यह वाक्य का पहला शब्द है; डीबी में इसे कम मामले this के रूप में संग्रहीत किया जाता है।

मेरे प्रयास अब तक (अद्यतन)

const sentences = string.replace(/([.?!])\s*(?= [A-Z])/g, '$1|').split('|'); 
let  search  = [], 
     words  = [], 
     existing, 
     missing; 

sentences.forEach(sentence => { 
    const w = sentence.trim().replace(/[^a-zA-Z0-9äöüÄÖÜß ]/gi, '').split(' '); 

    w.forEach((word, index) => { 
     const regex = new RegExp(['^', word, '$'].join(''), index === 0 ? 'i' : ''); 
     search.push(regex); 
     words.push(word); 
    }); 
}); 

existing = Dictionary.find({ 
    word: { $in: search } 
}).map(obj => obj.word); 

missing = _.difference(words, existing); 

समस्या

  1. असंवेदनशील मैचों ठीक से काम नहीं: /^Example$/i मुझे एक परिणाम दे देंगे। लेकिन existing में मूल लोअरकेस example पर जायेगा, जिसका अर्थ है Examplemissing -Array पर जाएगा। तो मामला असंवेदनशील खोज अपेक्षित के रूप में काम कर रहा है, लेकिन परिणाम सरणी में मिसमैच है। मुझे नहीं पता कि इसे कैसे हल किया जाए।
  2. कोड को अनुकूलित करना संभव है? जैसा कि मैंने दो forEach -loops और एक difference ... उपयोग कर रहा हूँ
+1

@Liam। हाँ यही है। (उल्का आवेदन)। टैग जोड़ा गया। – user3142695

+0

तो, असली समस्या ऊपरी/लोअरकेस मेल नहीं है? खोज में असंवेदनशील $ मामले के लिए – Derlin

+0

, http://stackoverflow.com/questions/27363000/mongo-in-query-with-case-insensitivity – Derlin

उत्तर

0

यह है कि कैसे मैं इस मुद्दे का सामना करना होता है: '।'

  • उपयोग regex (सहित अंतरिक्ष के बाद प्रत्येक शब्द पाने के लिए) एक सरणी में।

    var words = para.match(/(.+?)(\b)/g); //this expression is not perfect but will work 
    
  • अब ढूंढें() का उपयोग कर अपने संग्रह से सभी शब्दों को जोड़ें।आइए कहें कि उस सरणी का नाम शब्द ओफकॉल है।

  • अब जाँच करता है, तो शब्द या जिस तरह से आप चाहते हैं कर रहे हैं नहीं

    var prevWord= ""; //to check first word of sentence 
    
    words.forEach(function(word) { 
        if(wordsOfColl.toLowerCase().indexOf(word.toLowerCase()) !== -1) { 
         if(prevWord.replace(/\s/g, '') === '.') { 
          //this is first word of sentence 
          if(word[0] !== word[0].toUpperCase()) { 
          //not capital, so generate error 
          } 
         } 
         prevWord = word; 
        } else { 
         //not in collection, generate error 
        } 
    }); 
    

मैं परीक्षण नहीं किया यह इतना कुछ मुद्दा हो, तो मुझे टिप्पणी में हमें बताएं। या तुम्हारी कुछ आवश्यकता मुझे याद आई।

अद्यतन

प्रश्न के लेखक के रूप में सुझाव दिया है कि वह नहीं है ग्राहक पर पूरे संग्रह लोड करने के लिए, आप जो बजाय संग्रह का ग्राहक का उपयोग करने देने के शब्दों की एक सरणी देता है सर्वर पर एक विधि बना सकते हैं चाहते हैं ।

+0

मुझे नहीं लगता कि यह एक अच्छा तरीका है, क्योंकि मेरे संग्रह में 100,000 दस्तावेज़ हैं। सिर्फ एक दर्जन शब्दों की जांच करने के लिए 100,000 दस्तावेजों को लोड करने का अर्थ नहीं है ... – user3142695

+0

लेकिन यह सर्वर पर जांचने के लिए प्रत्येक शब्द भेजने या यहां तक ​​कि पूरी वाक्य को सर्वर पर भेजने के लिए बेहतर है। मुझे पता है कि 100K दस्तावेज़ क्लाइंट को धीमा कर देंगे लेकिन वे नहीं करेंगे। मिनिमोंगो (क्लाइंट का मोंगो) यदि आपके मामले में छोटे हैं तो दस्तावेज़ बहुत अधिक रिकॉर्ड कर सकते हैं। और आप उस मार्ग के लिए उस संग्रह की सदस्यता ले सकते हैं। –

+0

हम्म ... मुझे नहीं लगता कि सर्वर पर 10 वाक्यों को भेजने के बाद 100k दस्तावेज़ों की सदस्यता क्यों बेहतर होनी चाहिए। कृपया समझाएँ। – user3142695

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