تُعد الفهارس عاملاً مهمًا في أداء قاعدة البيانات. وكما هو الحال مع فهرس الكتاب الذي يربط المواضيع بأرقام الصفحات، يربط فهرس قاعدة البيانات العناصر بمواقعها في قاعدة البيانات. عند طلب البحث في قاعدة بيانات، يمكن لقاعدة البيانات استخدام فهرس لتحديد مواقع العناصر التي طلبتها بسرعة.
توضّح هذه الصفحة نوعَي الفهارس اللذين تستخدمهما Cloud Firestore، وهما فهارس الحقل الواحد والفهارس المركّبة.
تعريف الفهرس وبنيته
يتم تحديد الفهرس في قائمة حقول مستند معيّن، مع وضع فهرس مطابق لكل حقل.
يحتوي الفهرس على إدخال لكل حقل تمّت تسميته في تعريف الفهرس. يتضمّن الفهرس جميع المستندات التي تشكّل النتائج المحتملة لطلبات البحث المستندة إلى الفهرس. لا يتم تضمين المستند في الفهرس إلا إذا كانت لديه قيمة مفهرسة محدّدة لكل حقل مستخدَم في الفهرس. إذا كان تعريف الفهرس يشير إلى حقل لم يتم ضبط أي قيمة له في المستند، لن يظهر هذا المستند في الفهرس. في هذه الحالة، لن يتم عرض المستند مطلقًا كنتيجة لأي طلب بحث يستند إلى الفهرس.
يتم ترتيب الفهرس المركّب حسب قيم الحقول، بالترتيب المحدّد في تعريف الفهرس.
فهرس لكل طلب بحث
إذا لم يكن هناك فهرس لطلب بحث، ستزحف معظم قواعد البيانات عبر محتوياتها عنصرًا تلو الآخر، وهي عملية بطيئة تزداد بطئًا مع نمو قاعدة البيانات. تضمن Cloud Firestore أداءً عاليًا لطلبات البحث من خلال استخدام الفهارس لكل طلبات البحث. نتيجةً لذلك، يعتمد أداء طلب البحث على حجم مجموعة النتائج وليس على عدد العناصر في قاعدة البيانات.
تقليل إدارة الفهرس وزيادة تطوير التطبيقات
يتضمّن Cloud Firestore ميزات تقلّل الوقت الذي تحتاجه لإدارة الفهرس. يتم إنشاء الفهارس المطلوبة لأبسط طلبات البحث تلقائيًا. أثناء استخدام تطبيقك واختباره، تساعدك Cloud Firestore في تحديد إنشاء فهارس إضافية يتطلّبها تطبيقك.
أنواع الفهارس
تستخدم Cloud Firestore نوعَين من الفهارس: فهرس الحقل الواحد والفهرس المركّب. بالإضافة إلى عدد الحقول المفهرسة، تختلف الفهارس ذات الحقل الواحد والفهارس المركّبة في طريقة إدارتها.
فهارس الحقل الواحد
يخزّن الفهرس ذو الحقل الواحد عملية ربط مرتّبة لجميع المستندات في مجموعة تحتوي على حقل معيّن. يسجّل كل إدخال في فهرس ذي حقل واحد قيمة مستند لحقل معيّن وموقع المستند في قاعدة البيانات. تستخدم Cloud Firestore هذه الفهارس لتنفيذ العديد من طلبات البحث الأساسية. يمكنك إدارة فهارس الحقل الواحد من خلال ضبط إعدادات الفهرسة التلقائية وإعفاءات الفهرس في قاعدة البيانات.
الفهرسة التلقائية
بشكل تلقائي، تحتفظ Cloud Firestore تلقائيًا بفهارس الحقل الفردي لكل حقل في المستند ولكل حقل فرعي في الخريطة. تستخدم Cloud Firestore الإعدادات التلقائية التالية لفهارس الحقل الواحد:
بالنسبة إلى كل حقل غير صفيف وغير خريطة، يحدّد Cloud Firestore فهرسين بنطاق المجموعة لحقل واحد، أحدهما في الوضع التصاعدي والآخر في الوضع التنازلي.
بالنسبة إلى كل حقل خريطة، تنشئ Cloud Firestore ما يلي:
- فهرس تصاعدي واحد على مستوى المجموعة لكل حقل فرعي غير مصفوفة وغير خريطة
- فهرس واحد تنازلي على مستوى المجموعة لكل حقل فرعي غير مصفوفة وغير خريطة
- فهرس واحد من نوع array-contains على مستوى المجموعة لكل حقل فرعي من نوع مصفوفة
- يتم فهرسة كل حقل فرعي للخريطة بشكل متكرر باستخدام Cloud Firestore.
بالنسبة إلى كل حقل مصفوفة في مستند، ينشئ Cloud Firestore ويحتفظ بفهرس array-contains على مستوى المجموعة.
لا يتم تلقائيًا الاحتفاظ بفهارس الحقل الواحد التي تتضمّن نطاق مجموعة المجموعة.
استثناءات الفهرس ذي الحقل الواحد
يمكنك استثناء حقل من إعدادات الفهرسة التلقائية من خلال إنشاء استثناء لفهرسة حقل واحد. يؤدي استثناء الفهرسة إلى إلغاء إعدادات الفهرسة التلقائية على مستوى قاعدة البيانات. يمكن أن يتيح الاستثناء فهرسًا ذا حقل واحد كانت إعدادات الفهرسة التلقائية ستوقفه، أو أن يوقف فهرسًا ذا حقل واحد كانت الفهرسة التلقائية ستتيحه. للاطّلاع على الحالات التي يمكن أن تكون فيها الإعفاءات مفيدة، يُرجى الرجوع إلى أفضل الممارسات المتعلّقة بالفهرسة.
استخدِم قيمة مسار الحقل *
لإضافة استثناءات الفهرس على مستوى المجموعة إلى جميع الحقول في مجموعة. على سبيل المثال، بالنسبة إلى مجموعة المجموعة comments
، اضبط مسار الحقل على *
لمطابقة جميع الحقول في مجموعة المجموعة comments
وأوقِف فهرسة جميع الحقول ضمن مجموعة المجموعة. يمكنك بعد ذلك إضافة استثناءات لفهرسة الحقول المطلوبة فقط للاستعلامات. يؤدي تقليل عدد الحقول المفهرسة إلى خفض تكاليف التخزين ويمكن أن يحسّن أداء الكتابة.
في حال إنشاء استثناء لفهرسة حقل واحد لحقل خريطة، سترث الحقول الفرعية للخريطة هذه الإعدادات. ومع ذلك، يمكنك تحديد استثناءات لفهرس الحقل الفردي لبعض الحقول الفرعية. في حال حذف استثناء لحقل فرعي، سيكتسب الحقل الفرعي إعدادات الاستثناء الخاصة بالحقل الرئيسي، إذا كانت متوفرة، أو الإعدادات على مستوى قاعدة البيانات إذا لم تتوفر استثناءات للحقل الرئيسي.
لإنشاء استثناءات لفهرس الحقل الفردي وإدارتها، يُرجى الاطّلاع على إدارة الفهارس.
المؤشرات المركّبة
يخزّن الفهرس المركّب عملية ربط مفروزة لجميع المستندات في مجموعة، استنادًا إلى قائمة مرتّبة بالحقول المطلوب فهرستها.
تستخدم Cloud Firestore فهارس مركّبة لتوفير الدعم للاستعلامات التي لا توفّرها فهارس الحقل الواحد.
لا تنشئ Cloud Firestore تلقائيًا فهارس مركّبة كما تفعل مع الفهارس ذات الحقل الواحد، وذلك بسبب العدد الكبير من المجموعات المحتملة للحقول. بدلاً من ذلك، تساعدك Cloud Firestore في تحديد وإنشاء فهارس مركّبة مطلوبة أثناء إنشاء تطبيقك.
في كل مرة تحاول فيها تنفيذ طلب بحث غير متوافق مع أحد الفهارس، تعرض Cloud Firestore رسالة خطأ تتضمّن رابطًا يمكنك اتّباعه لإنشاء الفهرس الناقص.
يمكنك أيضًا تحديد الفهارس المركّبة وإدارتها يدويًا باستخدام وحدة التحكّم أو واجهة سطر الأوامر (CLI) الخاصة بـ Firebase. لمزيد من المعلومات حول إنشاء الفهارس المركّبة وإدارتها، يُرجى الاطّلاع على إدارة الفهارس.
أوضاع الفهرس ونطاقات طلبات البحث
يتم ضبط الفهارس ذات الحقل الواحد والفهارس المركّبة بشكل مختلف، ولكن يتطلّب كلاهما ضبط أوضاع الفهرس ونطاقات طلب البحث للفهارس.
أوضاع الفهرس
عند تحديد فهرس، يمكنك اختيار وضع فهرس لكل حقل مفهرس. يتيح وضع الفهرس لكل حقل عبارات طلب بحث محدّدة في هذا الحقل. يمكنك الاختيار من بين أوضاع الفهرس التالية:
وضع الفهرس | الوصف |
---|---|
تصاعدي | يتوافق مع عبارات البحث < و<= و== و>= و> و!= و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__
غير التلقائي، عليك إنشاء هذا الفهرس.
خصائص الفهرس
يتم تحديد الفهرس الذي يسمح بتنفيذ طلب البحث بأكبر قدر من الكفاءة من خلال الخصائص التالية:
- الحقول المستخدَمة في فلاتر المساواة
- الحقول المستخدَمة في ترتيب الفرز
- الحقول المستخدَمة في فلاتر النطاق وعدم المساواة (غير المضمَّنة في ترتيبات الفرز)
- الحقول المستخدَمة في عمليات التجميع (التي لم يتم تضمينها في ترتيبات الفرز وفلاتر النطاق وعدم المساواة)
تحسب Cloud Firestore نتائج الاستعلامات على النحو التالي:
- تحدّد هذه السمة الفهرس الذي يتوافق مع مجموعة البحث وخصائص الفلتر وعوامل تشغيل الفلتر وترتيبات الفرز.
- تحدّد موضع الفهرس الذي تبدأ منه عملية المسح. يتم تحديد موضع البدء باستخدام فلاتر المساواة الخاصة بطلب البحث وينتهي بفلاتر النطاق وعدم المساواة في الحقل الأول
orderBy
. - يبدأ في فحص الفهرس، ويعرض كل مستند يستوفي جميع الفلاتر، إلى أن تنفّذ عملية الفحص أحد الإجراءات التالية:
- يصادف مستندًا لا يستوفي شروط الفلتر ويتأكّد من أنّ أي مستند لاحق لن يستوفي شروط الفلتر بالكامل.
- يصل إلى نهاية الفهرس.
- تجمع هذه السمة الحد الأقصى لعدد النتائج التي طلبها طلب البحث.
مثال على الفهرسة
من خلال إنشاء فهارس ذات حقل واحد تلقائيًا، يتيح 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"]
فهارس الحقل الواحد
- city_name ASC
- city_name DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- تحتوي مصفوفة الأحياء على (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 |
neighborhoods Array Contains ASC | الأحياء: "Mission" |
neighborhoods Array Contains DESC | الأحياء: "Mission" |
neighborhoods Array Contains ASC | الأحياء: "وسط المدينة" |
neighborhoods Array Contains DESC | الأحياء: "وسط المدينة" |
neighborhoods Array Contains ASC | الأحياء: "Marina" |
neighborhoods Array Contains DESC | الأحياء: "Marina" |
إدخالات الفهرس المركّب | |
city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
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: "San Francisco", neighborhoods: "Downtown" |
city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
المؤشرات والأسعار
تساهم الفهارس في تكاليف التخزين لتطبيقك. لمزيد من المعلومات حول كيفية احتساب حجم مساحة التخزين للفهارس، يُرجى الاطّلاع على حجم إدخال الفهرس.
استخدام دمج الفهارس
على الرغم من أنّ Cloud Firestore تستخدم فهرسًا لكل طلب بحث، إلا أنّها لا تتطلّب بالضرورة فهرسًا واحدًا لكل طلب بحث. بالنسبة إلى طلبات البحث التي تتضمّن عبارات مساواة متعدّدة (==
) وعبارة orderBy
اختيارية، يمكن أن تعيد Cloud Firestore استخدام الفهارس الحالية. يمكن لـ Cloud Firestore دمج الفهارس لفلاتر المساواة البسيطة من أجل إنشاء الفهارس المركّبة اللازمة لاستعلامات المساواة الأكبر.
يمكنك خفض تكاليف الفهرسة من خلال تحديد الحالات التي يمكنك فيها استخدام دمج الفهرس. على سبيل المثال، في مجموعة restaurants
لتطبيق تقييم المطاعم:
مطعم
burgerthymename : "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")
يمكنك إنشاء فهرس لكل طلب بحث:
التجميع | الحقول المفهرسة | نطاق طلب البحث |
---|---|---|
مطاعم | فئة | ، تقييم نجمةالتجميع |
مطاعم | مدينة، star_rating | التجميع |
مطاعم | category, city, star_rating | التجميع |
مطاعم | category و city و editors_pick و star_rating | التجميع |
كحلّ أفضل، يمكنك تقليل عدد الفهارس من خلال الاستفادة من قدرة Cloud Firestore على دمج الفهارس لعبارات المساواة:
التجميع | الحقول المفهرسة | نطاق طلب البحث |
---|---|---|
مطاعم | فئة | ، تقييم نجمةالتجميع |
مطاعم | مدينة، 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 عملية كتابة في الثانية. إذا لم تكن تستند في طلب البحث إلى الحقل الذي يتضمّن قيمًا تسلسلية، يمكنك استثناء الحقل من الفهرسة لتجاوز هذا الحد. في حالة استخدام إنترنت الأشياء (IoT) التي تتضمّن معدّل كتابة مرتفعًا، على سبيل المثال، قد تقترب المجموعة التي تحتوي على مستندات تتضمّن حقل طابع زمني من حدّ 500 عملية كتابة في الثانية. |
حقول مدة البقاء (TTL) |
إذا كنت تستخدم سياسات مدة البقاء (TTL)، يُرجى العِلم أنّ حقل مدة البقاء يجب أن يكون طابعًا زمنيًا. يتم تفعيل الفهرسة في حقول مدة البقاء تلقائيًا، ويمكن أن تؤثّر في الأداء عند معدّلات الزيارات الأعلى. وفقًا لأفضل الممارسات، أضِف إعفاءات من حقل واحد لحقول TTL. |
حقول الصفائف أو الخرائط الكبيرة | يمكن أن تقترب حقول الصفائف أو الخرائط الكبيرة من الحدّ الأقصى البالغ 40,000 إدخال فهرس لكل مستند. إذا كنت لا تستعلم استنادًا إلى حقل صفيف أو خريطة كبيرَين، عليك استبعاده من الفهرسة. |
إذا كنت تستخدم طلبات بحث مع عوامل تشغيل النطاق وعدم المساواة في حقول متعددة، اطّلِع على اعتبارات الفهرسة التي يجب مراعاتها لتحسين الأداء والتكلفة لطلبات البحث Cloud Firestore.
لمزيد من المعلومات حول كيفية حلّ مشاكل الفهرسة (توسيع نطاق الفهرس، أخطاء INVALID_ARGUMENT
)، يمكنك الاطّلاع على صفحة تحديد المشاكل وحلّها.