Cloud Firestore में, टेक्स्ट खोजने की सुविधाओं का इस्तेमाल करके, किसी कलेक्शन में मौजूद खास स्ट्रिंग खोजी जा सकती हैं.
शुरू करने से पहले
टेक्स्ट खोजने की सुविधा का इस्तेमाल करने से पहले, यह काम करें:
पक्का करें कि आपके पास टेक्स्ट इंडेक्स हो. इसके अलावा, कोई टेक्स्ट इंडेक्स बनाएं.
टेक्स्ट खोजें
टेक्स्ट खोजने के लिए, फ़िल्टर में $text ऑपरेटर का इस्तेमाल किया जाता है.
$search आर्ग्युमेंट में, क्वेरी की गई स्ट्रिंग के बारे में बताएं.
सामान्य टेक्स्ट खोजें
सामान्य टेक्स्ट खोजने के लिए, यह कमांड इस्तेमाल करें:
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
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 search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
शब्दों का कोई कॉम्बिनेशन खोजना
टेक्स्ट खोज को ज़्यादा सटीक बनाने के लिए, शब्दों की चेन के बारे में बताएं. उदाहरण के लिए, इस खोज से वे दस्तावेज़ दिखते हैं जो best AND french AND ("bread" OR "is") के कॉम्बिनेशन से मैच करते हैं:
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
किसी शब्द को शामिल न करना
टेक्स्ट खोज में किसी शब्द को शामिल न करने के लिए, शब्द से पहले हाइफ़न (-) लगाएं:
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
कितने काम का है, इस हिसाब से स्कोर का कैलकुलेशन
टेक्स्ट खोज से मैच होने वाले दस्तावेज़ों के लिए, कितने काम का है, इस हिसाब से स्कोर का कैलकुलेशन करने के लिए, {$meta: "textScore"} एक्सप्रेशन का इस्तेमाल करें. नतीजों को स्कोर के घटते क्रम में सॉर्ट करने के लिए, सॉर्ट एक्सप्रेशन में $meta का इस्तेमाल करें. यहां दिए गए उदाहरण देखें.
इनमें SCORE_FIELD, स्कोर की वैल्यू सेव करने के लिए इस्तेमाल किए गए फ़ील्ड का नाम है:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
प्रोजेक्शन एक्सप्रेशन में, टेक्स्ट स्कोर का इस्तेमाल भी किया जा सकता है. उदाहरण के लिए:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
खोज का दायरा बढ़ाना
टेक्स्ट खोज के नतीजों को ज़्यादा सटीक बनाने के लिए, $text ऑपरेटर, खोज के लिए इस्तेमाल की गई स्ट्रिंग को तय की गई भाषा के हिसाब से बढ़ाता है. इससे, कॉन्टेक्स्ट के हिसाब से मिलते-जुलते शब्दों, स्टेम किए गए फ़ॉर्म, स्पेलिंग की गलतियां ठीक किए गए शब्दों, डायक्रिटिक वेरिएशन वगैरह के लिए मैच शामिल किए जा सकते हैं.
सीमाएं
- टेक्स्ट खोज में,
$nearऑपरेटर और$textऑपरेटर का इस्तेमाल एक साथ नहीं किया जा सकता. findयाaggregationखोज में, सिर्फ़ एक$textऑपरेटर इस्तेमाल किया जा सकता है.- एग्रीगेशन में,
$textके साथ$matchस्टेज, पहली पाइपलाइन स्टेज होनी चाहिए. $textको सिर्फ़$andऔर$orके अंदर नेस्ट किया जा सकता है.- अगर
$text,$orके अंदर है, तो खोज को ऑप्टिमाइज़ करने के लिए, खोज से अलग किए गए नॉन-सर्च, मौजूदा क्रम वाले इंडेक्स का इस्तेमाल कर सकते हैं. अगर खोज से अलग किए गए दूसरे इंडेक्स नहीं किए गए हैं, तो खोज, कलेक्शन स्कैन पर निर्भर करती है. $textका इस्तेमाल, हिंट के साथ नहीं किया जा सकता.- टेक्स्ट खोज वाली क्वेरी को
$naturalके हिसाब से सॉर्ट नहीं किया जा सकता.