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

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