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 कंसोल में, Databases & Storage > Firestore पर जाएं.
  2. इंडेक्स टैब में, इंडेक्स जोड़ें पर क्लिक करें.
  3. कलेक्शन का नाम डालें और वे फ़ील्ड सेट करें जिनके हिसाब से इंडेक्स को क्रम में लगाना है.
  4. बनाएं पर क्लिक करें.

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

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

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

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

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

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 को इंडेक्स किए जा रहे डेटा में कोई समस्या मिलती है, तो इंडेक्स करने की प्रोसेस पूरी नहीं हो पाती. आम तौर पर, इसका मतलब है कि आपने इंडेक्स करने की सीमा पार कर ली है. उदाहरण के लिए, हो सकता है कि हर दस्तावेज़ के लिए, इंडेक्स एंट्री की तय सीमा पूरी हो गई हो.

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