أنواع الفهرس في 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 رسالة خطأ تتضمّن رابطًا يمكنك اتّباعه لإنشاء فهرس البحث المفقود.

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

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

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

أوضاع الفهرسة

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

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

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

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

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

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

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

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

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

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

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

خصائص الفهرس

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

  • الحقول المستخدَمة في فلاتر المساواة
  • الحقول المستخدَمة في ترتيبات الترتيب
  • الحقول المستخدَمة في فلاتر النطاقات وعدم المساواة (التي لم يتم تضمينها في أوامر الترتيب)
  • الحقول المستخدَمة في عمليات التجميع (التي لم يتم تضمينها في طلبات الترتيب والفلاتر المتعلّقة بالنطاقات وعدم المساواة)

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

  1. تُحدِّد الفهرس المقابل لمجموعة طلبات البحث، وخصائص الفلتر، وعوامل تشغيل الفلتر، وطلبات الترتيب.
  2. لتحديد موضع الفهرس الذي يبدأ منه المسح يتمّ وضع فلاتر المساواة في الطلب قبل موضع البدء، وينتهي بفلاتر النطاقات وعدم المساواة في الحقل orderBy الأوّل.
  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 فهرسًا واحدًا تصاعديًا للحقل الفردي لكل حقل غير مصنّف، فهرسًا واحدًا تنازليًا للحقل الفردي لكل حقل غير مصنّف، فهرسًا واحدًا للحقل الفردي الذي يحتوي على صفيف لحقل الصفيف. يمثّل كل صف في الجدول التالي إدخالًا في فهرس حقل واحد:

التجميع الحقل مفهرَس نطاق طلب البحث
المدن اسم التجميع
المدن حالة التجميع
المدن بلد واحد () التجميع
المدن capital التجميع
المدن عدد السكان التجميع
المدن اسم التجميع
المدن حالة التجميع
المدن بلد واحد () التجميع
المدن capital التجميع
المدن عدد السكان التجميع
المدن 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"]

الفهارس التي تتضمّن حقلًا واحدًا

  • city_name ASC
  • city_name DESC
  • temperatures.summer ASC
  • temperatures.summer DESC
  • temperatures.winter ASC
  • temperatures.winter DESC
  • تحتوي مصفوفة neighborhoods على (ASC وDESC)

المؤشرات المركبة

  • city_name ASC, neighborhoods ARRAY
  • city_name DESC, neighborhoods ARRAY

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

تؤدي إعدادات الفهرسة هذه إلى إدخالات الفهرس التالية للملف:

الفهرس البيانات المفهرَسة
إدخالات الفهرس ذات الحقل الواحد
city_name ASC city_name: "San Francisco"
city_name DESC city_name: "San Francisco"
temperatures.summer ASC temperatures.summer: 67
temperatures.summer DESC temperatures.summer: 67
temperatures.winter ASC temperatures.winter: 55
temperatures.winter DESC temperatures.winter: 55
تحتوي صفيف الأحياء على ASC الأحياء: "Mission"
تحتوي مصفوفة neighborhoods على DESC الأحياء: "Mission"
تحتوي صفيف الأحياء على ASC الأحياء: "وسط المدينة"
تحتوي مصفوفة neighborhoods على DESC الأحياء: "وسط المدينة"
تحتوي صفيف الأحياء على ASC الأحياء: "مارينا"
تحتوي مصفوفة neighborhoods على DESC الأحياء: "مارينا"
إدخالات الفهرس المركب
city_name ASC, neighborhoods ARRAY city_name: "سان فرانسيسكو"، neighborhoods: "Mission"
city_name ASC, neighborhoods ARRAY city_name: "سان فرانسيسكو"، neighborhoods: "Downtown"
city_name ASC, neighborhoods ARRAY city_name: "سان فرانسيسكو"، neighborhoods: "مارينا"
city_name DESC, neighborhoods ARRAY city_name: "سان فرانسيسكو"، neighborhoods: "Mission"
city_name DESC, neighborhoods ARRAY city_name: "سان فرانسيسكو"، neighborhoods: "Downtown"
city_name DESC, neighborhoods ARRAY city_name: "سان فرانسيسكو"، neighborhoods: "مارينا"

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

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

استخدام دمج الفهرس

على الرغم من أنّ 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")

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

التجميع الحقول المفهرَسة نطاق طلب البحث
مطاعم category، star_rating التجميع
مطاعم city, star_rating التجميع
مطاعم category, city, star_rating التجميع
مطاعم category، city، editors_pick، star_rating التجميع

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

التجميع الحقول المفهرَسة نطاق طلب البحث
مطاعم category، star_rating التجميع
مطاعم city, star_rating التجميع
مطاعم editors_pick، star_rating التجميع

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

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

حدود الفهرسة

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

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

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

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

40,000

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

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

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

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

‫7.5 كيلوبايت

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

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

8 ميغابايت

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

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

    1500 بايت

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

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

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

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

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

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

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

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

    حقول مدة البقاء (TTL)

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

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

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

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

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