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

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

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

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

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

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

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