تُعد الفهارس عاملاً مهمًا في أداء قاعدة البيانات. مثل فهرس الكتاب الذي يربط المواضيع بأرقام الصفحات، يربط فهرس قاعدة البيانات العناصر بمواقعها في قاعدة البيانات. عند الاستعلام عن قاعدة بيانات، يمكن لقاعدة البيانات استخدام فهرس لتحديد مواقع العناصر التي طلبتها بسرعة.
توضّح هذه الصفحة نوعَي الفهارس اللذين تستخدمهما Cloud Firestore، وهما الفهارس التلقائية والفهارس اليدوية.
تعريف الفهرس وبنيته
يتم تحديد الفهرس في قائمة حقول مستند معيّن، مع وضع فهرسة مقابل لكل حقل.
يحتوي الفهرس على إدخال لكل حقل مُدرَج في تعريف الفهرس. يتضمّن الفهرس جميع المستندات التي تمثّل النتائج المحتملة لطلبات البحث المستندة إلى الفهرس. يتم تضمين المستند في الفهرس فقط إذا كانت له قيمة مفهرسة محددة لكل حقل مستخدم في الفهرس. إذا كان تعريف الفهرس يشير إلى حقل لم يتم ضبط قيمة له في المستند، لن يظهر هذا المستند في الفهرس. في هذه الحالة، لن يتم عرض المستند مطلقًا كنتيجة لأي طلب بحث يستند إلى الفهرس.
يتم ترتيب الفهرس حسب قيم الحقول، بالترتيب المحدّد في تعريف الفهرس.
فهرس لكل طلب بحث
إذا لم يكن هناك فهرس لطلب بحث، فإن معظم قواعد البيانات تزحف عبر محتوياتها عنصرًا تلو الآخر، وهي عملية بطيئة تتباطأ أكثر مع نمو قاعدة البيانات. يساعد Cloud Firestore في توفير أداء عالٍ لطلبات البحث باستخدام الفهارس لجميع طلبات البحث. نتيجةً لذلك، يعتمد أداء طلب البحث على حجم مجموعة النتائج وليس على عدد العناصر في قاعدة البيانات.
إدارة أقل للفهرس، وتطوير أكثر للتطبيقات
يتضمّن Cloud Firestore ميزات تقلّل من الوقت الذي تحتاج إلى قضائه في إدارة الفهرس. يتم إنشاء الفهارس المطلوبة لطلبات البحث الأساسية تلقائيًا. أثناء استخدام تطبيقك واختباره، تساعدك خدمة Cloud Firestore في تحديد الفهارس الإضافية التي يتطلبها تطبيقك وإنشائها.
أنواع الفهارس
يستخدم Cloud Firestore نوعَين من الفهارس: تلقائية ويدوية. تختلف الفهارس اليدوية والتلقائية في كيفية إدارتها.
الفهارس التلقائية
بشكل تلقائي، تنشئ Cloud Firestore الفهارس تلقائيًا لكل حقل موجود في المستندات في مجموعة. تتيح لك هذه الفهارس ذات الحقل الواحد إجراء العديد من طلبات البحث الأساسية. يمكنك إدارة الفهارس التلقائية من خلال ضبط إعدادات الفهرسة التلقائية لقاعدة البيانات واستثناءات الفهرس.
الإعدادات التلقائية للفهرس التلقائي
يستخدم Cloud Firestore الإعدادات التلقائية التالية للفهارس التلقائية:
بالنسبة إلى كل حقل ليس مصفوفة أو خريطة، يحدّد Cloud Firestore فهرسَين على مستوى المجموعة، أحدهما في الوضع التصاعدي والآخر في الوضع التنازلي.
لكل حقل خريطة، ينشئ Cloud Firestore ما يلي:
- فهرس تصاعدي واحد على مستوى المجموعة لكل حقل فرعي ليس مصفوفة أو خريطة.
- فهرس تنازلي واحد على مستوى المجموعة لكل حقل فرعي ليس مصفوفة أو خريطة.
- فهرس تصاعدي واحد على مستوى المجموعة لقيمة الخريطة بالكامل
- فهرس تنازلي واحد على مستوى المجموعة لقيمة الخريطة بالكامل
- فهرس واحد من نوع "مصفوفة تحتوي على" على مستوى المجموعة لكل حقل فرعي في المصفوفة.
- يفهرس Cloud Firestore كل حقل فرعي في الخريطة بشكل متكرر.
بالنسبة إلى كل حقل مصفوفة في مستند، ينشئ Cloud Firestore ما يلي:
- فهرس تصاعدي واحد على مستوى المجموعة لقيمة الصفيف بالكامل
- فهرس تنازلي واحد على مستوى المجموعة لقيمة الصفيف بالكامل
- فهرس واحد من النوع array-contains على مستوى المجموعة
لا تتم صيانة الفهارس التلقائية التي تندرج ضمن نطاق مجموعة المجموعات تلقائيًا.
استثناءات الفهرسة التلقائية
يمكنك استثناء حقل من إعدادات الفهرسة التلقائية عن طريق إنشاء استثناء فهرسة. يؤدي استثناء الفهرسة إلى إلغاء إعدادات الفهرسة التلقائية على مستوى قاعدة البيانات. يمكن أن يؤدي الإعفاء إلى تفعيل فهرس قد تؤدي إعدادات الفهرسة التلقائية إلى إيقافه أو إيقاف فهرس قد تؤدي الفهرسة التلقائية إلى تفعيله. للاطّلاع على الحالات التي يمكن أن تكون فيها الاستثناءات مفيدة، يُرجى مراجعة أفضل الممارسات المتعلقة بالفهرسة.
استخدِم قيمة مسار الحقل * لإضافة استثناءات الفهرس على مستوى المجموعة في جميع الحقول في مجموعة المجموعات. على سبيل المثال، بالنسبة إلى مجموعة المجموعات comments، اضبط
مسار الحقل على * لمطابقة جميع الحقول في مجموعة المجموعات comments و
أوقِف فهرسة جميع الحقول ضمن مجموعة المجموعات. يمكنك بعد ذلك إضافة
استثناءات لفهرسة الحقول المطلوبة لطلبات البحث فقط. يؤدي تقليل عدد الحقول المفهرَسة إلى خفض تكاليف التخزين ويمكن أن يحسّن أداء الكتابة.
إذا أنشأت استثناءً من الفهرسة لحقل خريطة، ترث الحقول الفرعية للخريطة هذه الإعدادات. ومع ذلك، يمكنك تحديد إعفاءات الفهرسة لحقول فرعية معيّنة. إذا حذفت استثناءً لحقل فرعي، فسيرث الحقل الفرعي إعدادات الاستثناء الخاصة بالحقل الرئيسي، إذا كانت موجودة، أو الإعدادات على مستوى قاعدة البيانات في حال عدم وجود استثناءات رئيسية.
لإنشاء استثناءات الفهرسة التلقائية وإدارتها، يُرجى الاطّلاع على مقالة إدارة الفهارس.
الفهارس اليدوية
يخزّن الفهرس اليدوي عملية ربط مرتّبة لجميع المستندات في مجموعة، استنادًا إلى قائمة مرتبة من الحقول المطلوب فهرستها.
يستخدم Cloud Firestore الفهارس اليدوية لإتاحة طلبات البحث غير المتاحة من خلال الفهارس التلقائية.
تنشئ Cloud Firestore تلقائيًا فهارس أحادية الحقل لكل حقل موجود ضمن مجموعة. لا تنشئ Cloud Firestore فهارس تلقائيًا لمجموعات الحقول بسبب العدد الكبير من مجموعات الحقول المحتملة. بدلاً من ذلك، يساعدك Cloud Firestore في تحديد الفهارس المطلوبة وإنشائها أثناء إنشاء تطبيقك.
في أي وقت تحاول فيه إجراء طلب بحث غير متوافق مع فهرس حالي، تعرض Cloud Firestore رسالة خطأ تتضمّن رابطًا يمكنك اتّباعه لإنشاء الفهرس غير المتوفّر.
يمكنك أيضًا تحديد الفهارس وإدارتها يدويًا باستخدام وحدة التحكّم أو باستخدام Firebase CLI. لمزيد من المعلومات حول إنشاء الفهارس اليدوية وإدارتها، يُرجى الاطّلاع على إدارة الفهارس.
أوضاع الفهرسة ونطاقات طلبات البحث
يمكنك ضبط الفهارس التلقائية واليدوية بشكل مختلف، ولكن يتطلب كلاهما ضبط أوضاع الفهرس ونطاقات طلبات البحث لفهارسك.
أوضاع الفهرسة
عند تحديد فهرس، يمكنك اختيار وضع فهرسة لكل حقل مفهرَس. يتيح وضع الفهرسة لكل حقل استخدام عبارات طلب بحث محدّدة في هذا الحقل. يمكنك الاختيار من بين أوضاع الفهرسة التالية:
| وضع الفهرس | الوصف |
|---|---|
| تصاعدي | يتيح استخدام عبارات طلب البحث < و<= و== و>= و> و!= وin وnot-in في الحقل، كما يتيح ترتيب النتائج تصاعديًا استنادًا إلى قيمة هذا الحقل. |
| تنازلي | تتيح استخدام عبارات طلب البحث < و<= و== و>= و> و!= وin وnot-in في الحقل، كما تتيح ترتيب النتائج تنازليًا استنادًا إلى قيمة هذا الحقل. |
| Array‑contains | تتيح استخدام عبارات طلب البحث array-contains وarray-contains-any في الحقل. |
| Vector | يتيح استخدام عبارات طلب البحث FindNearest في الحقل. |
نطاقات طلب البحث
يتم تحديد نطاق كل فهرس إما لمجموعة أو لمجموعة من المجموعات. يُعرف هذا باسم نطاق طلب البحث في الفهرس:
- نطاق المجموعة تنشئ
- Cloud Firestore فهارس بنطاق المجموعة تلقائيًا. تتيح هذه الفهارس طلبات البحث التي تعرض نتائج من مجموعة واحدة.
- نطاق مجموعة المجموعات
- تتضمّن مجموعة المجموعات كل المجموعات التي لها معرّف المجموعة نفسه. لتشغيل طلب بحث لمجموعة يعرض نتائج تمت فلترتها أو ترتيبها من مجموعة، يجب إنشاء فهرس مطابق بنطاق مجموعة.
الترتيب التلقائي والحقل __name__
بالإضافة إلى ترتيب المستندات حسب أوضاع الفهرسة المحدّدة لكل حقل (تصاعديًا أو تنازليًا)، تطبّق الفهارس ترتيبًا نهائيًا حسب حقل __name__ لكل مستند. يتم ضبط قيمة الحقل __name__ على مسار المستند الكامل. وهذا يعني أنّ المستندات في مجموعة النتائج التي تحتوي على قيم الحقول نفسها يتم ترتيبها حسب مسار المستند.
يتم تلقائيًا ترتيب الحقل __name__ في الاتجاه نفسه لآخر حقل تم ترتيبه في تعريف الفهرس. على سبيل المثال:
| التجميع | الحقول التي تمت فهرستها | نطاق طلب البحث |
|---|---|---|
| المدن | name, __name__ |
التجميع |
| المدن | ولاية، __name__ |
التجميع |
| المدن | بلد، نسمة، __name__ |
التجميع |
لترتيب النتائج حسب اتجاه __name__ غير التلقائي، عليك
إنشاء هذا الفهرس.
خصائص الفهرس
يتم تحديد الفهرس الذي يسمح بتنفيذ طلب البحث بأكبر قدر من الكفاءة من خلال السمات التالية:
- الحقول المستخدَمة في فلاتر المساواة
- الحقول المستخدَمة في أنظمة الترتيب
- الحقول المستخدَمة في فلاتر النطاق وعدم المساواة (غير المضمّنة في أنظمة الترتيب)
- الحقول المستخدَمة في عمليات التجميع (غير المضمّنة في أنظمة الترتيب وفلاتر النطاق وعدم المساواة)
تحسب Cloud Firestore نتائج طلبات البحث على النحو التالي:
- يحدّد الفهرس المقابل لمجموعة طلب البحث وخصائص الفلتر وعوامل تشغيل الفلتر وأنظمة الترتيب.
- يحدّد موضع الفهرس الذي يبدأ منه المسح. يتم إلحاق موضع البدء بفلاتر المساواة في طلب البحث وينتهي بفلاتر النطاق وعدم المساواة في حقل
orderByالأول. - يبدأ فحص الفهرس، ويعرض كل مستند يستوفي جميع الفلاتر، إلى أن ينفّذ عملية الفحص أحد الإجراءات التالية:
- يواجه مستندًا لا يستوفي شروط الفلتر ويؤكّد أنّ أي مستند لاحق لن يستوفي شروط الفلتر بالكامل.
- يصل إلى نهاية الفهرس.
- تجمع هذه الدالة الحد الأقصى لعدد النتائج التي يطلبها طلب البحث.
مثال على الفهرسة
من خلال إنشاء فهارس أحادية الحقل تلقائيًا، تتيح Cloud Firestore لتطبيقك إمكانية دعم طلبات البحث الأساسية في قاعدة البيانات بسرعة.
تتيح لك الفهارس ذات الحقل الواحد إجراء طلبات بحث بسيطة استنادًا إلى قيم الحقول
والمقارنات < و<= و== و>= و> وin. بالنسبة إلى حقول الصفائف،
تتيح لك هذه الفلاتر إجراء طلبات بحث array-contains وarray-contains-any.
للتوضيح، افحص الأمثلة التالية من وجهة نظر إنشاء الفهرس. ينشئ المقتطف التالي بعض مستندات city في مجموعة cities ويضبط حقول name وstate وcountry وcapital وpopulation وregions لكل مستند:
الويب
var citiesRef = db.collection("cities"); citiesRef.doc("SF").set({ name: "San Francisco", state: "CA", country: "USA", capital: false, population: 860000, regions: ["west_coast", "norcal"] }); citiesRef.doc("LA").set({ name: "Los Angeles", state: "CA", country: "USA", capital: false, population: 3900000, regions: ["west_coast", "socal"] }); citiesRef.doc("DC").set({ name: "Washington, D.C.", state: null, country: "USA", capital: true, population: 680000, regions: ["east_coast"] }); citiesRef.doc("TOK").set({ name: "Tokyo", state: null, country: "Japan", capital: true, population: 9000000, regions: ["kanto", "honshu"] }); citiesRef.doc("BJ").set({ name: "Beijing", state: null, country: "China", capital: true, population: 21500000, regions: ["jingjinji", "hebei"] });
بافتراض إعدادات الفهرسة التلقائية، يحدّث Cloud Firestore فهرسًا تصاعديًا واحدًا لكل حقل، وفهرسًا تنازليًا واحدًا لكل حقل، وفهرسًا واحدًا من نوع array-contains لكل حقل مصفوفة. يمثّل كل صف في الجدول التالي إدخالاً في فهرس حقل واحد:
| التجميع | تمت فهرسة الحقل | نطاق طلب البحث |
|---|---|---|
| المدن | اسم | التجميع |
| المدن | ولاية واحدة () | التجميع |
| المدن | بلد واحد () | التجميع |
| المدن | كبير | التجميع |
| المدن | عدد السكان: | التجميع |
| المدن | منطقة | التجميع |
| المدن | اسم | التجميع |
| المدن | ولاية واحدة () | التجميع |
| المدن | بلد واحد () | التجميع |
| المدن | كبير | التجميع |
| المدن | عدد السكان: | التجميع |
| المدن | منطقة | التجميع |
| المدن | array-contains منطقة |
التجميع |
طلبات البحث المتوافقة مع الفهارس ذات الحقل الواحد
باستخدام هذه الفهارس ذات الحقل الواحد التي يتم إنشاؤها تلقائيًا، يمكنك تنفيذ طلبات بحث بسيطة مثل ما يلي:
الويب
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
يمكنك أيضًا إنشاء طلبات بحث in وطلبات بحث مركّبة عن المساواة (==):
الويب
citiesRef.where('country', 'in', ["USA", "Japan", "China"])
// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
.where("capital", "==", false)
.where("state", "==", "CA")
.where("population", "==", 860000)إذا كنت بحاجة إلى تنفيذ طلب بحث مركّب يستخدم مقارنة نطاق (< أو <= أو > أو >=) أو إذا كنت بحاجة إلى الترتيب حسب حقل مختلف، يجب إنشاء فهرس يدوي لطلب البحث هذا.
يتيح لك فهرس array-contains البحث في حقل الصفيفة regions:
الويب
citiesRef.where("regions", "array-contains", "west_coast") // array-contains-any and array-contains use the same indexes citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
طلبات البحث المتوافقة مع الفهارس اليدوية
يمكنك إنشاء فهارس يدوية لإتاحة طلبات البحث المركّبة التي لا تتيحها الفهارس التلقائية ذات الحقل الواحد. على سبيل المثال، ستحتاج إلى فهرس يدوي لطلبات البحث التالية:
الويب
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
.where("population", ">", 690000)تتطلّب طلبات البحث هذه الفهرس التالي. بما أنّ طلب البحث يستخدم
مساواة (== أو in) للحقل country، يمكنك استخدام
وضع الفهرس التصاعدي أو التنازلي لهذا الحقل. تطبّق عبارات عدم المساواة تلقائيًا نظام ترتيب تصاعدي استنادًا إلى الحقل في عبارة عدم المساواة.
| التجميع | الحقول التي تمت فهرستها | نطاق طلب البحث |
|---|---|---|
| المدن | (أو ) بلد، عدد السكان: | التجميع |
لتشغيل نفس طلبات البحث ولكن بنظام ترتيب تنازلي، تحتاج إلى فهرس إضافي في الاتجاه التنازلي لـ population:
الويب
citiesRef.where("country", "==", "USA").orderBy("population", "desc")
citiesRef.where("country", "==", "USA")
.where("population", "<", 3800000)
.orderBy("population", "desc")
citiesRef.where("country", "==", "USA")
.where("population", ">", 690000)
.orderBy("population", "desc")
citiesRef.where("country", "in", ["USA", "Japan", "China"])
.where("population", ">", 690000)
.orderBy("population", "desc")| التجميع | الحقول التي تمت فهرستها | نطاق طلب البحث |
|---|---|---|
| المدن | بلد واحد ()، عدد السكان: | التجميع |
| المدن | بلد، عدد السكان | التجميع |
لتجنُّب انخفاض الأداء الناتج عن دمج الفهارس،
ننصحك بإنشاء فهرس لدمج طلب بحث array-contains أو
array-contains-any مع عبارات إضافية:
الويب
citiesRef.where("regions", "array-contains", "east_coast") .where("capital", "==", true) // array-contains-any and array-contains use the same index citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"]) .where("capital", "==", true)
| التجميع | الحقول التي تمت فهرستها | نطاق طلب البحث |
|---|---|---|
| المدن | علامات array-contains، (أو ) بأحرف كبيرة | التجميع |
طلبات البحث المتوافقة مع فهارس مجموعة المجموعات
لتوضيح فهرس بنطاق مجموعة المجموعات، أضِف مجموعة فرعية باسم landmarks إلى بعض مستندات city:
الويب
var citiesRef = db.collection("cities"); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Bridge", category : "bridge" }); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Park", category : "park" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Gallery of Art", category : "museum" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Mall", category : "park" });
باستخدام الفهرس التالي للحقل الواحد مع نطاق المجموعة، يمكنك الاستعلام عن مجموعة landmarks لمدينة واحدة استنادًا إلى حقل category:
| التجميع | الحقول التي تمت فهرستها | نطاق طلب البحث |
|---|---|---|
| معالم | فئة (أو ) | التجميع |
الويب
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])إذا أردت الاستعلام عن المعالم في جميع المدن، على سبيل المثال،
يمكنك تنفيذ هذا الاستعلام على مجموعة المجموعات التي تتألف من جميع مجموعات landmarks. يجب أيضًا تفعيل فهرس landmarks أحادي الحقل مع
نطاق مجموعة المجموعات:
| التجميع | الحقول التي تمت فهرستها | نطاق طلب البحث |
|---|---|---|
| معالم | فئة (أو ) | مجموعة المجموعات |
بعد تفعيل هذا الفهرس، يمكنك إرسال طلب بحث إلى مجموعة المجموعات landmarks:
الويب
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
لتشغيل طلب بحث مجموعة يرجع نتائج تمت تصفيتها أو ترتيبها، يجب تمكين فهرس مقابل مع نطاق مجموعة. ومع ذلك، لا تتطلّب طلبات البحث في مجموعة المجموعات التي لا تفلتر النتائج أو ترتّبها أي تعريفات إضافية للفهرس.
على سبيل المثال، يمكنك تنفيذ طلب البحث التالي لمجموعة المجموعات بدون تفعيل فهرس إضافي:
الويب
db.collectionGroup("landmarks").get()إدخالات الفهرس
تحدّد الفهارس التي تم ضبطها في مشروعك وبنية المستند عدد إدخالات الفهرس للمستند. يتم احتساب إدخالات الفهرس ضمن الحدّ الأقصى لعدد إدخالات الفهرس.
يوضّح المثال التالي إدخالات الفهرس لمستند.
مستند
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
الفهارس التلقائية
- city_name ASC
- city_name DESC
- الأحياء بترتيب تصاعدي
- neighborhoods DESC
- درجات الحرارة تصاعديًا
- temperatures DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- neighborhoods Array Contains
الفهارس اليدوية
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
إدخالات الفهرس
تؤدي إعدادات الفهرسة هذه إلى إنشاء إدخالات الفهرس التالية للمستند:
| الفهرس | البيانات المفهرَسة |
|---|---|
| إدخالات الفهرس التلقائية | |
| city_name ASC | city_name: "San Francisco" |
| city_name DESC | city_name: "San Francisco" |
| الأحياء بترتيب تصاعدي | neighborhoods: ["Mission", "Downtown", "Marina"] |
| neighborhoods DESC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| درجات الحرارة تصاعديًا | temperatures: {summer: 67, winter: 55} |
| temperatures DESC | temperatures: {summer: 67, winter: 55} |
| temperatures.summer ASC | temperatures.summer: 67 |
| temperatures.summer DESC | temperatures.summer: 67 |
| temperatures.winter ASC | temperatures.winter: 55 |
| temperatures.winter DESC | temperatures.winter: 55 |
| neighborhoods Array Contains | neighborhoods: "Mission" |
| neighborhoods Array Contains | neighborhoods: "Downtown" |
| neighborhoods Array Contains | neighborhoods: "Marina" |
| إدخالات الفهرس اليدوية | |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name ASC, neighborhoods ARRAY | city_name: "القاهرة", neighborhoods: "وسط البلد" |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name DESC, neighborhoods ARRAY | city_name: "القاهرة", neighborhoods: "وسط البلد" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
الفهارس والأسعار
تساهم الفهارس في تكاليف التخزين لتطبيقك. لمزيد من المعلومات حول كيفية احتساب حجم مساحة التخزين للفهارس، يُرجى الاطّلاع على حجم إدخال الفهرس.
استخدام دمج الفهارس
على الرغم من أنّ Cloud Firestore يستخدم فهرسًا لكل طلب بحث، إلا أنّه لا يتطلب بالضرورة فهرسًا واحدًا لكل طلب بحث. بالنسبة إلى طلبات البحث التي تتضمّن عبارات مساواة (==) متعددة وعبارة orderBy اختيارية، يمكن لـ Cloud Firestore إعادة استخدام الفهارس الحالية. يمكن لـ "Cloud Firestore" دمج الفهارس لفلاتر المساواة البسيطة لإنشاء الفهارس اللازمة لطلبات البحث الأكبر التي تتضمّن مساواة.
يمكنك خفض تكاليف الفهرسة من خلال تحديد الحالات التي يمكنك فيها استخدام دمج الفهارس. على سبيل المثال، في مجموعة restaurants لتطبيق تقييم المطاعم:
مطعم
burgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
يستخدم هذا التطبيق طلبات بحث مثل ما يلي. يستخدم التطبيق مجموعات من عبارات المساواة
لـ category وcity وeditors_pick مع الترتيب دائمًا حسب
star_rating تصاعديًا:
الويب
db.collection("restaurants").where("category", "==", "burgers")
.orderBy("star_rating")
db.collection("restaurants").where("city", "==", "San Francisco")
.orderBy("star_rating")
db.collection("restaurants").where("category", "==", "burgers")
.where("city", "==", "San Francisco")
.orderBy("star_rating")
db.collection("restaurants").where("category", "==", "burgers")
.where("city", "==", "San Francisco")
.where("editors_pick", "==", true )
.orderBy("star_rating")يمكنك إنشاء فهرس لكل طلب بحث:
| التجميع | الحقول التي تمت فهرستها | نطاق طلب البحث |
|---|---|---|
| مطاعم | الفئة: ، التقييم بالنجوم: | التجميع |
| مطاعم | مدينة، تقييم بالنجوم | التجميع |
| مطاعم | فئة، مدينة، تقييم بالنجوم | التجميع |
| مطاعم | فئة، مدينة، editors_pick، star_rating | التجميع |
كحل أفضل، يمكنك تقليل عدد الفهارس من خلال الاستفادة من قدرة Cloud Firestore على دمج الفهارس لبنود المساواة:
| التجميع | الحقول التي تمت فهرستها | نطاق طلب البحث |
|---|---|---|
| مطاعم | الفئة: ، التقييم بالنجوم: | التجميع |
| مطاعم | مدينة، تقييم بالنجوم | التجميع |
| مطاعم | editors_pick و star_rating | التجميع |
لا تقتصر هذه المجموعة من الفهارس على كونها أصغر حجمًا، بل تتيح أيضًا طلبًا إضافيًا:
الويب
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")حدود الفهرسة
تنطبق الحدود التالية على الفهارس. لمزيد من المعلومات حول الحصص والحدود، يُرجى الاطّلاع على الحصص والحدود.
| الحدّ | التفاصيل |
|---|---|
| الحد الأقصى لعدد الفهارس المركّبة لقاعدة بيانات |
|
| الحد الأقصى لعدد إعدادات الحقل الواحد لقاعدة بيانات |
يمكن أن يحتوي إعداد واحد على مستوى الحقل على إعدادات متعددة للحقل نفسه. على سبيل المثال، يتم احتساب استثناء الفهرسة لحقل واحد وسياسة مدة صلاحية في الحقل نفسه كإعداد حقل واحد ضمن الحدّ الأقصى. |
|
الحد الأقصى لعدد إدخالات الفهرس لكل مستند |
40,000 عدد إدخالات الفهرس هو مجموع ما يلي لمستند معيّن:
لمعرفة كيف يحوّل Cloud Firestore مستندًا ومجموعة من الفهارس إلى إدخالات فهرس، يُرجى الاطّلاع على مثال عدد إدخالات الفهرس هذا. |
| الحد الأقصى لعدد الحقول في الفهرس المركّب | 100 |
| الحد الأقصى لحجم إدخال الفهرس |
7.5 كيلوبايت لمعرفة كيفية احتساب Cloud Firestore لحجم إدخال الفهرس، يُرجى الاطّلاع على حجم إدخال الفهرس. |
| الحد الأقصى لمجموع أحجام إدخالات فهرس المستند |
8 ميبيبايت الحجم الإجمالي هو مجموع ما يلي للمستند: |
| الحد الأقصى لحجم قيمة حقل مفهرَس |
1500 بايت يتم اقتطاع قيم الحقول التي تزيد عن 1500 بايت. وقد تؤدي طلبات البحث التي تتضمن قيم حقول مقتطعة إلى عرض نتائج غير متسقة. |
أفضل الممارسات المتعلقة بالفهرسة
بالنسبة إلى معظم التطبيقات، يمكنك الاعتماد على الفهرسة التلقائية وروابط رسائل الخطأ لإدارة الفهارس. ومع ذلك، قد تحتاج إلى إضافة استثناءات الفهرسة التلقائية في الحالات التالية:
| الحالة الإعرابية | الوصف |
|---|---|
| حقول السلاسل الكبيرة | إذا كان لديك حقل سلسلة يحتوي غالبًا على قيم سلاسل طويلة لا تستخدمها في طلبات البحث، يمكنك خفض تكاليف التخزين من خلال استثناء الحقل من الفهرسة. |
| معدلات كتابة عالية لمجموعة تحتوي على مستندات ذات قيم تسلسلية | إذا قمت بفهرسة حقل يزيد أو ينقص بشكل تسلسلي بين المستندات في مجموعة، مثل طابع زمني، فإن الحد الأقصى لمعدل الكتابة إلى المجموعة هو 500 كتابة في الثانية. إذا لم تكن تستعلم استنادًا إلى الحقل الذي يحتوي على قيم متسلسلة، يمكنك استثناء الحقل من الفهرسة لتجاوز هذا الحد. على سبيل المثال، في حالة استخدام إنترنت الأشياء مع معدل كتابة مرتفع، قد تقترب مجموعة تحتوي على مستندات تتضمّن حقل طابع زمني من الحدّ الأقصى البالغ 500 عملية كتابة في الثانية. |
| حقول TTL |
إذا كنت تستخدم سياسات مدة البقاء (TTL)، يُرجى العِلم أنّ حقل مدة البقاء يجب أن يكون طابعًا زمنيًا. تكون الفهرسة في حقول "مدة الصلاحية" مفعَّلة تلقائيًا ويمكن أن تؤثر في الأداء عند ارتفاع معدلات الزيارات. كأفضل ممارسة، أضِف استثناءات الفهرسة التلقائية لحقول TTL. |
| حقول مصفوفات أو خرائط كبيرة | يمكن أن تقترب حقول الصفائف أو الخرائط الكبيرة من الحدّ الأقصى البالغ 40,000 إدخال فهرس لكل مستند. إذا لم تكن تجري طلب بحث استنادًا إلى مصفوفة كبيرة أو حقل خريطة، عليك استثناؤه من الفهرسة. |
إذا كنت تستخدم طلبات بحث تتضمّن عوامل تشغيل النطاق وعدم المساواة في حقول متعدّدة، يُرجى الاطّلاع على اعتبارات الفهرسة التي يجب مراعاتها لتحسين أداء طلبات بحث Cloud Firestore وتكلفتها.
لمزيد من المعلومات حول كيفية حلّ مشاكل الفهرسة (توزيع الفهرس، أخطاء INVALID_ARGUMENT)، يُرجى الاطّلاع على صفحة تحديد المشاكل وحلّها.