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

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

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

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

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

جافا

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");

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

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

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