ניהול האינדקסים

בדף הזה מוסבר איך לנהל את האינדקסים. מידע נוסף על אינדקסים

לפני שמתחילים

לפני שיוצרים אינדקס ב-Cloud Firestore, צריך לוודא שהוקצה לכם אחד מהתפקידים הבאים:

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

כדי להקצות תפקיד, ראו הקצאת תפקיד יחיד. מידע נוסף על Cloud Firestore תפקידים וההרשאות שמשויכות אליהם זמין במאמר תפקידים מוגדרים מראש.

אם הגדרתם תפקידים בהתאמה אישית, צריך להקצות את כל ההרשאות הבאות כדי ליצור אינדקסים:

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

יצירת אינדקס

כדי ליצור אינדקס, מבצעים את השלבים הבאים:

MongoDB API

משתמשים ב-method‏ createIndex() כדי ליצור אינדקס. לדוגמה:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • אפשר ליצור אינדקסים באמצעות db.runCommand(), אבל אפשר ליצור רק אינדקס אחד.

      db.runCommand({"createIndexes":"restaurant", "indexes": [{"key": {"cuisine":1}, "name": "cuisine_index"}]})
      

חשוב לשים לב למגבלות הבאות:

  • אפשר ליצור רק אינדקס אחד בכל בקשה. אין תמיכה ב-db.collection.createIndexes().
  • יומני הביקורת ליצירת אינדקס באמצעות MongoDB API משתמשים בשם ה-method‏ google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • אפשרויות האינדקס הנתמכות מפורטות במאמר אינדקסים ומאפייני אינדקסים.
מסוף Firebase
  1. במסוף Firebase, עוברים לדף Firestore Database.

    מעבר אל Firestore Database

  2. בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.
  3. בכרטיסייה Indexes, לוחצים על Create Index.
  4. מזינים מזהה אוסף.
  5. מוסיפים נתיב שדה אחד או יותר ובוחרים אפשרות אינדקס לכל אחד מהם.
  6. בוחרים אפשרות נוכחות של שדה: לא דליל או דליל.
  7. אפשר גם להגדיר את האפשרות multikey index (אינדקס עם כמה מפתחות).
  8. לוחצים על יצירה.
  9. האינדקס החדש מוצג ברשימת האינדקסים ו Cloud Firestoreמתחיל ליצור את האינדקס. אחרי שהאינדקס נוצר, יופיע סימן וי ירוק לידו. אם האינדקס לא נוצר, כדאי לעיין בשגיאות ביצירת אינדקס כדי לראות מה יכולות להיות הסיבות לכך.
gcloud CLI

כדי ליצור אינדקס, משתמשים בפקודה gcloud firestore indexes composite create. מגדירים את api-scope לערך mongodb-compatible-api.

gcloud firestore indexes composite create \
--database='DATABASE_ID' \
--collection-group=COLLECTION \
--field-config=FIELD_CONFIGURATION \
--query-scope=collection-group \
--density=dense \
--api-scope=mongodb-compatible-api

מחליפים את מה שכתוב בשדות הבאים:

  • ‫DATABASE_ID: מזהה מסד נתונים.
  • ‫COLLECTION: שם האוסף.
  • ‫FIELD_CONFIGURATION: הגדרת שדה. לכל שדה, מוסיפים --field-config=field-path=. לדוגמה:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    מידע נוסף על הגדרת השדות האלה זמין במאמר --field-config.

כדי ליצור אינדקס דליל, מגדירים את --density=sparse-any.

כדי ליצור אינדקס עם כמה מפתחות, מוסיפים את הדגל --multikey.

כדי ליצור אינדקס ייחודי, מוסיפים את הדגל --unique.

Terraform

משתמשים במשאב google_firestore_index ומגדירים את api_scope ל-MONGODB_COMPATIBLE_API ואת query_scope ל-COLLECTION_GROUP.

resource "google_firestore_index" "index" {
  database    = "DATABASE_ID"
  collection  = "COLLECTION"
  api_scope   = "MONGODB_COMPATIBLE_API"
  query_scope = "COLLECTION_GROUP"

  // You can include multiple field blocks
  fields {
    field_path = "FIELD_PATH"
    order      = "ORDER"
  }

  // Optional
  multikey = true
  density  = "DENSITY"
}

מחליפים את מה שכתוב בשדות הבאים:

  • ‫DATABASE_ID: מזהה מסד הנתונים של מסד הנתונים שבחרתם
  • ‫COLLECTION: השם של האוסף שרוצים ליצור לו אינדקס
  • ‫FIELD_PATH: השם של השדה לאינדקס
  • ‫ORDER: אחד מהערכים ASCENDING או DESCENDING
  • ‫DENSITY: אחד מהערכים SPARSE_ANY או DENSE

יצירת אינדקס טקסט

יוצרים אינדקס טקסט אם רוצים לבצע חיפוש טקסט של מחרוזות ספציפיות באוסף.

כדי ליצור אינדקס טקסט לאוסף, פועלים לפי השלבים הבאים:

MongoDB API

משתמשים ב-method‏ createIndex() כדי ליצור אינדקס טקסט. בדוגמה הבאה, כשמסמך נכתב לאוסף cities עם השדות country או food מלאים, השדות האלה עוברים אינדוקס לצורכי חיפוש.

db.cities.createIndex({"country": "text", "food": "text"})

כדי ליצור אינדקס לשדה, הוא צריך להיות מחרוזת או מערך של מחרוזות. אינדקסים של מערכים לא נוספים לאינדקס החיפוש. כתוצאה מכך, הפעולה indexing a.1.b תוסיף לאינדקס את something ב-{a: {1: {b: something}}}, אבל לא ב-{a: [one, {b: something}]}.

אפשר גם ליצור אינדקסים באמצעות db.runCommand(). אפשר ליצור רק אינדקס טקסט אחד לכל אוסף, אבל אפשר ליצור כמה אינדקסים מסוגים שונים באותו db.runCommand(). בדוגמה הבאה משתמשים ב-db.runCommand() כדי ליצור אינדקס טקסט:

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text" },
      name: "country_text_food_text"
    }
  ]
})

הגדרה של שפת ברירת מחדל

אפשר גם לציין שפת ברירת מחדל או נתיב שדה במסמך שיכיל את שפת ברירת המחדל.

בדוגמה הבאה, myLanguageField מצוין כ-language_override. כשמסמך באוסף cities מכיל שדה בשם myLanguageField, הערך של השדה הזה משמש לקביעת השפה לאינדוקס של השדה country עבור המסמך הספציפי הזה. הערך הזה מבטל את שפת ברירת המחדל של french.

db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
  • אפשר להזין את השפה בשם המלא שלה (english) או בקוד השפה שלה לפי תקן ISO (en).
  • אם לא מגדירים שפת ברירת מחדל, Cloud Firestore ברירת המחדל היא אנגלית.
  • שדה שינוי השפה חייב להיות שדה ברמה העליונה. אם לא מגדירים את השדה הזה, ברירת המחדל שלו היא language.
  • אם מגדירים את שפת ברירת המחדל לתו null, המערכת Cloud Firestore לא משתמשת בשום שדה כדי לשנות את השפה.

כאן אפשר לראות את רשימת השפות הנתמכות

קוד שפה שם השפה
"und" זיהוי אוטומטי
‪"af" אפריקאנס
"ak" אקאן
"sq" אלבנית
‪"am" אמהרית
‪"ar" ערבית
"hy" ארמנית
‪"az" אזרית
"eu" בסקית
"be" בלארוסית
‪"bn" בנגלית
‪"bs" בוסנית
‪"bg" בולגרית
"my" בורמזית
‪"ca" קטלאנית
‪"ceb" סבואנו
‪"chr" צ'רוקי
"zh" סינית
‪"zh-Hant" סינית (מסורתית)
‪"hr" קרואטית
‪"cs" צ'כית
‪"da" דנית
‪"nl" הולנדית
"en" אנגלית
‪"eo" אספרנטו
"et" אסטונית
‪"fil" פיליפינית
‪"fi" פינית
‪"fr" צרפתית
‪"gl" גליציאנית
‪"ka" גאורגית
‪"de" גרמנית
"el" יוונית
‪"gu" גוג'ארטי
"ht" Haitian_Creole
"ha" האוסה
"haw" מנות מהוואי
"iw" עברית
"hi" הינדי
‪"hmn" המונג
"hu" הונגרית
‫"is" איסלנדית
‪"ig" איגבו
‫"id" אינדונזית
‪"ga" אירית
"it" איטלקי
"כן" יפנית
‪"jv" ג'אוונית
‪"kn" קנאדה
‪"kk" קזחית
"km" חמרית
‪"ko" קוריאנית
‪"lo" לאו
‪"la" לטינית
‪"lv" לטבית
"lt" ליטאית
‫"lb" לוקסמבורגית
‪"mk" מקדונית
‫"mg" מלגשית
"ms" מלאית
‪"ml" מליאלאם
‪"mt" מלטית
‪"mi" מאורית
"mr" מראטהית
‪"mfe" מוריסיין
‪"mn" מונגולית
"sr-ME" Serbian_Montenegro
"ne" נפאלית
‫"no" נורווגית
"ny" ניאנג'ה
‫'or' אודיה
‪"fa" פרסית
‪"pl" פולנית
‪"pt-BR" פורטוגזית (ברזיל)
‪"pt-PT" פורטוגזית (פורטוגל)
‪"pa" פנג'אבי
‪"ro" רומנית
"ru" רוסית
"gd" גאלית סקוטית
"sr" סרבית
"st" ססוטו
‪"si" סינהאלה
"sk" סלובקית
"sl" סלובנית
"so" סומלית
‪"es" ספרדית
"su" סונדנזית
"sw" סווהילי
"sv" שוודית
‪"tg" טג'יקית
‪"ta" טמילית
‪"te" טלוגו
‪"th" תאית
‪"tr" טורקית
‪"uk" אוקראינית
‪"ur" אורדו
‪"uz" אוזבקית
‪"vi" וייטנאמית
"cy" וולשית
‪"yi" יידיש
"yo" יורובה
"zu" זולו

חלוקה של אינדקס טקסט

אפשר גם לחלק את האינדקס באמצעות שדה, כדי שתוכלו לסנן שאילתות לפי ערך שדה ספציפי. ההגדרה הזו מאפשרת להריץ שאילתות יעילות יותר אם תמיד צריך לסנן שדה ספציפי באינדקס שמתבצעת בו שאילתה.

כדי ליצור אינדקס עם מחיצה, מגדירים את השדה firestoreOptions באופן הבא:

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text"},
      name: "country_text_food_text"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

כאשר:

  • ‫PARTITIONED_FIELD הוא שם השדה שמשמש לחלוקה למחיצות. הערך הזה חייב להיות מחרוזת, והוא צריך להתייחס לשדה ברמה העליונה. כשמריצים שאילתה מול אינדקס עם חלוקה למחיצות, אפשר לסנן את התוצאות לפי ערך של השדה הזה. לדוגמה, אפשר לחלק את האינדקס באמצעות city. אם שדה city מוגדר באינדקס הטקסט, המשתמשים יכולים לשלוח שאילתה לגבי עיר ספציפית.

    המחיצה חייבת להיות שדה אחד בלבד. אם מחלקים אינדקס למחיצות, אפשר להריץ רק שאילתות שבהן מצוין השדה שחולק למחיצות.

מגבלות

  • אפשר ליצור רק אינדקס אחד בכל בקשה.
  • יומני הביקורת של יצירת אינדקס באמצעות MongoDB API משתמשים בשם השיטה google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • אפשרויות האינדקס הנתמכות מפורטות במאמר בנושא אינדקסים ומאפייני אינדקס.

מסוף Firebase

  1. במסוף Firebase, עוברים לדף Firestore Database.

    מעבר אל Firestore Database

  2. בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.

  3. בכרטיסייה Indexes, לוחצים על Create Index.

  4. מזינים מזהה אוסף.

  5. מוסיפים נתיב שדה אחד או יותר ובוחרים אפשרות אינדקס לכל אחד מהם.

  6. לוחצים על יצירה.

  7. האינדקס החדש מוצג ברשימת האינדקסים, והפעולות התואמות ל-MongoDB מתחילות ליצור את האינדקס. אחרי שהאינדקס נוצר, יופיע סימן וי ירוק ליד האינדקס. אם האינדקס לא נוצר, אפשר לעיין בקטע שגיאות ביצירת אינדקס כדי לראות מה יכולות להיות הסיבות לכך.

יצירת אינדקס 2dsphere

יוצרים אינדקס 2dsphere כדי לבצע שאילתות גיאו-מרחביות ולחפש מסמכים שנמצאים בטווח מסוים מקו אורך וקו רוחב ספציפיים.

כדי ליצור אינדקס 2dsphere לאוסף, מבצעים את השלבים הבאים:

MongoDB API

משתמשים ב-method‏ createIndex() כדי ליצור אינדקס. לדוגמה:

db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})

אפשר גם ליצור אינדקס באמצעות db.runCommand(), עם אינדקס אחד לכל היותר:

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
    }
  ]
})

חלוקה למחיצות של אינדקס 2dsphere

אפשר גם לחלק את האינדקס באמצעות שדה, כדי שתוכלו לסנן שאילתות לפי ערך שדה ספציפי. ההגדרה הזו מאפשרת להריץ שאילתות יעילות יותר אם תמיד צריך לסנן שדה ספציפי באינדקס שמתבצעת בו שאילתה.

כדי ליצור אינדקס עם מחיצה, מגדירים את השדה firestoreOptions באופן הבא:

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

כאשר:

  • ‫PARTITIONED_FIELD הוא שם השדה שמשמש לחלוקה למחיצות. כשמריצים שאילתה מול אינדקס עם חלוקה למחיצות, אפשר לסנן את התוצאות לפי ערך של השדה הזה. לדוגמה, אם באינדקס יש שדה region למיקומים אזוריים, אפשר לבצע חלוקה של האינדקס באמצעות region כדי שהמשתמשים יוכלו לשלוח שאילתות לגבי מסעדות באזור שלהם.

    אם מחלקים אינדקס למחיצות, אפשר להריץ רק שאילתות שבהן מצוין השדה שחולק למחיצות.

מגבלות

  • אפשר ליצור רק אינדקס אחד בכל בקשה.
  • יומני הביקורת של יצירת אינדקס באמצעות MongoDB API משתמשים בשם השיטה google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • אפשרויות האינדקס הנתמכות מפורטות במאמר בנושא אינדקסים ומאפייני אינדקס.

מסוף Firebase

  1. במסוף Firebase, עוברים לדף Firestore Database.

    מעבר אל Firestore Database

  2. בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.

  3. בכרטיסייה Indexes, לוחצים על Create Index.

  4. מזינים מזהה אוסף.

  5. מוסיפים נתיב שדה אחד או יותר ובוחרים אפשרות אינדקס לכל אחד מהם.

  6. לוחצים על יצירה.

  7. האינדקס החדש מוצג ברשימת האינדקסים, והפעולות התואמות ל-MongoDB מתחילות ליצור את האינדקס. אחרי שהאינדקס נוצר, יופיע סימן וי ירוק ליד האינדקס. אם האינדקס לא נוצר, אפשר לעיין בקטע שגיאות ביצירת אינדקס כדי לראות מה יכולות להיות הסיבות לכך.

מחיקת אינדקס

כדי למחוק אינדקס, פועלים לפי השלבים הבאים:

MongoDB API

כדי למחוק אינדקס, משתמשים ב-method ‏dropIndex(). לדוגמה:

מחיקת אינדקס באמצעות שם האינדקס

db.restaurants.dropIndex("cuisine_index")

מחיקת אינדקס באמצעות הגדרת אינדקס

db.restaurants.dropIndex({"cuisine" : 1})
מסוף Firebase
  1. במסוף Firebase, עוברים לדף Firestore Database.

    מעבר אל Firestore Database

  2. בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.
  3. לוחצים על הכרטיסייה Indexes (אינדקסים).
  4. ברשימת האינדקסים, לוחצים על הלחצן עוד לצד האינדקס שרוצים למחוק ובוחרים באפשרות מחיקה.
  5. לוחצים על מחיקת האינדקס.
gcloud CLI
  1. כדי למצוא את שם האינדקס, משתמשים בפקודה gcloud firestore indexes composite list.

    gcloud firestore indexes composite list \
    --database='DATABASE_ID'

    מחליפים את DATABASE_ID במזהה מסד הנתונים.

  2. כדי למחוק את האינדקס, משתמשים בפקודה gcloud firestore indexes composite delete.

    gcloud firestore indexes composite delete INDEX_NAME \
    --database='DATABASE_ID'

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫INDEX_NAME: השם של אינדקס
    • ‫DATABASE_ID: מזהה מסד נתונים

משך הזמן של יצירת האינדקס

כדי לבנות אינדקס, Cloud Firestore צריך ליצור את האינדקס ואז למלא את רשומות האינדקס בנתונים קיימים. הזמן שנדרש ליצירת אינדקס נקבע לפי הגורמים הבאים:

  • משך זמן של תהליך build מינימלי של אינדקס הוא כמה דקות, גם אם מדובר במסד נתונים ריק.

  • הזמן שנדרש למילוי חוסרים של רשומות באינדקס תלוי בכמות הנתונים הקיימים שצריכים להיכלל באינדקס החדש. ככל שיש יותר ערכי שדות שתואמים להגדרת האינדקס, כך יידרש יותר זמן למילוי חוזר של רשומות האינדקס.

ניהול פעולות ממושכות

יצירת אינדקסים היא פעולה ממושכת. בקטעים הבאים מוסבר איך לעבוד עם פעולות ממושכות עבור אינדקסים.

אחרי שמתחילים ליצור אינדקס, Cloud Firestore מקצה לפעולה שם ייחודי. שמות הפעולות מתחילים בקידומת projects/PROJECT_ID/databases/DATABASE_ID/operations/, לדוגמה:

projects/PROJECT_ID/databases/DATABASE_ID/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 לא מוגדר בתגובה, סימן שהפעולה לא הושלמה.