ניהול האינדקסים
בדף הזה מוסבר איך לנהל את האינדקסים. מידע נוסף על אינדקסים
לפני שמתחילים
לפני שיוצרים אינדקס ב-Firestore עם תאימות ל-MongoDB, צריך לוודא שהוקצה לכם אחד מהתפקידים הבאים:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
כדי להקצות תפקיד, קראו את המאמר הקצאת תפקיד יחיד. למידע נוסף על התפקידים ב-Firestore וההרשאות שמשויכות אליהם, קראו את המאמר תפקידים מוגדרים מראש.
אם הגדרתם תפקידים בהתאמה אישית, צריך להקצות את כל ההרשאות הבאות כדי ליצור אינדקסים:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.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
-
נכנסים לדף Databases במסוף Google Cloud .
- בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.
- בתפריט הניווט, לוחצים על Indexes.
- לוחצים על Create Index.
- מזינים מזהה אוסף.
- מוסיפים נתיב שדה אחד או יותר ובוחרים אפשרות אינדקס לכל אחד מהם.
- בוחרים אפשרות נוכחות של שדה: לא דליל או דליל.
- אופציונלי: מגדירים את האפשרויות multikey index או unique index.
- לוחצים על יצירה.
- האינדקס החדש מוצג ברשימת האינדקסים, ו-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" | Chinese_Traditional |
| "hr" | קרואטית |
| "cs" | צ'כית |
| "da" | דנית |
| "nl" | הולנדית |
| "en" | אנגלית |
| "eo" | אספרנטו |
| "et" | אסטונית |
| "fil" | פיליפינית |
| "fi" | פינית |
| "iw" | צרפתית |
| "gl" | גליציאנית |
| "ka" | גרוזינית |
| "de" | גרמנית |
| "el" | יוונית |
| "gu" | גוג'ארטי |
| "ht" | Haitian_Creole |
| "ha" | האוסה |
| "haw" | הוואית |
| "iw" | עברית |
| "hi" | הינדית |
| "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" | Serbian_Montenegro |
| "ne" | נפאלית |
| "no" | נורווגית |
| "ny" | ניאנג'ה |
| "או" | אודיה |
| "fa" | פרסית |
| "pl" | פולנית |
| "pt-BR" | Portuguese_Brazil |
| "pt-PT" | Portuguese_Portugal |
| "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. - אפשרויות האינדקס הנתמכות מפורטות במאמר בנושא אינדקסים ומאפייני אינדקס.
מסוף Google Cloud
בGoogle Cloud מסוף, עוברים לדף Databases.
בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על Indexes.
לוחצים על יצירת אינדקס ואז על יצירת אינדקס חיפוש.
(אופציונלי) מזינים שם לאינדקס.
עוברים אל סוג החיפוש ובוחרים באפשרות טקסט.
מזינים מזהה אוסף.
מזינים לפחות נתיב שדה אחד.
אופציונלי: מציינים שפת ברירת מחדל.
לדוגמה, מגדירים את הנתיב של השפה שתוגדר במקום ברירת המחדל ל-
myLanguageField. אם מסמך באוסף מכיל שדה בשםmyLanguageField, הערך של השדה הזה משמש לקביעת השפה להוספה לאינדקס של השדות שמוגדרים באינדקס. הערך הזה מבטל את שפת ברירת המחדל של האינדקס.לוחצים על יצירה.
האינדקס החדש מוצג ברשימת האינדקסים, והפעולות שתואמות ל-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כדי שהמשתמשים יוכלו לשלוח שאילתות לגבי מסעדות באזור שלהם.אם אתם מחלקים אינדקס למחיצות, אתם יכולים להריץ רק שאילתות שבהן צוין השדה המחולק למחיצות.
מגבלות
- אפשר ליצור רק אינדקס אחד בכל בקשה.
- יומני הביקורת של יצירת אינדקס באמצעות MongoDB API משתמשים בשם השיטה
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - אפשרויות האינדקס הנתמכות מפורטות במאמר בנושא אינדקסים ומאפייני אינדקס.
מסוף Google Cloud
בGoogle Cloud מסוף, עוברים לדף Databases.
בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על Indexes.
לוחצים על יצירת אינדקס ואז על יצירת אינדקס חיפוש.
מזינים מזהה אוסף.
עוברים אל Search Type ובוחרים באפשרות Geo (2dsphere).
לוחצים על יצירה.
האינדקס החדש מוצג ברשימת האינדקסים, והפעולות התואמות ל-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
-
נכנסים לדף Databases במסוף Google Cloud .
- בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.
- בתפריט הניווט, לוחצים על Indexes.
- ברשימת האינדקסים, לוחצים על הלחצן עוד לצד האינדקס שרוצים למחוק ובוחרים באפשרות מחיקה.
- לוחצים על מחיקת האינדקס.
CLI של gcloud
כדי למצוא את שם האינדקס, משתמשים בפקודה
gcloud firestore indexes composite list.gcloud firestore indexes composite list \ --database='DATABASE_ID'
מחליפים את DATABASE_ID במזהה מסד הנתונים.
-
כדי למחוק את האינדקס, משתמשים בפקודה
gcloud firestore indexes composite delete.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
מחליפים את מה שכתוב בשדות הבאים:
- INDEX_NAME: השם של האינדקס
- DATABASE_ID: מזהה מסד נתונים
משך הזמן של יצירת האינדקס
כדי ליצור אינדקס, Firestore עם תאימות ל-MongoDB צריך ליצור את האינדקס ואז למלא מחדש את רשומות האינדקס עם נתונים קיימים. הזמן שנדרש ליצירת אינדקס נקבע לפי הגורמים הבאים:
משך זמן של תהליך build מינימלי של אינדקס הוא כמה דקות, גם אם מדובר במסד נתונים ריק.
הזמן שנדרש למילוי חוסרים של רשומות באינדקס תלוי בכמות הנתונים הקיימים ששייכים לאינדקס החדש. ככל שיש יותר ערכי שדות שתואמים להגדרת האינדקס, כך יידרש יותר זמן למילוי חוזר של רשומות האינדקס.
ניהול פעולות ממושכות
יצירת אינדקסים היא פעולה ממושכת. בקטעים הבאים מוסבר איך לעבוד עם פעולות ממושכות עבור אינדקסים.
אחרי שמתחילים ליצור אינדקס, מערכת 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 לא מוגדר בתגובה, הפעולה לא הושלמה.