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

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

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

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

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

جافا

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

يمكنك أن تستنتج من الخبرة في المجال أن معظم الموظفين سيكون لديهم على الأقل خبرة ولكن القليل منها سيكون له راتب أكثر من 100000. بناءً على ذلك سيظهر لك أن قيد salary أكثر انتقائية من القيد experience. للتأثير في الفهرس الذي تستخدمه Cloud Firestore وتنفيذ الاستعلام، وتحديد عبارة 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"
        }
    }
}

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