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

MongoDB में टेक्स्ट इंडेक्स कैसे बनाएं

आप MongoDB में विभिन्न प्रकार के इंडेक्स बना सकते हैं। यदि आपके पास कोई फ़ील्ड है जिसमें स्ट्रिंग या स्ट्रिंग्स की एक सरणी है, तो आप text . का उपयोग कर सकते हैं उस फ़ील्ड पर अनुक्रमणिका।

एक text बनाने के लिए अनुक्रमणिका, स्ट्रिंग शाब्दिक "text" . का उपयोग करें इसे बनाते समय मूल्य के रूप में।

एकल फ़ील्ड पर टेक्स्ट इंडेक्स बनाएं

मान लीजिए हमारे पास posts . नामक संग्रह है , और इसमें इस तरह के दस्तावेज़ शामिल हैं:

{
	"_id" : 1,
	"title" : "The Web",
	"body" : "Body text...",
	"abstract" : "Abstract text..."
}

हम एक text बनाना चाह सकते हैं body . पर इंडेक्स करें फ़ील्ड, या abstract फ़ील्ड, या दोनों भी।

यहां text बनाने का तरीका बताया गया है body . पर इंडेक्स करें फ़ील्ड:

db.posts.createIndex( { body : "text" } )

आउटपुट:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

अब हम getIndexes() . का उपयोग कर सकते हैं सूचकांक देखने की विधि:

db.posts.getIndexes()

परिणाम:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "body_text",
		"weights" : {
			"body" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

हम देख सकते हैं कि दो सूचकांक हैं। पहला डिफ़ॉल्ट है _id अनुक्रमणिका जो संग्रह के साथ स्वचालित रूप से बनाई जाती है। दूसरा इंडेक्स वह है जिसे हमने अभी बनाया है।

MongoDB ने स्वचालित रूप से हमारे नए बनाए गए इंडेक्स को एक नाम दिया है। इसे कहते हैं body_text

एक कंपाउंड टेक्स्ट इंडेक्स बनाएं

एक संग्रह में केवल एक text हो सकता है सूचकांक, लेकिन यदि आवश्यक हो तो यह एक मिश्रित सूचकांक हो सकता है।

आइए एक कंपाउंड इंडेक्स बनाएं जिसमें body . शामिल हो फ़ील्ड और abstract फ़ील्ड.

जैसा कि उल्लेख किया गया है, एक संग्रह में केवल एक text हो सकता है अनुक्रमणिका, तो चलिए अभी-अभी बनाई गई अनुक्रमणिका को छोड़ते हैं:

db.posts.dropIndex("body_text")

आउटपुट:

{ "nIndexesWas" : 2, "ok" : 1 }

ठीक है, अब जबकि हमने text को छोड़ दिया है इंडेक्स, आइए आगे बढ़ते हैं और एक और बनाते हैं - इस बार यह एक कंपाउंड इंडेक्स होगा:

db.posts.createIndex( { 
  body : "text",
  abstract : "text"
} )

आउटपुट:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

यह एक पुष्टिकरण संदेश है जो हमें बताता है कि पहले 1 इंडेक्स हुआ करता था लेकिन अब 2 हैं।

आइए फिर से अनुक्रमणिका की सूची देखें:

db.posts.getIndexes()

परिणाम:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "body_text_abstract_text",
		"weights" : {
			"abstract" : 1,
			"body" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

ध्यान दें कि कंपाउंड text अनुक्रमणिका में निम्नलिखित प्रतिबंध हैं:

  • एक यौगिक text अनुक्रमणिका में कोई अन्य विशेष अनुक्रमणिका प्रकार शामिल नहीं हो सकते हैं, जैसे बहु-कुंजी या भू-स्थानिक अनुक्रमणिका फ़ील्ड।
  • यदि यौगिक text अनुक्रमणिका में text . से पहले की कुंजियाँ शामिल हैं इंडेक्स कुंजी, $text करने के लिए खोज, क्वेरी विधेय में पूर्ववर्ती कुंजियों पर समानता मिलान की स्थिति शामिल होनी चाहिए।
  • कंपाउंड बनाते समय text अनुक्रमणिका, सभी text अनुक्रमणिका कुंजियों को अनुक्रमणिका विनिर्देश दस्तावेज़ में साथ में सूचीबद्ध किया जाना चाहिए।

वाइल्डकार्ड टेक्स्ट इंडेक्स बनाएं

आप वाइल्डकार्ड $** . का उपयोग करके वाइल्डकार्ड टेक्स्ट इंडेक्स बना सकते हैं फ़ील्ड पैटर्न।

आइए पिछले इंडेक्स को छोड़ दें और वाइल्डकार्ड टेक्स्ट इंडेक्स बनाएं:

db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )

MongoDB हमें वाइल्डकार्ड इंडेक्स बनाने की क्षमता भी प्रदान करता है, हालांकि वाइल्डकार्ड टेक्स्ट इंडेक्स और वाइल्डकार्ड इंडेक्स दो अलग-अलग चीजें हैं।

विशेष रूप से, वाइल्डकार्ड टेक्स्ट इंडेक्स $text . का समर्थन करते हैं ऑपरेटर, जबकि वाइल्डकार्ड इंडेक्स नहीं करते हैं।

weights पैरामीटर

text बनाते समय अनुक्रमणिका, आपके पास एक या अधिक फ़ील्ड पर भार निर्दिष्ट करने का विकल्प होता है। डिफ़ॉल्ट रूप से, प्रत्येक फ़ील्ड को 1 का भार दिया जाता है। लेकिन खोज परिणामों में फ़ील्ड को कम या ज्यादा महत्व देने के लिए आप इसे बदल सकते हैं।

उदाहरण

db.posts.dropIndex("$**_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 . के महत्व का दस गुना फ़ील्ड.

एकाधिक भाषा टेक्स्ट इंडेक्स बनाना

आप देखेंगे कि ऊपर दिया गया text अनुक्रमणिका में शामिल हैं "default_language" : "english" और "language_override" : "language" इसकी परिभाषा में।

ये क्षेत्र कई भाषाओं में दस्तावेजों से निपटने में सहायता करते हैं। उपरोक्त अनुक्रमणिका में मान डिफ़ॉल्ट मान हैं।

जब आप कोई दस्तावेज़ बनाते हैं, तो आप language . का उपयोग करके उस दस्तावेज़ की भाषा निर्दिष्ट कर सकते हैं फ़ील्ड (या language_override . में परिभाषित कोई अन्य फ़ील्ड text . का क्षेत्र अनुक्रमणिका)। यदि ऐसा कोई फ़ील्ड दस्तावेज़ में मौजूद नहीं है, तो यह default_language में निर्दिष्ट डिफ़ॉल्ट भाषा का उपयोग करेगा फ़ील्ड.

आप एक default_language निर्दिष्ट कर सकते हैं (और language_override ) जब आप index.

कई भाषाओं का समर्थन करने वाले टेक्स्ट इंडेक्स बनाने के उदाहरणों के लिए MongoDB में एक बहु-भाषा टेक्स्ट इंडेक्स बनाएं देखें।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. एक सरणी के भीतर एक दस्तावेज़ को हटाने (खींचने) नेवला, ObjectID के साथ काम नहीं करता है

  2. MongoDB $weeklyUpdate #65 (अप्रैल 15, 2022):GDELT, Mongoose, और Hackathon Time!

  3. यूरोपीय संघ के क्षेत्र में AWS पर भौगोलिक रूप से वितरित MongoDB क्लस्टर

  4. MongoDB संग्रह के अंदर एक विशिष्ट एम्बेडेड दस्तावेज़ कैसे प्राप्त करें?

  5. कई क्षेत्रों पर Node.js और नेवला रेगेक्स क्वेरी