เพิ่มประสิทธิภาพการค้นหาด้วยตัวกรองช่วงและความไม่เท่ากันในช่องข้อมูลหลายช่อง

หน้านี้แสดงตัวอย่างกลยุทธ์การจัดทําดัชนีที่คุณสามารถใช้สําหรับการค้นหาด้วยตัวกรองช่วงและความไม่เท่าเทียมในหลายช่องเพื่อสร้างประสบการณ์การค้นหาที่มีประสิทธิภาพ

โปรดอ่านเกี่ยวกับแนวคิดที่เกี่ยวข้องก่อนที่จะเพิ่มประสิทธิภาพข้อความค้นหา

เพิ่มประสิทธิภาพการค้นหาด้วยคําอธิบายคําค้นหา

หากต้องการตรวจสอบว่าคําค้นหาและดัชนีมีประสิทธิภาพสูงสุดหรือไม่ ให้ใช้คําอธิบายการค้นหาเพื่อดูข้อมูลสรุปของแผนคําค้นหาและสถิติการดําเนินการของคําค้นหา

Java

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) มีดังนี้

Java

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .whereGreaterThan("experience", 0)
  .orderBy("experience")
  .orderBy("salary");

การค้นหาจะสแกนรายการดัชนี 95,000 รายการเพื่อแสดงผลเอกสารเพียง 5 รายการ เนื่องจากไม่ตรงกับนิพจน์เชิงตรรกะของคําค้นหา ระบบจึงอ่านรายการดัชนีจํานวนมากแต่กรองออก

// 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 ใช้เพื่อดำเนินการค้นหา ให้ระบุคำสั่ง orderBy ที่จัดเรียงข้อจำกัด salary ก่อนข้อจำกัด experience

Java

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

ขั้นตอนถัดไป