إنّ الفهارس هي عامل مهم في أداء قاعدة البيانات. تمامًا مثل فهرس الكتاب الذي يربط المواضيع في الكتاب بأرقام الصفحات، يربط فهرس قاعدة البيانات العناصر في قاعدة البيانات بمواقعها في قاعدة البيانات. عند إجراء طلب بحث في قاعدة بيانات، يمكن أن تستخدِم قاعدة البيانات فهرسًا لتحديد أماكن العناصر التي طلبتها بسرعة.
توضّح هذه الصفحة النوعَين من الفهارس التي يستخدمها 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__ |
اسم، التجميع |
المدن | __name__ |
state, التجميع |
المدن | __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 فهرسًا واحدًا تصاعديًا للحقل الفردي لكل حقل غير مصنّف، فهرسًا واحدًا تنازليًا للحقل الفردي لكل حقل غير مصنّف، فهرسًا واحدًا للحقل الفردي الذي يحتوي على صفيف لحقل الصفيف. يمثّل كل صف في الجدول التالي إدخالًا في فهرس حقل واحد:
التجميع | الحقل المفهرَس | نطاق طلب البحث |
---|---|---|
المدن | اسم | التجميع |
المدن | حالة | التجميع |
المدن | بلد واحد ( | )التجميع |
المدن | 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
- اسم_المدينة DESC
- درجة الحرارة.الصيف ASC
- temperatures.summer DESC
- درجات الحرارة في الشتاء ASC
- temperatures.winter DESC
- تحتوي مصفوفة neighborhoods على (ASC وDESC)
المؤشرات المركبة
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
إدخالات الفهرس
تؤدي إعدادات الفهرسة هذه إلى إدخالات الفهرس التالية للملف:
الفهرس | البيانات المفهرَسة |
---|---|
إدخالات الفهرس ذات الحقل الواحد | |
city_name ASC | city_name: "San Francisco" |
اسم_المدينة DESC | city_name: "سان فرانسيسكو" |
temperatures.summer ASC | درجات الحرارة في الصيف: 67 |
temperatures.summer DESC | temperatures.summer: 67 |
temperatures.winter ASC | temperatures.winter: 55 |
درجات الحرارة.شتاء DESC | درجات الحرارة في فصل الشتاء: 55 |
تحتوي صفيف الأحياء على ASC | الأحياء: "Mission" |
تحتوي مصفوفة neighborhoods على DESC | الأحياء: "Mission" |
تحتوي صفيف الأحياء على ASC | الأحياء: "وسط المدينة" |
تحتوي مصفوفة neighborhoods على DESC | الأحياء: "وسط المدينة" |
تحتوي صفيف الأحياء على ASC | الأحياء: "مارينا" |
تحتوي مصفوفة neighborhoods على DESC | الأحياء: "مارينا" |
إدخالات الفهرس المركب | |
city_name ASC, neighborhoods ARRAY | city_name: "سان فرانسيسكو"، neighborhoods: "Mission" |
city_name ASC، الأحياء ARRAY | city_name: "سان فرانسيسكو"، neighborhoods: "Downtown" |
city_name ASC, neighborhoods ARRAY | city_name: "سان فرانسيسكو"، neighborhoods: "مارينا" |
city_name DESC, neighborhoods ARRAY | city_name: "سان فرانسيسكو"، الأحياء: "المهمة" |
city_name DESC، الأحياء ARRAY | city_name: "سان فرانسيسكو"، neighborhoods: "Downtown" |
city_name DESC, neighborhoods ARRAY | city_name: "سان فرانسيسكو"، neighborhoods: "مارينا" |
المؤشرات والأسعار
تساهم الفهارس في تكاليف التخزين لتطبيقك. لمزيد من المعلومات حول كيفية احتساب حجم مساحة التخزين للفهراسات، يُرجى الاطّلاع على حجم إدخال الفهرس.
استخدام دمج الفهرس
على الرغم من أنّ 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")
يمكنك إنشاء فهرس لكل طلب بحث:
التجميع | الحقول المفهرَسة | نطاق طلب البحث |
---|---|---|
مطاعم | 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")
حدود الفهرسة
تنطبق الحدود التالية على الفهارس. لمزيد من المعلومات عن الحصص والحدود، يُرجى الاطّلاع على مقالة الحصص والحدود.
الحدّ المسموح به | التفاصيل |
---|---|
الحد الأقصى لعدد الفهارس المركبة لقاعدة بيانات |
|
الحد الأقصى لعدد عمليات ضبط الحقل الواحد لقاعدة بيانات |
ويمكن أن تحتوي الإعدادات على مستوى حقل واحد على إعدادات متعددة للحقل نفسه. على سبيل المثال، يتم احتساب الإعفاء من الفهرسة ذات الحقل الواحد وسياسة مدة البقاء في الحقل نفسه كضبط لحقل واحد ضمن الحدّ الأقصى. |
الحد الأقصى لعدد إدخالات الفهرس لكل مستند |
40,000 عدد إدخالات الفهرس هو مجموع ما يلي للمستند:
لمعرفة كيفية تحويل Cloud Firestore لمستند ومجموعة من الفهارس إلى إدخالات فهرس، اطّلِع على مثال عدد إدخالات الفهرس هذا. |
الحد الأقصى لعدد الحقول في فهرس مركب | 100 |
الحد الأقصى لحجم إدخال الفهرس |
7.5 كيلوبايت لمعرفة كيفية احتساب Cloud Firestore لحجم إدخال الفهرس، اطّلِع على حجم إدخال الفهرس. |
الحد الأقصى لمجموع أحجام إدخالات فهرس المستند |
8 ميغابايت الحجم الإجمالي هو مجموع ما يلي للمستند: |
الحد الأقصى لحجم قيمة حقل مفهرَس |
1500 بايت يتم اقتطاع قيم الحقول التي تزيد عن 1500 بايت. قد تعرض طلبات البحث التي تتضمّن قيم حقول مقتطَعة نتائج غير متسقة. |
أفضل الممارسات المتعلّقة بالفهرسة
في معظم التطبيقات، يمكنك الاعتماد على الفهرسة التلقائية وروابط رسائل الخطأ بهدف إدارة الفهارس. ومع ذلك، قد تحتاج إلى إضافة إعفاءات للحقول الفردية في الحالات التالية:
الحالة الإعرابية | الوصف |
---|---|
حقول سلاسل كبيرة | إذا كان لديك حقل سلسلة يحتوي غالبًا على قيم سلاسل طويلة لا تستخدمها في طلبات البحث، يمكنك خفض تكاليف التخزين من خلال استثناء الحقل من الفهرسة. |
معدّلات الكتابة المرتفعة لمجموعة تحتوي على مستندات ذات قيم تسلسلية | إذا أشرت إلى حقل يزداد أو ينقص بشكل تسلسلي بين المستندات في مجموعة، مثل الطابع الزمني، يكون الحد الأقصى لمعدّل الكتابة في مجموعة هو 500 عملية كتابة في الثانية. إذا كنت لا تطلب البحث استنادًا إلى الحقل الذي يحتوي على قيم تسلسلية، يمكنك إعفاء الحقل من الفهرسة لتجاوز هذا الحدّ. في أحد حالات استخدام إنترنت الأشياء التي تتضمن معدّل كتابة مرتفعًا، على سبيل المثال، قد تقترب مجموعة تحتوي على مستندات تتضمّن حقل طابع زمني من الحدّ الأقصى البالغ 500 عملية كتابة في الثانية. |
حقول TTL |
في حال استخدام سياسات مدة البقاء (TTL)، يجب أن يكون حقل TTL طابعًا زمنيًا. تكون الفهرسة في حقول مدة البقاء مفعّلة تلقائيًا ويمكن أن تؤثر في الأداء عند ارتفاع معدّلات الزيارات. من أفضل الممارسات إضافة إعفاءات للحقول الفردية لحقول TTL. |
صفيف كبير أو حقول خريطة | يمكن أن تقترب حقول المصفوفة الكبيرة أو الخريطة من الحدّ الأقصى المسموح به الذي يبلغ 40,000 إدخال فهرس لكل مستند. إذا لم تكن تطلب البيانات استنادًا إلى صفيف كبير أو حقل خريطة، يجب استثناؤه من الفهرسة. |
إذا كنت تستخدِم طلبات بحث تتضمّن عوامل تشغيل النطاقات وعدم المساواة في حقول متعدّدة، اطّلِع على ملاحظات الفهرسة التي يجب مراعاتها لتحسين أداء طلبات بحث Cloud Firestore وتقليل تكلفتها.
لمزيد من المعلومات حول طريقة حلّ مشاكل الفهرسة (توزيع المحتوى في الفهرس، وأخطاء INVALID_ARGUMENT
)، يمكنك الاطّلاع على صفحة تحديد المشاكل وحلّها.