Cloud Firestore में इंडेक्स मैनेज करें

Cloud Firestore हर क्वेरी के लिए इंडेक्स की ज़रूरत होती है, ताकि क्वेरी की परफ़ॉर्मेंस बेहतर हो. सबसे बुनियादी क्वेरी के लिए ज़रूरी इंडेक्स, आपके लिए अपने-आप बन जाते हैं. ऐप्लिकेशन का इस्तेमाल और उसकी जांच करने पर, Cloud Firestore गड़बड़ी के मैसेज जनरेट करता है. इन मैसेज की मदद से, ऐप्लिकेशन के लिए ज़रूरी अतिरिक्त इंडेक्स बनाए जा सकते हैं. इस पेज पर, एक फ़ील्ड, कंपोज़िट, और वेक्टर इंडेक्स को मैनेज करने का तरीका बताया गया है.

गड़बड़ी के मैसेज की मदद से, इंडेक्स जोड़ना

अगर किसी रेंज क्लॉज़ के साथ कंपाउंड क्वेरी का इस्तेमाल किया जाता है, जो किसी मौजूदा इंडेक्स से मैप नहीं होती, तो आपको गड़बड़ी का मैसेज मिलता है. गड़बड़ी के मैसेज में, Firebase कंसोल में मौजूद इंडेक्स बनाने के लिए डायरेक्ट लिंक शामिल होता है.

जनरेट किए गए लिंक का इस्तेमाल करके Firebase कंसोल पर जाएं. इसके बाद, अपने-आप भरी गई जानकारी की समीक्षा करें और बनाएं पर क्लिक करें.

अगर वेक्टर इंडेक्स की ज़रूरत है, तो गड़बड़ी के मैसेज में, वेक्टर इंडेक्स बनाने का कमांड शामिल होगा.Google Cloud CLI इंडेक्स बनाने के लिए, कमांड चलाएं.

भूमिकाएं और अनुमतियां

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

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

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

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

Firebase कंसोल का इस्तेमाल करना

Firebase कंसोल से मैन्युअल तरीके से नया इंडेक्स बनाने के लिए:

Firebase कंसोल में, Firestore को इंडेक्स करने वाले इंटरफ़ेस की इमेज

  1. Firebase कंसोल के Cloud Firestore सेक्शन पर जाएं.
  2. इंडेक्स टैब पर जाएं और इंडेक्स जोड़ें पर क्लिक करें.
  3. कलेक्शन का नाम डालें और वे फ़ील्ड सेट करें जिनके हिसाब से आपको इंडेक्स को क्रम में लगाना है.
  4. बनाएं पर क्लिक करें.

इंडेक्स फ़ील्ड, फ़ील्ड पाथ पर लगी पाबंदियों के मुताबिक होने चाहिए.

क्वेरी के साइज़ के हिसाब से, इंडेक्स बनाने में कुछ मिनट लग सकते हैं. इंडेक्स बनाने के बाद, 'कंपोज़िट इंडेक्स' सेक्शन में जाकर, इंडेक्स और उनका स्टेटस देखा जा सकता है. अगर प्रोजेक्ट अब भी बिल्ड हो रहा है, तो Firebase कंसोल में प्रोजेक्ट के बिल्ड होने की स्थिति दिखाने वाला बार दिखेगा.

इंडेक्स हटाना

इंडेक्स मिटाने के लिए:

  1. Firebase कंसोल के Cloud Firestore सेक्शन पर जाएं.
  2. इंडेक्स टैब पर क्लिक करें.
  3. जिस इंडेक्स को मिटाना है उस पर कर्सर घुमाएं और कॉन्टेक्स्ट मेन्यू से मिटाएं को चुनें.
  4. सूचना में जाकर, मिटाएं पर क्लिक करके पुष्टि करें कि आपको इसे मिटाना है.

Firebase CLI का इस्तेमाल करना

Firebase CLI की मदद से भी इंडेक्स डिप्लॉय किए जा सकते हैं. शुरू करने के लिए, अपनी प्रोजेक्ट डायरेक्ट्री में firebase init firestore चलाएं. सेटअप के दौरान, Firebase CLI सही फ़ॉर्मैट में डिफ़ॉल्ट इंडेक्स के साथ एक JSON फ़ाइल जनरेट करता है. ज़्यादा इंडेक्स जोड़ने के लिए फ़ाइल में बदलाव करें और firebase deploy कमांड का इस्तेमाल करके उसे डिप्लॉय करें.

सिर्फ़ Cloud Firestore इंडेक्स और नियमों को डिप्लॉय करने के लिए, --only firestore फ़्लैग जोड़ें.

अगर Firebase कंसोल का इस्तेमाल करके इंडेक्स में बदलाव किए जाते हैं, तो पक्का करें कि आपने अपनी स्थानीय इंडेक्स फ़ाइल को भी अपडेट कर लिया हो. JSON इंडेक्स की परिभाषा का रेफ़रंस देखें.

Terraform का इस्तेमाल करना

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

Cloud Firestore डेटाबेस में, सिंगल-फ़ील्ड और कंपोजिट इंडेक्स, दोनों शामिल हो सकते हैं. अपने डेटाबेस के लिए इंडेक्स बनाने के लिए, Terraform कॉन्फ़िगरेशन फ़ाइल में बदलाव किया जा सकता है. सिंगल-फ़ील्ड और कंपोजिट इंडेक्स, Terraform के अलग-अलग तरह के रिसोर्स (google_firestore_index और google_firestore_field) का इस्तेमाल करते हैं.

सिंगल-फ़ील्ड इंडेक्स

यहां दिए गए उदाहरण में, Terraform कॉन्फ़िगरेशन फ़ाइल, chatrooms कलेक्शन में name फ़ील्ड पर एक फ़ील्ड का इंडेक्स बनाती है:

firestore.tf

resource "random_id" "variable"{
  byte_length = 8
}

resource "google_firestore_field" "single-index" {
  project = "project-id"
  database = "database-id"
  collection = "chatrooms_${random_id.variable.hex}"
  field = "name"

  index_config {
    indexes {
        order = "ASCENDING"
        query_scope = "COLLECTION_GROUP"
    }
    indexes {
        array_config = "CONTAINS"
    }
  }

  ttl_config {}
}
  • project-id की जगह अपना प्रोजेक्ट आईडी डालें. प्रोजेक्ट आईडी यूनीक होने चाहिए.
  • database-id की जगह अपना डेटाबेस आईडी डालें.

कंपोज़िट इंडेक्स

यहां दिए गए उदाहरण में, Terraform कॉन्फ़िगरेशन फ़ाइल, chatrooms कलेक्शन में name फ़ील्ड और description फ़ील्ड के कॉम्बिनेशन के लिए कंपोजिट इंडेक्स बनाती है:

firestore.tf

resource "google_firestore_index" "composite-index" {
  project = "project-id"
  database = "database-id"

  collection = "chatrooms"

  fields {
    field_path = "name"
    order      = "ASCENDING"
  }

  fields {
    field_path = "description"
    order      = "DESCENDING"
  }

}
  • project-id की जगह अपना प्रोजेक्ट आईडी डालें. प्रोजेक्ट आईडी यूनीक होने चाहिए.
  • database-id की जगह अपना डेटाबेस आईडी डालें.

वेक्टर इंडेक्स

यहां दिए गए उदाहरण में, Terraform कॉन्फ़िगरेशन फ़ाइल, chatrooms कलेक्शन में embedding फ़ील्ड पर वेक्टर इंडेक्स बनाती है:

firestore.tf

resource "google_firestore_index" "vector-index" {
  project = "project-id"
  database = "database-id"
  collection = "chatrooms"

  fields {
    field_path = "__name__"
    order = "ASCENDING"
  }

  fields {
    field_path = "embedding"
    vector_config {
      dimension = 128
      flat {}
    }
  }
}
  • project-id की जगह अपना प्रोजेक्ट आईडी डालें. प्रोजेक्ट आईडी यूनीक होने चाहिए.
  • database-id की जगह अपना डेटाबेस आईडी डालें.

इंडेक्स बनाने में लगने वाला समय

इंडेक्स बनाने के लिए, Cloud Firestore को इंडेक्स सेट अप करना होगा. इसके बाद, इंडेक्स को मौजूदा डेटा से बैकफ़िल करना होगा. इंडेक्स बनाने में लगने वाला समय, सेटअप में लगने वाले समय और बैकफ़िल में लगने वाले समय का कुल योग होता है:

  • इंडेक्स सेट अप करने में कुछ मिनट लगते हैं. किसी इंडेक्स को बनाने में कम से कम कुछ मिनट लगते हैं. भले ही, डेटाबेस खाली हो.

  • बैकफ़िल में लगने वाला समय इस बात पर निर्भर करता है कि नए इंडेक्स में मौजूदा डेटा कितना है. इंडेक्स की परिभाषा से मैच करने वाली ज़्यादा फ़ील्ड वैल्यू होने पर, इंडेक्स को बैकफ़िल करने में ज़्यादा समय लगता है.

इंडेक्स बनाने की प्रोसेस, ज़्यादा समय तक चलने वाली कार्रवाई होती है.

इंडेक्स बनाने की प्रोसेस शुरू करने के बाद, Cloud Firestore उस प्रोसेस को एक यूनीक नाम असाइन करता है. ऑपरेशन के नामों के आगे projects/[PROJECT_ID]/databases/(default)/operations/ लगा होता है. उदाहरण के लिए:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

हालांकि, describe कमांड के लिए ऑपरेशन का नाम बताते समय, प्रीफ़िक्स को छोड़ा जा सकता है.

लंबे समय तक चलने वाली सभी कार्रवाइयों की सूची बनाना

लंबे समय से चल रहे ऑपरेशन की सूची देखने के लिए, gcloud firestore operations list कमांड का इस्तेमाल करें. इस निर्देश से, चल रही और हाल ही में पूरी हुई कार्रवाइयों की सूची मिलती है. ऑपरेशन पूरा होने के कुछ दिनों तक, उसकी जानकारी दिखती है:

gcloud firestore operations list

ऑपरेशन की स्थिति देखना

लंबे समय तक चलने वाले सभी ऑपरेशन की सूची बनाने के बजाय, किसी एक ऑपरेशन की जानकारी दी जा सकती है:

gcloud firestore operations describe operation-name

प्रोसेस पूरी होने में लगने वाले समय का अनुमान लगाना

ऑपरेशन के चलने के दौरान, ऑपरेशन की पूरी स्थिति के लिए state फ़ील्ड की वैल्यू देखें.

लंबे समय से चल रही कार्रवाई की स्थिति का अनुरोध करने पर, workEstimated और workCompleted मेट्रिक भी दिखती हैं. ये मेट्रिक, दस्तावेज़ों की संख्या के लिए दिखती हैं. workEstimated से पता चलता है कि किसी कार्रवाई में, कितने दस्तावेज़ प्रोसेस किए जाएंगे. workCompleted यह अब तक प्रोसेस किए गए दस्तावेज़ों की संख्या दिखाता है. कार्रवाई पूरी होने के बाद, workCompleted उन दस्तावेज़ों की कुल संख्या दिखाता है जिन्हें असल में प्रोसेस किया गया था. यह संख्या, workEstimated की वैल्यू से अलग हो सकती है.

प्रोग्रेस का अनुमानित आकलन करने के लिए, workCompleted को workEstimated से भाग दें. अनुमान गलत हो सकता है, क्योंकि यह आंकड़ों को इकट्ठा करने में लगने वाले समय पर निर्भर करता है.

उदाहरण के लिए, इंडेक्स बनाने की प्रोग्रेस का स्टेटस यहां दिया गया है:

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

कोई ऑपरेशन पूरा होने पर, ऑपरेशन की जानकारी में "done": true दिखेगा. ऑपरेशन के नतीजे के लिए, state फ़ील्ड की वैल्यू देखें. अगर जवाब में done फ़ील्ड सेट नहीं है, तो इसकी वैल्यू false होती है. जारी ऑपरेशन के लिए, done वैल्यू के मौजूद होने पर निर्भर न रहें.

इंडेक्स बनाने से जुड़ी गड़बड़ियां

कॉम्पोज़िट इंडेक्स और एक फ़ील्ड वाले इंडेक्स के लिए छूट को मैनेज करते समय, आपको इंडेक्स बनाने से जुड़ी गड़बड़ियां दिख सकती हैं. अगर Cloud Firestore को इंडेक्स किए जा रहे डेटा में कोई समस्या आती है, तो इंडेक्स करने की प्रोसेस पूरी नहीं हो सकती. आम तौर पर, इसका मतलब है कि आपने इंडेक्स की सीमा पूरी कर ली है. उदाहरण के लिए, हो सकता है कि हर दस्तावेज़ के लिए, इंडेक्स की ज़्यादा से ज़्यादा एंट्री की सीमा पूरी हो गई हो.

अगर इंडेक्स बनाने में कोई गड़बड़ी होती है, तो आपको कंसोल में गड़बड़ी का मैसेज दिखेगा. इंडेक्स की सीमाओं को पूरा न करने की पुष्टि करने के बाद, इंडेक्स करने की प्रोसेस फिर से शुरू करें.