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

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

توضّح هذه الصفحة نوعَي الفهارس اللذين تستخدمهما 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 نتائج طلبات البحث على النحو التالي:

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

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

من خلال إنشاء فهارس أحادية الحقل تلقائيًا، تتيح 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، (أو ) capital التجميع

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

لتوضيح فهرس بنطاق مجموعة المجموعات، أضِف مجموعة فرعية باسم 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 ASC
  • 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 ASC 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")

يمكنك إنشاء فهرس لكل طلب بحث:

التجميع الحقول التي تمت فهرستها نطاق طلب البحث
مطاعم فئة واحدة ()، تقييم واحد بالنجوم () التجميع
مطاعم city, star_rating التجميع
مطاعم ‫ فئة، مدينة، تقييم بالنجوم التجميع
مطاعم ‫ فئة، مدينة، editors_pick، star_rating التجميع

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

التجميع الحقول التي تمت فهرستها نطاق طلب البحث
مطاعم فئة واحدة ()، تقييم واحد بالنجوم () التجميع
مطاعم city, star_rating التجميع
مطاعم ‫ editors_pick،‏ star_rating التجميع

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

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

حدود الفهرسة

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

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

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

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

40,000

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

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

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

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

‫7.5 كيبيبايت

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

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

‫8 ميبيبايت

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

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

    ‫1,500 بايت

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

    أفضل الممارسات المتعلقة بالفهرسة

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

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

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

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

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

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

    حقول TTL

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

    حقول مصفوفات أو خرائط كبيرة

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

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

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