MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB:एक पाठ खोज कैसे करें और एक तिथि के अनुसार क्रमबद्ध करें

अन्य यौगिक अनुक्रमणिका कुंजियों के बावजूद, आपको शामिल करना होगा $मेटा सही छँटाई पाने के लिए "textScore" के लिए:

db.collection.find(
    { "$text": { "$search": "\"example@sqldat.com\""}},
    { "score": { "$meta": "textScore" } }
).sort({
    "score": { "$meta": "textScore" }, "Date": 1
})

तो स्वाभाविक रूप से आप चाहते हैं कि "स्कोर" पहले क्रमबद्ध हो, और फिर "तारीख" के अनुसार खोज की प्रासंगिकता के आधार पर चीजों को सही ढंग से रैंक किया जा सके।

अनुक्रमणिका का क्रम कोई मायने नहीं रखता, लेकिन निश्चित रूप से आपके पास "एक" टेक्स्ट इंडेक्स हो सकता है। इसलिए सुनिश्चित करें कि आप बनाने से पहले अन्य सभी को छोड़ दें:

db.collection.createIndex({ 
   "From": "text",
   "To": "text",
   "CC":"text", 
   "BCC": "text", 
   "Date":1
})

ऐसे इंडेक्स देखें जो इसके साथ चालू हों:

db.collection.getIndicies()

या बस सब कुछ छोड़ दें और नई शुरुआत करें:

db.collection.dropIndexes()

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

{
    "TO": ["example@sqldat.com"],
    "FROM": ["example@sqldat.com"],
    "CC": ["example@sqldat.com","example@sqldat.com"],
    "BCC": [],
    "Date": ISODate("2015-07-27T13:42:05.535Z")
}

फिर आपको प्रत्येक फ़ील्ड पर अलग-अलग इंडेक्स की आवश्यकता होती है, संभवतः "दिनांक" के साथ कंपाउंड में:

db.email.createIndex({ "TO": 1, "Date": 1 })
db.email.createIndex({ "FROM": 1, "Date": 1 })
db.email.createIndex({ "CC": 1, "Date": 1 })
db.email.createIndex({ "BCC": 1, "Date": 1 })

और $or के साथ क्वेरी करें शर्त:

db.email.find({
    "$or": [
        { "TO": "example@sqldat.com" },
        { "FROM": "example@sqldat.com" },
        { "CC": "example@sqldat.com" },
        { "BCC": "example@sqldat.com" }
    ],
    "Date": { "$lt": new Date() }
})

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

टेक्स्ट खोजों के "फजी मिलान" की तुलना में यह आपके लिए बहुत बेहतर होगा। यहां तक ​​कि रेगुलर एक्सप्रेशन भी यहां सामान्य रूप से बेहतर काम करना चाहिए (ई-मेल पतों के लिए) और विशेष रूप से यदि वे "एंकर" हैं ^ स्ट्रिंग की शुरुआत में।

टेक्स्ट इंडेक्स "शब्द जैसे टोकन" से मेल खाने के लिए हैं, लेकिन यह आपका डेटा नहीं होना चाहिए। $या अच्छा नहीं दिखता है, लेकिन इसे बहुत बेहतर काम करना चाहिए।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. सेलजेएस v0.10 का उपयोग करके मोंगोडब से कैसे जुड़ें?

  2. mongodb एक मूल्य से संपूर्ण दस्तावेज़ प्राप्त करें

  3. मोंगोज़ मॉडल सेव मेथड का मज़ाक उड़ाना/स्टब करना

  4. MongoDb csharp ड्राइवर का उपयोग करके टाइप बदलने पर फ़ील्ड को डिसेरिएलाइज़ करना

  5. एक छोटे .NET अनुप्रयोग के लिए डेटाबेस का एक अच्छा विकल्प क्या है?