एक "टेक्स्ट इंडेक्स" और खोज जब तक आप संपूर्ण शब्दों की खोज कर रहे हैं, तब तक यह वास्तव में सबसे अच्छा विकल्प है।
अपनी स्कीमा परिभाषा में टेक्स्ट इंडेक्स जोड़ना काफी सरल है:
BookSchema.index(
{
"name": "text",
"description": "text",
"body": "text"
},
{
"weights": {
"name": 5,
"description": 2
}
}
)
यह आपको फ़ील्ड के लिए "सेट" वेटिंग के साथ सरल खोज करने की अनुमति देता है:
Book.find({ "$text": { "$search": "Holiday School Year" } })
.select({ "score": { "$meta": "textScore" } })
.sort({ "score": { "$meta": "textScore" } })
.exec(function(err,result) {
}
);
जहां मिलान किए गए प्रत्येक शब्द को उस क्षेत्र के विरुद्ध माना जाएगा जिसमें वह पाया गया था जिसमें सबसे अधिक वजन और घटनाओं की संख्या होती है।
भार निर्दिष्ट करना "सूचकांक" से जुड़ा हुआ है, इसलिए परिभाषा एक बार की जाती है और इसे बदला नहीं जा सकता है। एक और सीमा यह है कि "पाठ्य खोज" में "आंशिक" शब्दों को नहीं देखा जाता है। उदाहरण के लिए "ci" "City" या "Citizen" से मेल नहीं खाता, और ऐसी चीज़ के लिए आपको इसके बजाय एक रेगुलर एक्सप्रेशन की आवश्यकता होगी।
यदि आपको इससे अधिक लचीलेपन की आवश्यकता है या आम तौर पर परिणामों के भार को गतिशील रूप से बदलने में सक्षम होना चाहिए तो आपको एकत्रीकरण ढांचे या मैपरेडस जैसी किसी चीज़ की आवश्यकता है।
हालांकि एग्रीगेशन फ्रेमवर्क "लॉजिकल" मैच ऑपरेशन (यह $match
. के बावजूद फ़िल्टर कर सकता है ऑपरेटर, लेकिन आपकी शर्तों के लिए "रेगुलर एक्सप्रेशन" का "तार्किक" मिलान नहीं)। यदि यह उपयुक्त हो तो आप एकल शब्दों और "सटीक" मिलानों के साथ काम कर सकते हैं।
Book.aggregate(
[
{ "$match": {
"$or": [
{ "name": /Holiday/ },
{ "description": /Holiday/ },
{ "body": /Holiday/ }
]
}},
{ "$project": {
"name": 1,
"description": 1,
"body": 1,
"score": {
"$add": [
{ "$cond": [{ "$eq": [ "$name", "Holiday" ] },5,0 ] },
{ "$cond": [{ "$eq": [ "$description", "Holiday" ] },2,0 ] },
{ "$cond": [{ "$eq": [ "$body", "Holiday" ] },1,0 ] }
]
}
}},
{ "$sort": { "score": -1 } }
],
function(err,results) {
}
)
एक एकत्रीकरण पाइपलाइन के रूप में क्वेरी करने के लिए एक डेटा संरचना का उपयोग करता है जहां आप वर्तमान में जो कुछ भी आपको चाहिए, उस पर वजन के लिए मापदंडों को बदल सकते हैं।
MapReduce एक समान सिद्धांत साझा करता है, जहां आप प्रमुख तत्व के रूप में उत्सर्जित प्राथमिक कुंजी के हिस्से में एक परिकलित "स्कोर" शामिल कर सकते हैं। MapReduce स्वाभाविक रूप से इस कुंजी द्वारा उत्सर्जित सभी इनपुट को कम करने वाले फ़ंक्शन को खिलाने के लिए अनुकूलन के रूप में सॉर्ट करता है। हालांकि आप इस तरह के परिणाम को आगे क्रमबद्ध या "सीमित" नहीं कर सकते।
आम तौर पर ये आपके विकल्प होते हैं जिन्हें आप देख सकते हैं और तय कर सकते हैं कि आपके मामले में सबसे उपयुक्त कौन सा है।