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

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

تصف هذه الصفحة نوعي الفهارس التي تستخدمها Cloud Firestore، فهارس حقل واحد ومركب المؤشرات

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

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

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

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

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

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

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

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

أنواع الفهرس

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

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

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

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

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

  • لكل حقل بدون مصفوفة أو غير الخريطة، يحدد Cloud Firestore حقلين فهارس collection-scope ذات المجال الواحد، واحد في الوضع التصاعدي وواحد في الوضع التنازلي.

  • لكل حقل خريطة، تُنشئ 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-any في الحقل.
المتّجه تتيح استخدام عبارات طلب البحث في FindNearest في الحقل.

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

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

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

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

الترتيب التلقائي والحقل __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 و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

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

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

الفهرس البيانات المفهرَسة
إدخالات الفهرس أحادية الحقل
اسم المدينة (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")

حدود الفهرسة

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

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

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

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

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)، يمكنك الاطّلاع على صفحة تحديد المشاكل وحلّها.