توضّح هذه الصفحة كيفية إدارة الفهارس. لمزيد من المعلومات حول الفهارس، يُرجى الاطّلاع على نظرة عامة على الفهارس.
قبل البدء
قبل إنشاء فهرس في Cloud Firestore، تأكَّد من أنّه تم تعيين أيّ من الأدوار التالية لك:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
لمنح دور، يُرجى الاطّلاع على منح دور واحد. لمزيد من المعلومات حول أدوار "Cloud Firestore" والأذونات المرتبطة بها، يُرجى الاطّلاع على الأدوار المحدّدة مسبقًا.
إذا حدّدت أدوارًا مخصّصة، يمكنك منح جميع الأذونات التالية لإنشاء الفهارس:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
إنشاء فهرس
لإنشاء فهرس، أكمِل الخطوات التالية:
MongoDB API
استخدِم الإجراء 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 اسم الطريقة
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - للاطّلاع على خيارات الفهرس المتوافقة، يُرجى مراجعة الفهارس وسمات الفهرس.
وحدة تحكُّم Firebase
-
في وحدة تحكُّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.
- اختَر قاعدة بيانات من قائمة قواعد البيانات.
- في علامة التبويب الفهارس، انقر على إنشاء فهرس.
- أدخِل معرّف المجموعة.
- أضِف مسار حقل واحدًا أو أكثر وحدِّد خيار فهرسة لكلّ منها.
- حدِّد خيارًا لتوفّر الحقل، إما "غير متناثر" أو "متناثر".
- يمكنك اختياريًا ضبط خيار الفهرس المتعدد المفاتيح.
- انقر على إنشاء.
- يظهر الفهرس الجديد في قائمة الفهارس ويبدأ 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
استخدِم الإجراء
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). - في حال عدم ضبط اللغة التلقائية، يتم ضبط Cloud Firestore تلقائيًا على اللغة الإنجليزية.
- يجب أن يكون حقل تجاوز اللغة حقلًا من المستوى الأعلى. وفي حال تركها بدون ضبط، سيتم ضبط حقل تجاوز اللغة تلقائيًا على
language. - إذا ضبطت اللغة التلقائية على الحرف
null، لن يستخدم Cloud Firestore أي حقل كإعداد لغة بديل.
انقر لتوسيع قائمة اللغات المتاحة
| رمز اللغة | اسم اللغة |
|---|---|
| "und" | الرصد التلقائي |
| "af" | الأفريقانية |
| "ak" | الأكانية |
| "sq" | الألبانية |
| "صباحًا" | الأمهرية |
| "ar" | العربية |
| "hy" | الأرمينية |
| "az" | الأذربيجانية |
| "eu" | الباسكية |
| "be" | البيلاروسية |
| "bn" | البنغالية |
| "bs" | البوسنية |
| "bg" | البلغارية |
| "my" | البورمية |
| "ca" | الكتالانية |
| "ceb" | السيبيوانية |
| "chr" | الشيروكية |
| "zh" | الصينية |
| "zh-Hant" | الصينية التقليدية |
| "hr" | الكرواتية |
| "cs" | التشيكية |
| "da" | الدانماركية |
| "nl" | الهولندية |
| "ar" | الإنجليزية |
| "eo" | الإسبرانتو |
| "et" | الإستونية |
| "fil" | الفلبينية |
| "fi" | الفنلندية |
| "fr" | الفرنسية |
| "gl" | الغليشيانية |
| "ka" | الجورجية |
| "de" | الألمانية |
| "el" | اليونانية |
| "gu" | الغوجاراتية |
| "ht" | الكريولية_الهايتية |
| "ha" | الهوسا |
| "haw" | بيتزا على طريقة هاواي |
| "iw" | العبرية |
| "مرحبًا" | الهندية |
| "hmn" | الهمونجية |
| "hu" | الهنغارية |
| "is" | الأيسلندية |
| "ig" | الإيجبو |
| "id" | الإندونيسية |
| "ga" | الأيرلندية |
| "it" | مأكولات إيطالية |
| "ja" | اليابانية |
| "jv" | الجافانية |
| "kn" | الكانادا |
| "kk" | الكازاخية |
| "كم" | الخميرية |
| "ko" | الكورية |
| "lo" | اللاوية |
| "la" | اللاتينية |
| "lv" | اللاتفية |
| "lt" | الليتوانية |
| "رطل" | اللوكسمبورغية |
| "mk" | المقدونية |
| "ملغ" | الملغاشية |
| "ms" | الماليزية |
| "ml" | المالايالامية |
| "mt" | المالطية |
| "mi" | الماورية |
| "mr" | المراثية |
| "mfe" | المورسيانية |
| "mn" | المنغولية |
| "sr-ME" | Serbian_Montenegro |
| "ne" | النيبالية |
| "لا" | النرويجية |
| "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في فهرس النص، يمكن للمستخدمين إجراء طلب بحث عن مدينة معيّنة.يجب أن يكون القسم حقلاً واحدًا فقط. إذا قمت بتقسيم فهرس، يمكنك تشغيل الاستعلامات فقط حيث يتم تحديد الحقل المقسم.
القيود
- يمكنك إنشاء فهرس واحد فقط لكل طلب.
- تستخدم سجلّات التدقيق لإنشاء الفهرس باستخدام واجهة برمجة التطبيقات MongoDB اسم الطريقة
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - للاطّلاع على خيارات الفهرس المتوافقة، يُرجى مراجعة الفهارس وخصائص الفهرس.
وحدة تحكُّم Firebase
في وحدة تحكُّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.
اختَر قاعدة بيانات من قائمة قواعد البيانات.
في علامة التبويب الفهارس، انقر على إنشاء فهرس.
أدخِل معرّف المجموعة.
أضِف مسار حقل واحدًا أو أكثر وحدِّد خيار فهرسة لكلّ منها.
انقر على إنشاء.
يتم عرض الفهرس الجديد في قائمة الفهارس وتبدأ العمليات المتوافقة مع MongoDB في إنشاء الفهرس. عند إنشاء الفهرس، ستظهر علامة صح خضراء بجانب الفهرس. إذا لم يتم إنشاء الفهرس، يمكنك الاطّلاع على أخطاء إنشاء الفهرس لمعرفة الأسباب المحتملة.
gcloud CLI
لإنشاء فهرس نصي، استخدِم الأمر
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
استخدِم الإجراء
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 اسم الطريقة
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - للاطّلاع على خيارات الفهرس المتوافقة، يُرجى مراجعة الفهارس وخصائص الفهرس.
وحدة تحكُّم Firebase
في وحدة تحكُّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.
اختَر قاعدة بيانات من قائمة قواعد البيانات.
في علامة التبويب الفهارس، انقر على إنشاء فهرس.
أدخِل معرّف المجموعة.
أضِف مسار حقل واحدًا أو أكثر وحدِّد خيار فهرسة لكلّ منها.
انقر على إنشاء.
يتم عرض الفهرس الجديد في قائمة الفهارس وتبدأ العمليات المتوافقة مع MongoDB في إنشاء الفهرس. عند إنشاء الفهرس، ستظهر علامة صح خضراء بجانب الفهرس. إذا لم يتم إنشاء الفهرس، يمكنك الاطّلاع على أخطاء إنشاء الفهرس لمعرفة الأسباب المحتملة.
gcloud CLI
لإنشاء فهرس 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
استخدِم طريقة dropIndex() لحذف فهرس. على سبيل المثال:
حذف فهرس باستخدام اسم الفهرس
db.restaurants.dropIndex("cuisine_index")
حذف فهرس باستخدام تعريف الفهرس
db.restaurants.dropIndex({"cuisine" : 1})
وحدة تحكُّم Firebase
-
في وحدة تحكُّم Firebase، انتقِل إلى صفحة قاعدة بيانات Firestore.
- اختَر قاعدة بيانات من قائمة قواعد البيانات.
- انقر على علامة التبويب الفهارس.
- في قائمة الفهارس، انقر على حذف من الزر المزيد للفهرس الذي تريد حذفه.
- انقر على حذف الفهرس.
gcloud CLI
للعثور على اسم الفهرس، استخدِم الأمر
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: معرِّف قاعدة البيانات
وقت إنشاء الفهرس
لإنشاء فهرس، يجب أن تنشئ Cloud Firestore الفهرس ثم تعبئ إدخالات الفهرس بالبيانات الحالية. يتم تحديد الوقت اللازم لإنشاء فهرس من خلال ما يلي:
الحد الأدنى لوقت إنشاء الفهرس هو بضع دقائق، حتى بالنسبة إلى قاعدة بيانات فارغة.
يعتمد الوقت المطلوب لإضافة إدخالات الفهرس على مقدار البيانات الحالية التي تنتمي إلى الفهرس الجديد. كلما زاد عدد قيم الحقول التي تطابق تعريف الفهرس، استغرق الأمر وقتًا أطول لإعادة تعبئة إدخالات الفهرس.
إدارة العمليات التي تستغرق وقتًا طويلاً
تُعدّ عمليات إنشاء الفهارس عمليات طويلة. توضّح الأقسام التالية كيفية التعامل مع العمليات الطويلة الأمد للفهارس.
بعد البدء في إنشاء فهرس، يخصّص 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 في الاستجابة،
يعني ذلك أنّ العملية لم تكتمل.