أنواع الفهرس في Cloud Firestore

تُعد الفهارس عاملاً مهمًا في أداء قاعدة البيانات. مثل فهرس الكتاب الذي يعين موضوعات في كتاب إلى أرقام الصفحة، يعين فهرس قاعدة البيانات العناصر في قاعدة البيانات إلى مواقعها في قاعدة البيانات. عندما ترسل استعلامًا إلى قاعدة بيانات، يمكن لقاعدة البيانات استخدام فهرس للبحث بسرعة عن مواقع العناصر التي طلبتها.

توضّح هذه الصفحة نوعَين من الفهارس التي تستخدمها Cloud Firestore، وهما فهارس أحادية الحقل وفهارس مركبة.

تعريف الفهرس وبنيته

يتم تحديد فهرس في قائمة من حقول مستند معيّن، مع وضع الفهرس المقابل لكل حقل.

يحتوي الفهرس على إدخال لكل حقل مسمّى في تعريف الفهرس. يشتمل الفهرس على جميع المستندات التي تمثل النتائج المحتملة لطلبات البحث المستندة إلى الفهرس. يتم تضمين المستند في الفهرس فقط إذا كان يحتوي على قيمة مفهرسة لكل حقل مستخدَم في الفهرس؛ وإذا كان تعريف الفهرس يشير إلى حقل لم يتم تعيين قيم له، فلن يظهر هذا المستند في الفهرس وبالتالي لن يتم عرضه على الإطلاق كنتيجة لأي استعلام يستند إلى الفهرس.

يتم فرز الفهرس المركب حسب قيم الحقول، بالترتيب المحدد في تعريف الفهرس.

فهرس وراء كل استعلام

في حال عدم وجود فهرس لطلب البحث، تزحف معظم قواعد البيانات إلى محتوياتها عنصرًا تلو الآخر، وهي عملية بطيئة تزيد بطءها مع نمو قاعدة البيانات. تضمن Cloud Firestore أداءً عاليًا لطلبات البحث من خلال استخدام فهارس لجميع طلبات البحث. نتيجة لذلك، يعتمد أداء الاستعلام على حجم مجموعة النتائج وليس على عدد العناصر في قاعدة البيانات.

إدارة الفهرسة بشكل أقل وتطوير التطبيقات بشكل أكبر

تتضمن Cloud Firestore ميزات تقلل من الوقت الذي تحتاجه لإدارة الفهارس. يتم إنشاء الفهارس المطلوبة لطلبات البحث الأساسية تلقائيًا من أجلك. أثناء استخدام تطبيقك واختباره، تساعدك Cloud Firestore في تحديد فهارس إضافية يحتاج إليها تطبيقك وإنشائها.

أنواع الفهرس

تستخدم Cloud Firestore نوعين من الفهارس: حقل واحد ومركب. وبالإضافة إلى عدد الحقول المفهرسة، تختلف الفهارس ذات الحقل الواحد والفهارس المركّبة في كيفية إدارتها.

فهارس أحادية الحقل

يخزن فهرس الحقل أحادي الحقل تعيينًا مصنفًا لجميع المستندات في مجموعة تحتوي على حقل معين. يسجل كل إدخال في فهرس أحادي الحقل قيمة المستند لحقل معين وموقع المستند في قاعدة البيانات. تستخدم Cloud Firestore هذه المؤشرات لإجراء العديد من الاستعلامات الأساسية. يمكنك إدارة فهارس الحقل الواحد من خلال ضبط إعدادات الفهرسة التلقائية واستثناءات الفهرس لقاعدة البيانات.

الفهرسة التلقائية

تحتفظ Cloud Firestore تلقائيًا بفهارس أحادية الحقل لكل حقل في المستند وكل حقل فرعي في الخريطة. تستخدم Cloud Firestore الإعدادات التلقائية التالية للفهارس الأحادية الحقل:

  • بالنسبة إلى كل حقل بدون مصفوفة أو غير مرتبط بالخريطة، تحدِّد Cloud Firestore فهارس حقلَين مفردَين على مستوى المجموعة، أحدهما في الوضع التصاعدي والآخر في الوضع التنازلي.

  • لكل حقل خريطة، تُنشئ Cloud Firestore ما يلي:

    • فهرس تصاعدي واحد على مستوى مجموعة لكل حقل فرعي بلا مصفوفة وغير مرتبط بالخريطة.
    • فهرس تنازلي على نطاق مجموعة واحد لكل حقل فرعي بلا مصفوفة وغير مرتبط بالخريطة.
    • تحتوي مصفوفة واحدة على مستوى المجموعة على فهرس لكل حقل فرعي للمصفوفة.
    • تفهرس Cloud Firestore بشكل متكرر كل حقل فرعي للخريطة.
  • لكل حقل صفيف في المستند، تُنشئ Cloud Firestore فهرسًا يحتوي على مصفوفة تتضمّن نطاق المجموعة وتحتفظ بها.

  • لا يتم تلقائيًا الاحتفاظ بفهارس الحقل الواحد التي تتضمن نطاق مجموعة المجموعات.

استثناءات الفهرس أحادي الحقل

يمكنك استثناء حقل من إعدادات الفهرسة التلقائية من خلال إنشاء استثناء فهرسة ذات حقل واحد. يؤدي الاستثناء من الفهرسة إلى إلغاء إعدادات الفهرس التلقائي على مستوى قاعدة البيانات. يمكن للاستثناء تفعيل فهرس أحادي الحقل الذي ستؤدي إعدادات الفهرسة التلقائية فيه إلى إيقاف أو إيقاف فهرس أحادي الحقل الذي ستفعِّله الفهرسة التلقائية بخلاف ذلك. للتعرّف على الحالات التي يمكن أن تكون فيها الاستثناءات مفيدة، يمكنك الاطّلاع على أفضل ممارسات الفهرسة.

استخدِم قيمة مسار الحقل * لإضافة استثناءات الفهرس على مستوى المجموعة في جميع الحقول في مجموعة مجموعات. مثلاً، بالنسبة إلى مجموعة المجموعات comments، يمكنك ضبط مسار الحقل على * لمطابقة جميع الحقول في مجموعة المجموعات comments وإيقاف فهرسة جميع الحقول ضمن مجموعة المجموعات. ويمكنك بعد ذلك إضافة استثناءات لفهرسة الحقول المطلوبة فقط لطلبات البحث. يؤدي تقليل عدد الحقول المفهرَسة إلى تقليل تكاليف التخزين ويمكن أن يؤدي إلى تحسين أداء الكتابة.

في حال إنشاء استثناء فهرسة ذات حقل واحد لحقل خريطة، تكتسب الحقول الفرعية للخريطة هذه الإعدادات. ومع ذلك، يمكنك تحديد استثناءات فهرس الحقل الواحد لحقول فرعية محددة. في حال حذف استثناء لحقل فرعي، سيكتسب الحقل الفرعي إعدادات الإعفاء المتعلّقة بالحقل الرئيسي إذا كانت متوفّرة، أو الإعدادات على مستوى قاعدة البيانات في حال عدم توفّر استثناءات رئيسية.

لإنشاء استثناءات فهرس الحقل الفردي وإدارتها، يُرجى الاطّلاع على إدارة الفهارس في Cloud Firestore.

الفهارس المركبة

يخزن الفهرس المركب تعيينًا مرتبًا لجميع المستندات في مجموعة، استنادا إلى قائمة مرتبة من الحقول المراد فهرستها.

تستخدم Cloud Firestore فهارس مركبة لإتاحة طلبات البحث غير المتوافقة حاليًا مع فهارس الحقل الواحد.

لا تنشئ Cloud Firestore فهارس مركبة تلقائيًا كما تفعل مع الفهارس الأحادية الحقل نظرًا للعدد الكبير من مجموعات الحقول المحتملة. بدلاً من ذلك، تساعدك Cloud Firestore في تحديد الفهارس المركبة المطلوبة وإنشاؤها أثناء إنشاء تطبيقك.

في أي وقت تحاول فيه إجراء طلب بحث غير متوافق مع الفهرس، سيعرض Cloud Firestore رسالة خطأ تحتوي على رابط يمكنك اتباعه لإنشاء الفهرس المفقود.

يمكنك أيضًا تعريف الفهارس المركبة وإدارتها يدويًا باستخدام وحدة التحكم أو باستخدام واجهة سطر الأوامر في Firebase. لمزيد من المعلومات حول إنشاء الفهارس المركبة وإدارتها، راجع إدارة الفهارس.

أوضاع الفهرس ونطاقات طلبات البحث

يمكنك ضبط الفهارس ذات الحقل الواحد والفهارس المركّبة بشكل مختلف، ولكن كلاهما يتطلب تهيئة أوضاع الفهرس ونطاقات طلبات البحث للفهارس الخاصة بك.

أوضاع الفهرس

عند تحديد فهرس، عليك اختيار وضع فهرسة لكل حقل مفهرَس. يدعم وضع الفهرس لكل حقل عبارات استعلام محددة في هذا الحقل. يمكنك الاختيار من بين أوضاع الفهرس التالية:

وضع الفهرس الوصف
تصاعدي تتيح هذه السمة استخدام عبارات طلب بحث في الحقل < و<= و== و>= و> و!= وin وnot-in، كما تتيح ترتيب النتائج تصاعديًا استنادًا إلى قيمة الحقل هذه.
ترتيب تنازلي تتيح هذه السمة استخدام عبارات طلب البحث < و<= و== و>= و> و!= وin وnot-in في الحقل، كما تتيح ترتيب النتائج تنازليًا استنادًا إلى قيمة الحقل هذه.
مصفوفة-تحتوي على تتيح هذه السمة استخدام فقرات طلب البحث array-contains وarray-contains-any في الحقل.
المتّجه تتيح استخدام عبارات طلب البحث في FindNearest في الحقل.

نطاقات طلبات البحث

يتم تحديد نطاق كل فهرس لمجموعة أو مجموعة مجموعات. يُعرف هذا باسم نطاق استعلام الفهرس:

نطاق المجموعة
تنشئ خدمة Cloud Firestore فهارس تتضمّن نطاق جمع البيانات تلقائيًا. وتدعم هذه الفهارس طلبات البحث التي تعرض نتائج من مجموعة واحدة.

نطاق مجموعة المختارات
تتضمّن مجموعة المجموعات كل المجموعات التي لها معرّف المجموعة نفسه. لتنفيذ طلب بحث في مجموعة مجموعات يعرض النتائج المفلترة أو المرتبة من مجموعة مجموعات، يجب إنشاء فهرس مطابق بنطاق مجموعة المجموعات.

الترتيب التلقائي والحقل __name__

بالإضافة إلى ترتيب المستندات حسب أوضاع الفهرسة المحددة لكل حقل (تصاعديًا أو تنازليًا)، تطبّق الفهارس ترتيبًا نهائيًا حسب الحقل __name__ في كل مستند. يتم ضبط قيمة الحقل __name__ على مسار المستند الكامل. هذا يعني أن المستندات الموجودة في مجموعة النتائج بنفس قيم الحقول يتم فرزها حسب مسار المستند.

يتم ترتيب الحقل __name__ تلقائيًا في الاتجاه نفسه لآخر حقل تم ترتيبه في تعريف الفهرس. على سبيل المثال:

التجميع الحقول التي تمت فهرستها نطاق طلب البحث
المدن اسم ، __name__ التجميع
المدن ولاية ، __name__ التجميع
المدن البلد، السكان، __name__ التجميع

لترتيب النتائج حسب الاتجاه غير التلقائي __name__، عليك إنشاء هذا الفهرس.

المؤشر المثالي

يتم تحديد الفهرس المثالي للاستعلام، الذي يسمح بتنفيذ الاستعلام بكفاءة أكبر، في الخصائص التالية، بالترتيب:

  1. الحقول المستخدَمة في فلاتر المساواة
  2. الحقول المستخدَمة في طلبات الترتيب
  3. الحقول المستخدَمة في فلاتر النطاقات وعدم المساواة (التي لم يتم تضمينها في طلبات الترتيب)
  4. الحقول المستخدَمة في التجميعات (التي لم يتم تضمينها بعد في طلبات الفرز وفلاتر النطاقات وعدم المساواة)

تحتسب Firestore نتائج طلبات البحث على النحو التالي:

  1. يحدد الفهرس المقابل لمجموعة طلب البحث، وخصائص الفلترة، وعوامل التصفية، وأوامر الترتيب.
  2. تحدِّد هذه السياسة موضع الفهرس لبدء المسح الضوئي عند استخدام فلاتر تساوي القيم في طلب البحث وفلاتر النطاق وعدم المساواة في الترتيب الأول حسب الحقل.
  3. يبدأ فحص الفهرس، مع عرض كل مستند يستوفي جميع الفلاتر، إلى أن:
    1. مستند لا يفي بشروط الفلتر ويؤكد أن أي مستند لاحق لن يفي بشروط الفلتر، أو
    2. وصولًا إلى نهاية الفهرس، أو
    3. قد جمع الحد الأقصى لعدد النتائج المطلوبة بواسطة طلب البحث

مثال على الفهرسة

من خلال إنشاء فهارس ذات حقل واحد تلقائيًا لك، تسمح خدمة Cloud Firestore لتطبيقك بالتوافق بسرعة مع الطلبات الأساسية في قواعد البيانات. تتيح لك فهارس الحقل الواحد إجراء طلبات بحث بسيطة استنادًا إلى قيم الحقول والمقارنات < و<= و== و>= و> وin. أمّا بالنسبة إلى حقول الصفيف، فهي تتيح لك إجراء طلبات بحث array-contains وarray-contains-any.

للتوضيح، اطّلِع على الأمثلة التالية من منظور إنشاء الفهرس. ينشئ المقتطف التالي بعض مستندات city في مجموعة cities، ويحدّد الحقول name وstate وcountry وcapital وpopulation وtags لكل مستند:

الويب
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 منطقة التجميع

طلبات البحث المتوافقة مع فهارس الحقل الواحد

باستخدام هذه الفهارس أحادية الحقل التي تم إنشاؤها تلقائيًا، يمكنك تشغيل استعلامات بسيطة مثل ما يلي:

الويب
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"])

طلبات البحث التي تعتمدها الفهارس المركّبة

تستخدم Cloud Firestore فهارس مركبة لإتاحة طلبات البحث المركبة التي لا تتوافق مع فهارس الحقل الواحد. على سبيل المثال، ستحتاج إلى فهرس مركب لطلبات البحث التالية:

الويب
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"]

فهارس حقل واحد

  • اسم_المدينة (ASC)
  • اسم_المدينة DESC
  • درجة الحرارة.الصيف ASC
  • درجات الحرارة.الصيف DESC
  • درجات الحرارة في الشتاء ASC
  • درجات الحرارة.شتاء DESC
  • مصفوفة الأحياء تحتوي على (ASC وDESC)

الفهارس المركبة

  • city_name ASC، الأحياء ARRAY
  • city_name DESC، الأحياء ARRAY

إدخالات الفهرس

ينتج عن تهيئة الفهرسة هذه الإدخالات الـ 18 التالية في الفهرس:

الفهرس البيانات المفهرَسة
إدخالات الفهرس أحادية الحقل
اسم_المدينة (ASC) city_name: "سان فرانسيسكو"
اسم_المدينة DESC city_name: "سان فرانسيسكو"
درجة الحرارة.الصيف ASC درجات الحرارة في الصيف: 67
درجات الحرارة.الصيف DESC درجات الحرارة في الصيف: 67
درجات الحرارة في الشتاء ASC درجات الحرارة في فصل الشتاء: 55
درجات الحرارة.شتاء DESC درجات الحرارة في فصل الشتاء: 55
مصفوفة الأحياء تحتوي على علامة ASC الأحياء: "المهمة"
مصفوفة الأحياء تحتوي على DESC الأحياء: "المهمة"
مصفوفة الأحياء تحتوي على علامة ASC الأحياء: "وسط المدينة"
مصفوفة الأحياء تحتوي على DESC الأحياء: "وسط المدينة"
مصفوفة الأحياء تحتوي على علامة ASC الأحياء: "مارينا"
مصفوفة الأحياء تحتوي على DESC الأحياء: "مارينا"
إدخالات الفهرس المركّبة
city_name ASC، الأحياء ARRAY city_name: "سان فرانسيسكو"، الأحياء: "المهمة"
city_name ASC، الأحياء ARRAY city_name: "سان فرانسيسكو"، الأحياء: "وسط المدينة"
city_name ASC، الأحياء ARRAY city_name: "سان فرانسيسكو"، الأحياء: "مارينا"
city_name DESC، الأحياء ARRAY city_name: "سان فرانسيسكو"، الأحياء: "المهمة"
city_name DESC، الأحياء ARRAY city_name: "سان فرانسيسكو"، الأحياء: "وسط المدينة"
city_name DESC، الأحياء ARRAY city_name: "سان فرانسيسكو"، الأحياء: "مارينا"

المؤشرات والأسعار

تساهم الفهارس في تكاليف التخزين لتطبيقك. لمزيد من المعلومات حول كيفية احتساب حجم التخزين للفهارس، يمكنك الاطّلاع على حجم إدخال الفهرس.

الاستفادة من دمج الفهرس

على الرغم من أنّ Cloud Firestore تستخدم فهرسًا لكل طلب بحث، لا تتطلّب بالضرورة فهرسًا واحدًا لكل طلب. بالنسبة إلى الطلبات التي تحتوي على عدة عبارات مساواة (==) بالإضافة إلى عبارة orderBy بشكل اختياري، يمكن لخدمة Cloud Firestore إعادة استخدام الفهارس الحالية. يمكن لـ Cloud Firestore دمج الفهارس لعوامل تصفية المساواة البسيطة لإنشاء الفهارس المركبة اللازمة لطلبات المساواة الأكبر.

يمكنك خفض تكاليف الفهرسة من خلال تحديد المواقف التي يمكنك فيها الاستفادة من دمج الفهرس. على سبيل المثال، تخيل مجموعة restaurants لتطبيق لتقييم المطاعم:

  • مطعمًا

    • برغر

      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")

يمكنك إنشاء فهرس لكل استعلام:

التجميع الحقول التي تمت فهرستها نطاق طلب البحث
المطاعم فئة ، تقييم النجوم: التجميع
المطاعم مدينة واحدة ()، تقييم نجمة التجميع
المطاعم فئة ، مدينة واحدة ()، تقييم_نجمة واحد () التجميع
المطاعم فئة ، مدينة ، publisher_pick، نجمة التجميع

ولتقديم حل أفضل، يمكنك تقليل عدد الفهارس من خلال الاستفادة من قدرة Cloud Firestore على دمج الفهارس لعبارات المساواة:

التجميع الحقول التي تمت فهرستها نطاق طلب البحث
المطاعم فئة ، تقييم النجوم: التجميع
المطاعم مدينة واحدة ()، تقييم نجمة التجميع
المطاعم Editor_pick، نجمة_تقييم التجميع

لا تقل هذه المجموعة من الفهارس فقط، بل تتيح أيضًا استعلامًا إضافيًا:

الويب
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

حدود الفهرسة

تنطبق الحدود التالية على الفهارس. بالنسبة إلى جميع الحصص والحدود، يُرجى الاطّلاع على الحصص والحدود.

الحدّ المسموح به التفاصيل
الحد الأقصى لعدد الفهارس المركبة لقاعدة بيانات
الحد الأقصى لعدد عمليات ضبط الحقل الواحد لقاعدة بيانات

ويمكن أن تحتوي الإعدادات على مستوى حقل واحد على إعدادات متعددة للحقل نفسه. على سبيل المثال، يتم احتساب الاستثناء من الفهرسة ذات الحقل الواحد وسياسة مدة البقاء في الحقل نفسه كضبط لحقل واحد ضمن الحدّ الأقصى.

الحد الأقصى لعدد إدخالات الفهرس لكل مستند

40,000

عدد إدخالات الفهرس هو مجموع ما يلي في أي مستند:

  • عدد إدخالات الفهرس ذات الحقل الواحد
  • عدد إدخالات الفهرس المركّبة

لمعرفة الطريقة التي تحوّل بها Cloud Firestore مستندًا ومجموعة من الفهارس إلى إدخالات فهرس، يُرجى الاطّلاع على مثال على عدد إدخالات الفهرس.

الحد الأقصى لعدد الحقول في الفهرس المركب 100
الحد الأقصى لحجم إدخال فهرس

7.5 كيبيبايت

للتعرّف على طريقة احتساب Cloud Firestore لحجم إدخال الفهرس، يمكنك الاطّلاع على حجم إدخال الفهرس.

الحد الأقصى لمجموع أحجام إدخالات الفهرس في المستند

8 مبيبايت

الحجم الإجمالي هو مجموع ما يلي في أي مستند:

  • مجموع حجم إدخالات الفهرس ذات الحقل الواحد لمستند
  • مجموع حجم إدخالات الفهرس المركّبة لمستند
  • الحد الأقصى لحجم قيمة حقل مفهرس

    1500 بايت

    يتم اقتطاع قيم الحقول التي تزيد عن 1500 بايت. قد تعرض طلبات البحث التي تتضمّن قيم حقول مقتطَعة نتائج غير متسقة.

    أفضل ممارسات الفهرسة

    بالنسبة إلى معظم التطبيقات، يمكنك الاعتماد على الفهرسة التلقائية وروابط رسائل الخطأ لإدارة الفهارس. ومع ذلك، يمكنك إضافة استثناءات ذات حقل واحد في الحالات التالية:

    الحالة الإعرابية الوصف
    حقول سلاسل كبيرة

    إذا كان لديك حقل سلسلة يحتوي غالبًا على قيم سلاسل طويلة لا تستخدمها في طلبات البحث، يمكنك خفض تكاليف التخزين من خلال استثناء الحقل من الفهرسة.

    معدّلات الكتابة المرتفعة لمجموعة تحتوي على مستندات ذات قيم تسلسلية

    في حال فهرسة حقل يزيد أو ينخفض بالتتابع بين المستندات في المجموعة، مثل الطابع الزمني، يكون الحدّ الأقصى لمعدّل الكتابة في المجموعة هو 500 عملية كتابة في الثانية. إذا لم تقدّم طلب البحث استنادًا إلى الحقل الذي يتضمّن قيمًا تسلسلية، يمكنك استثناء الحقل من الفهرسة لتجاوز هذا الحدّ.

    في حالة استخدام إنترنت الأشياء (IoT) ذات معدل الكتابة المرتفع، على سبيل المثال، قد تصل المجموعة التي تحتوي على مستندات ذات حقل طابع زمني إلى الحد الأقصى البالغ 500 عملية كتابة في الثانية.

    حقول TTL

    في حال استخدام سياسات مدة البقاء (TTL)، لاحِظ أنّ حقل مدة البقاء (TTL) يجب أن يكون طابعًا زمنيًا. يتم تفعيل الفهرسة في حقول TTL تلقائيًا، ويمكن أن تؤثر في الأداء عند ارتفاع معدلات الزيارات. ومن بين أفضل الممارسات، يمكنك إضافة استثناءات الحقل الواحد لحقول مدة البقاء (TTL).

    حقول ربط أو مصفوفة كبيرة

    يمكن أن تقترب حقول الصفيف أو الخريطة الكبيرة من الحد الأقصى المسموح به وهو 40,000 إدخال فهرس لكل مستند. إذا لم يكن تقديم طلب البحث يستند إلى صفيف كبير أو حقل خريطة، يجب استثناءه من الفهرسة.

    إذا كنت تستخدم طلبات بحث مع عوامل تشغيل النطاق وعدم المساواة في حقول متعدّدة، يُرجى الاطّلاع على اعتبارات الفهرسة التي يجب مراعاتها لتحسين أداء وتكاليف طلبات بحث Cloud Firestore

    للمزيد من المعلومات حول طريقة حلّ مشاكل الفهرسة (توزيع المحتوى في الفهرس، وأخطاء INVALID_ARGUMENT)، يمكنك الاطّلاع على صفحة تحديد المشاكل وحلّها.