تحسين طلبات البحث باستخدام فلاتر النطاق وعدم المساواة في حقول متعدّدة

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

قبل تحسين طلبات البحث، اطّلِع على المفاهيم ذات الصلة.

تحسين طلبات البحث باستخدام ميزة "شرح الطلب"

لتحديد ما إذا كانت طلبات البحث والفهارس مثالية، يمكنك استخدام شرح طلب البحث للحصول على ملخّص خطة طلب البحث وإحصاءات تنفيذه:

جافا

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"
        }
    }
}

الخطوات التالية