जब आप एक text
बनाते हैं MongoDB में अनुक्रमणिका, आपके पास प्रत्येक अनुक्रमित फ़ील्ड में अलग-अलग भार लागू करने का विकल्प होता है।
ये भार एक दूसरे के लिए अनुक्रमित क्षेत्रों के सापेक्ष महत्व को दर्शाते हैं। कम वज़न वाले फ़ील्ड की तुलना में अधिक वज़न वाले फ़ील्ड का खोज परिणामों में अधिक प्रभाव पड़ेगा।
यह आपको खोज परिणामों की गणना के तरीके पर एक निश्चित मात्रा में नियंत्रण प्रदान करता है।
डिफ़ॉल्ट वज़न 1 है, इसलिए यदि आप फ़ील्ड के लिए वज़न निर्दिष्ट नहीं करते हैं, तो इसे 1 का वज़न दिया जाएगा।
उदाहरण
मान लीजिए हमारे पास posts
. नामक संग्रह है , और इसमें इस तरह के दस्तावेज़ शामिल हैं:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
हम एक कंपाउंड text
. बना सकते हैं तीन टेक्स्ट फ़ील्ड को इंडेक्स करें और हर एक पर अलग-अलग वज़न लागू करें।
इस तरह:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
जब मैंने कंपाउंड text
. बनाया अनुक्रमणिका, मैंने 3 फ़ील्ड निर्दिष्ट किए हैं। जब मैंने भार निर्दिष्ट किया, तो मैंने उनमें से केवल दो क्षेत्रों के लिए भार निर्दिष्ट किया।
नतीजा यह है कि उन दो क्षेत्रों को निर्दिष्ट के रूप में भारित किया जाएगा, और अन्य फ़ील्ड (title
) का डिफ़ॉल्ट भार 1 होगा।
हम इसे तब देख सकते हैं जब हम getIndexes()
run चलाते हैं :
db.posts.getIndexes()
परिणाम:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "title_text_body_text_abstract_text", "weights" : { "abstract" : 5, "body" : 10, "title" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
इसका मतलब है कि body
फ़ील्ड का महत्व abstract
. से दोगुना होगा फ़ील्ड, और title
. के महत्व का दस गुना फ़ील्ड.
भारित फ़ील्ड के साथ वाइल्डकार्ड टेक्स्ट इंडेक्स
वाइल्डकार्ड टेक्स्ट इंडेक्स बनाते समय आप वेट लागू कर सकते हैं। वाइल्डकार्ड टेक्स्ट इंडेक्स तब काम आ सकते हैं जब आप नहीं जानते कि टेक्स्ट फ़ील्ड दस्तावेज़ों में क्या होने जा रहे हैं। आप कुछ को जान सकते हैं , लेकिन सभी नहीं।
ऐसे मामलों में, आप एक वाइल्डकार्ड टेक्स्ट इंडेक्स बना सकते हैं, और उन फ़ील्ड्स को वेट असाइन कर सकते हैं जिनके बारे में आप जानते हैं। किसी अन्य फ़ील्ड को 1 का डिफ़ॉल्ट मान असाइन किया जाएगा।
मान लीजिए कि हमारे पास दिशानिर्देश के रूप में निम्नलिखित दस्तावेज हैं:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
यह पिछले दस्तावेज़ के समान है, सिवाय इसके कि इसमें अब tags
है फ़ील्ड जिसमें एक सरणी है। लेकिन हम सभी जानते हैं कि उस संग्रह के भविष्य के दस्तावेज़ों में अन्य फ़ील्ड हो सकते हैं - जैसे शायद categories
, keywords
, author_bio
, आदि
लेकिन हम वास्तव में नहीं जानते हैं, इसलिए हम एक वाइल्डकार्ड टेक्स्ट इंडेक्स बनाएंगे जो स्ट्रिंग डेटा के साथ सभी फ़ील्ड को एनकैप्सुलेट करेगा। और हम कुछ ज्ञात क्षेत्रों के लिए वेटिंग तैयार करेंगे।
उदाहरण:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
इस मामले में, body
फ़ील्ड को 10
. का भार मिलता है और abstract
फ़ील्ड को 5
. का भार मिलता है . इसका मतलब है कि body
फ़ील्ड में एब्सट्रैक्ट फ़ील्ड का प्रभाव दोगुना है, और अन्य सभी टेक्स्ट फ़ील्ड के प्रभाव का दस गुना है (क्योंकि उन्हें 1 का डिफ़ॉल्ट भार सौंपा जाएगा)।
उस इंडेक्स को बनाने के बाद, अगर हम getIndexes()
. को कॉल करते हैं , हम खेतों को दिए गए भारों को देख सकते हैं:
db.posts.getIndexes()
परिणाम:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "$**_text", "weights" : { "$**" : 1, "abstract" : 5, "body" : 10 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
जैसी अपेक्षित थी, body
फ़ील्ड को 10
मिलता है , abstract
फ़ील्ड को 5
मिलता है , और अन्य सभी को 1
. मिलता है ।