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

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

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

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

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

כדי להקצות תפקיד, קראו את המאמר הקצאת תפקיד יחיד. למידע נוסף על התפקידים ב-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.
  • במאמר אינדקסים ומאפייני אינדקס מפורטות אפשרויות האינדקס הנתמכות.
מסוףGoogle Cloud
  1. נכנסים לדף Databases במסוף Google Cloud .

    כניסה לדף Databases

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

כדי ליצור אינדקס, משתמשים בפקודה 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"})

כדי להוסיף שדה לאינדקס, הוא חייב להיות מחרוזת או מערך של מחרוזות. אינדקסים של מערכים לא נוספים לאינדקס החיפוש. כתוצאה מכך, הוספה לאינדקס של 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).
  • אם לא מגדירים שפת ברירת מחדל, Firestore משתמש באנגלית כברירת מחדל.
  • השדה לשינוי השפה חייב להיות שדה ברמה העליונה. אם לא מגדירים את המדיניות, שדה שינוי השפה מוגדר כברירת מחדל לערך language.
  • אם מגדירים את שפת ברירת המחדל לתו null, אז Firestore עם תאימות ל-MongoDB לא משתמש באף שדה בתור שינוי שפה.

הרחבה כדי לראות את רשימת השפות הנתמכות

קוד שפה שם השפה
"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" עברית
"שלום" הינדית
"hmn" המונג
"hu" הונגרית
"is" איסלנדית
"ig" איגבו
"id" אינדונזית
"ga" אירית
"it" איטלקית
"ja" יפנית
"jv" ג'אווה
"kn" קנאדה
"kk" קזחית
"km" חמר
"ko" קוריאנית
"lo" לאו
"la" לטינית
"lv" לטבית
"lt" ליטאית
"lb" לוקסמבורגית
"mk" מקדונית
"mg" מלגשית
"ms" מלאית
"ml" מלאיאלאם
"mt" מלטית
"mi" מאורית
"mr" מראטהית
"mfe" מוריסיין
"mn" מונגולית
"sr-ME" סרבית_מונטנגרו
"ne" נפאלית
"no" נורווגית
"ny" ניאנג'ה
"או" אודיה
"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 מוגדר באינדקס הטקסט, המשתמשים יכולים לשלוח שאילתות לגבי עיר ספציפית.

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

מגבלות

מסוף Google Cloud

  1. במסוףGoogle Cloud , נכנסים לדף Databases.

    כניסה לדף Databases

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

  3. בתפריט הניווט, לוחצים על Indexes.

  4. לוחצים על Create Index ואז על Create search index.

  5. (אופציונלי) נותנים שם לאינדקס.

  6. עוברים אל סוג החיפוש ובוחרים באפשרות טקסט.

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

  8. מזינים לפחות נתיב שדה אחד.

  9. אופציונלי: מציינים שפת ברירת מחדל.

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

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

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

‫CLI של gcloud

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

gcloud firestore indexes composite create \
  --database='DATABASE_ID' \
  --collection-group=COLLECTION_GROUP \
  --field-config=field-path=FIELD_NAME,search-config='{"text-spec": {"index-specs": [{"index-type": "tokenized", "match-type": "match-globally"}]}}' \
  --api-scope=mongodb-compatible-api \
  --search-index-options=text-language=en \
  --async

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

  • ‫DATABASE_ID: מזהה מסד נתונים.
  • ‫COLLECTION_GROUP: המזהה של האוסף שרוצים להוסיף לאינדקס.
  • ‫FIELD_NAME: שם השדה שרוצים להוסיף לאינדקס.

הדגל --async מריץ את פעולת יצירת האינדקס ברקע.

יצירת אינדקס 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 כדי שהמשתמשים יוכלו לשלוח שאילתות לגבי מסעדות באזור שלהם.

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

מגבלות

מסוף Google Cloud

  1. במסוףGoogle Cloud , נכנסים לדף Databases.

    כניסה לדף Databases

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

  3. בתפריט הניווט, לוחצים על Indexes.

  4. לוחצים על Create Index ואז על Create search index.

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

  6. עוברים אל Search Type (סוג החיפוש) ובוחרים באפשרות Geo (2dsphere)‎ (גיאוגרפי (2dsphere)).

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

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

‫CLI של gcloud

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

gcloud firestore indexes composite create \
  --database='DATABASE_ID' \
  --collection-group=COLLECTION_GROUP \
  --field-config=field-path=FIELD_NAME,search-config='{"geo-spec": {}}' \
  --api-scope=mongodb-compatible-api \
  --async

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

  • ‫DATABASE_ID: מזהה מסד נתונים.
  • ‫COLLECTION_GROUP: המזהה של האוסף שרוצים להוסיף לאינדקס.
  • ‫FIELD_NAME: שם השדה שרוצים להוסיף לאינדקס.

הדגל --async מריץ את פעולת יצירת האינדקס ברקע.

מחיקת אינדקס

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

MongoDB API

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

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

db.restaurants.dropIndex("cuisine_index")

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

db.restaurants.dropIndex({"cuisine" : 1})
מסוףGoogle Cloud
  1. נכנסים לדף Databases במסוף Google Cloud .

    כניסה לדף Databases

  2. בוחרים מסד נתונים מרשימת מסדי הנתונים.
  3. בתפריט הניווט, לוחצים על Indexes.
  4. ברשימת האינדקסים, לוחצים על הלחצן More באינדקס שרוצים למחוק ובוחרים באפשרות Delete.
  5. לוחצים על Delete Index.
‫CLI של gcloud
  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: מזהה מסד נתונים

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

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

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

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

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

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

אחרי שמתחילים ליצור אינדקס, Firestore עם תאימות ל-MongoDB מקצה לפעולה שם ייחודי. שמות הפעולות מתחילים בקידומת 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 לא מוגדר בתגובה, הפעולה לא הושלמה.