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

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