تقدّم هذه الصفحة أمثلة على استراتيجية الفهرسة التي يمكنك استخدامها للاستعلامات التي تتضمّن فلاتر النطاقات وعدم المساواة في حقول متعددة لتوفير تجربة فعالة للاستعلامات.
قبل تحسين طلبات البحث، اطّلِع على المفاهيم ذات الصلة.
تحسين طلبات البحث باستخدام ميزة "شرح الطلب"
لتحديد ما إذا كانت طلبات البحث والفهارس مثالية، يمكنك استخدام شرح طلب البحث للحصول على ملخّص خطة طلب البحث وإحصاءات تنفيذه:
جافا
Query q = db.collection("employees").whereGreaterThan("salary",
100000).whereGreaterThan("experience", 0);
ExplainResults<QuerySnapshot> explainResults = q.explain(ExplainOptions.builder().analyze(true).build()).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
ExecutionStats executionStats = metrics.getExecutionStats();
System.out.println(planSummary.getIndexesUsed());
System.out.println(stats.getResultsReturned());
System.out.println(stats.getExecutionDuration());
System.out.println(stats.getReadOperations());
System.out.println(stats.getDebugStats());
Node.js
let q = db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">",0);
let options = { analyze : 'true' };
let explainResults = await q.explain(options);
let planSummary = explainResults.metrics.planSummary;
let stats = explainResults.metrics.executionStats;
console.log(planSummary);
console.log(stats);
يوضّح المثال التالي كيف يؤدي استخدام ترتيب الفهرس الصحيح إلى تقليل عدد إدخالات الفهرس التي تفحصها Cloud Firestore.
طلبات البحث البسيطة
استنادًا إلى المثال السابق لمجموعة من الموظفين، فإنّ الطلب البسيط
الذي يتم تنفيذه باستخدام الفهرس (experience ASC, salary ASC)
هو كما يلي:
جافا
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("experience")
.orderBy("salary");
يفحص طلب البحث 95,000 إدخال في الفهرس لعرض خمسة مستندات فقط. بما أنّه لم يتم استيفاء عمود العبارة في الطلب، تتم قراءة عدد كبير من إدخالات الفهرس، ولكن يتم ترشيح تلك الإدخالات.
// Output query planning info { "indexesUsed": [ { "properties": "(experience ASC, salary ASC, __name__ ASC)", "query_scope": "Collection" } ], // Output Query Execution Stats "resultsReturned": "5", "executionDuration": "2.5s", "readOperations": "100", "debugStats": { "index_entries_scanned": "95000", "documents_scanned": "5", "billing_details": { "documents_billable": "5", "index_entries_billable": "95000", "small_ops": "0", "min_query_cost": "0" } } }
يمكنك استنتاج من خبرة المجال أنّ معظم الموظفين سيحصلون على بعض
الخبرة على الأقل، ولكن قلة منهم سيحصلون على راتب يزيد عن 100,000. استنادًا إلى هذه
الإحصاءات، يمكنك ملاحظة أنّ قيد salary
أكثر انتقائية من قيد
experience
. للتأثير في الفهرس الذي يستخدمه Cloud Firestore ل ejecutant طلب البحث، حدِّد عبارة orderBy
تطلب ترتيب قيد salary
قبل قيد experience
.
جافا
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("salary")
.orderBy("experience");
عند استخدام عبارة orderBy()
بشكل صريح لإضافة العبارة الشرطية،
يستخدم Cloud Firestore فهرس (salary ASC, experience ASC)
لتشغيل طلب البحث.
بما أنّ انتقائية فلتر النطاق الأول أعلى في هذا الاستعلام مقارنةً بالاستعلام السابق، يتم تنفيذ الاستعلام بشكل أسرع ويكون أكثر فعالية من حيث التكلفة.
// Output query planning info { "indexesUsed": [ { "properties": "(salary ASC, experience ASC, __name__ ASC)", "query_scope": "Collection" } ], // Output Query Execution Stats "resultsReturned": "5", "executionDuration": "0.2s", "readOperations": "6", "debugStats": { "index_entries_scanned": "1000", "documents_scanned": "5", "billing_details": { "documents_billable": "5", "index_entries_billable": "1000", "small_ops": "0", "min_query_cost": "0" } } }
الخطوات التالية
- اطّلِع على مزيد من المعلومات عن شرح طلبات البحث.
- أفضل الممارسات المتعلّقة بفهرسة المحتوى