टेक्स्ट खोज का इस्तेमाल करना

Cloud Firestore में टेक्स्ट खोजने की सुविधाओं का इस्तेमाल करके, किसी कलेक्शन में मौजूद खास स्ट्रिंग खोजें.

शुरू करने से पहले

टेक्स्ट क्वेरी का इस्तेमाल शुरू करने से पहले, यह काम करें:

  1. पक्का करें कि आपके पास MongoDB के साथ काम करने वाले किसी मौजूदा डेटाबेस का ऐक्सेस हो या कोई डेटाबेस बनाएं और उससे कनेक्ट करें.

  2. पक्का करें कि आपके पास टेक्स्ट इंडेक्स हो या टेक्स्ट इंडेक्स बनाएं.

IAM अनुमतियां

Cloud Firestore में इंडेक्स बनाने के लिए, पक्का करें कि आपको इनमें से कोई भूमिका असाइन की गई हो:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

भूमिका असाइन करने के लिए, कोई भूमिका असाइन करना लेख पढ़ें. Cloud Firestore भूमिकाओं और उनसे जुड़ी अनुमतियों के बारे में ज़्यादा जानने के लिए, पहले से तय की गई भूमिकाएं लेख पढ़ें.

अगर आपने कस्टम भूमिकाएं तय की हैं, तो इंडेक्स बनाने के लिए, ये सभी अनुमतियां असाइन करें:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

टेक्स्ट क्वेरी चलाना

टेक्स्ट क्वेरी में, फ़िल्टर के अंदर $text ऑपरेटर का इस्तेमाल किया जाता है. $search आर्ग्युमेंट में क्वेरी की गई स्ट्रिंग डालें.

सामान्य टेक्स्ट क्वेरी चलाना

सामान्य क्वेरी करने के लिए, यह क्वेरी चलाएं:

  # Find query
  db.cities.find({ $text: { $search: "french bread" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "french bread" } } }
  ]);

अगर आपका इंडेक्स सेगमेंट किया गया है, तो क्वेरी में "and" इक्वैलिटी फ़िल्टर में सेगमेंट शामिल करके, सेगमेंट के आधार पर फ़िल्टर किया जा सकता है. उदाहरण के लिए, अगर आपके पास city पार्टीशन है, तो टेक्स्ट क्वेरी को इस तरह फ़िल्टर किया जा सकता है:

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

किसी एग्रीगेशन को पार्टीशन के आधार पर भी फ़िल्टर किया जा सकता है. उदाहरण के लिए:

db.myCollection.aggregate([
 { $match: { $text: { $search: "french bread" } } },
 { "city": "Paris" }
] );

आपके पार्टीशन की वैल्यू, एक स्ट्रिंग होनी चाहिए. आपके पार्टीशन फ़िल्टर को "and" का इस्तेमाल करके, आपकी क्वेरी से जोड़ा जाना चाहिए.

क्वेरी की भाषा सेट करना

$language आर्ग्युमेंट का इस्तेमाल करके, क्वेरी की भाषा सेट की जा सकती है. उदाहरण के लिए:

  db.cities.find({ $text: { $search: "french bread", $language: "en"} })

अगर क्वेरी की भाषा सेट नहीं की जाती है, तो क्वेरी में टेक्स्ट इंडेक्स की भाषा का इस्तेमाल किया जाता है.

किसी शब्द के बारे में सटीक जानकारी पाना

किसी सटीक शब्द के बारे में क्वेरी करने के लिए, उस शब्द को डबल कोट में शब्दों के क्रम के तौर पर कॉन्फ़िगर करें. उदाहरण के लिए:

  # Find query
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best french bread\"" } } },
  ]);

शब्दों के कॉम्बिनेशन के लिए क्वेरी करना

अपनी क्वेरी को ज़्यादा सटीक बनाने के लिए, शब्दों की एक चेन तय करें. उदाहरण के लिए, यहां दी गई क्वेरी से ऐसे दस्तावेज़ मिलते हैं जो best AND french AND ("bread" OR "is") के कॉम्बिनेशन से मेल खाते हैं:

  # Find query
  db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
  ]);

किसी शब्द को शामिल न करना

किसी शब्द को क्वेरी से बाहर रखने के लिए, उस शब्द से पहले हाइफ़न (-) लगाएं:

  # Find query
  db.cities.find({ $text: { $search: "best bread -french"} })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best bread -french" } } },
  ]);

काम का होने का स्कोर कैलकुलेट करना

टेक्स्ट क्वेरी से मैच होने वाले दस्तावेज़ों के काम के होने का स्कोर कैलकुलेट करने के लिए, {$meta: "textScore"} एक्सप्रेशन का इस्तेमाल करें. नतीजों को घटते क्रम में स्कोर के हिसाब से लगाने के लिए, सॉर्ट एक्सप्रेशन में $meta का इस्तेमाल करें. यहां दिए गए उदाहरणों पर ध्यान दें. इनमें SCORE_FIELD, स्कोर की वैल्यू सेव करने के लिए इस्तेमाल किए गए फ़ील्ड का नाम है:

  # Find query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .sort({ SCORE_FIELD: { $meta: "textScore" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
  ]);

प्रोजेक्शन एक्सप्रेशन में टेक्स्ट स्कोर का इस्तेमाल भी किया जा सकता है. उदाहरण के लिए:

  # Find query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $project: { "scoreField": { $meta: "textScore"} } },
  ]);

क्वेरी को बड़ा करें

क्वेरी के नतीजों को ज़्यादा काम का बनाने के लिए, $text ऑपरेटर, खोज के लिए इस्तेमाल हुए शब्दों की स्ट्रिंग को तय की गई भाषा के हिसाब से बढ़ाता है. इससे, कॉन्टेक्स्ट के हिसाब से समानार्थी शब्दों, स्टेम किए गए शब्दों, सही स्पेलिंग वाले शब्दों, डिएक्रिटिक वैरिएशन वगैरह के लिए मैच शामिल किए जा सकते हैं.

सीमाएं

  • $near और $text ऑपरेटर का इस्तेमाल, एक ही क्वेरी में नहीं किया जा सकता.
  • हर find या aggregation क्वेरी के लिए, सिर्फ़ एक $text ऑपरेटर इस्तेमाल किया जा सकता है.
  • एग्रीगेशन में, $match स्टेज के साथ $text को पहली पाइपलाइन स्टेज होना चाहिए.
  • $text को सिर्फ़ $and और $or के अंदर नेस्ट किया जा सकता है.
  • अगर $text, $or के अंदर है, तो खोज से अलग किए गए डिसजंक्शन, क्वेरी को ऑप्टिमाइज़ करने के लिए मौजूदा क्रम वाले इंडेक्स का इस्तेमाल कर सकते हैं. अगर अन्य डिसजंक्ट को इंडेक्स नहीं किया गया है, तो क्वेरी, कलेक्शन स्कैन पर निर्भर करेगी.
  • $text का इस्तेमाल क्वेरी हिंट के साथ नहीं किया जा सकता.
  • टेक्स्ट खोज वाली क्वेरी को $natural के हिसाब से क्रम में नहीं लगाया जा सकता.