จัดการดัชนีใน Cloud Firestore

Cloud Firestore ช่วยให้มั่นใจถึงประสิทธิภาพการค้นหาโดยกำหนดให้ต้องมีดัชนีสำหรับการค้นหาทุกครั้ง ระบบจะสร้างดัชนีที่จำเป็นสำหรับการค้นหาพื้นฐานที่สุดให้คุณโดย อัตโนมัติ เมื่อคุณใช้และทดสอบแอป Cloud Firestore จะสร้างข้อความแสดงข้อผิดพลาดที่จะช่วยคุณสร้างดัชนีเพิ่มเติม ที่แอปต้องการ หน้านี้จะอธิบายวิธีจัดการดัชนี อัตโนมัติ ดัชนีที่สร้างด้วยตนเอง และดัชนีเวกเตอร์

สร้างดัชนีที่ขาดหายไปผ่านข้อความแสดงข้อผิดพลาด

หากคุณพยายามทำการค้นหาแบบผสมที่มีอนุประโยคช่วงซึ่งไม่ได้แมปกับดัชนีที่มีอยู่ คุณจะได้รับข้อผิดพลาด ข้อความแสดงข้อผิดพลาดจะมีลิงก์โดยตรงเพื่อสร้างดัชนีที่ขาดหายไปในคอนโซล Firebase

ทำตามลิงก์ที่สร้างขึ้นไปยังคอนโซล Firebase ตรวจสอบข้อมูลที่ป้อนโดยอัตโนมัติ แล้วคลิกสร้าง

ในกรณีที่ต้องใช้ดัชนีเวกเตอร์ ข้อความแสดงข้อผิดพลาดจะมีคำสั่ง Google Cloud CLI เพื่อสร้างดัชนีเวกเตอร์ที่ขาดหายไป เรียกใช้คำสั่งเพื่อสร้างดัชนีที่ขาดหายไป

บทบาทและสิทธิ์

ก่อนที่จะสร้างดัชนีใน Cloud Firestore ได้ โปรดตรวจสอบว่าคุณได้รับมอบหมายบทบาทใดบทบาทหนึ่งต่อไปนี้

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

หากคุณกำหนดบทบาทที่กำหนดเอง ให้มอบหมายสิทธิ์ทั้งหมดต่อไปนี้เพื่อสร้างดัชนี

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

ใช้คอนโซล Firebase

วิธีสร้างดัชนีใหม่ด้วยตนเองจากคอนโซล Firebase

รูปภาพของ
อินเทอร์เฟซการจัดทำดัชนี Firestore ในคอนโซล Firebase

  1. ในคอนโซล Firebase ให้ไปที่ฐานข้อมูลและพื้นที่เก็บข้อมูล > Firestore
  2. ในแท็บดัชนี ให้คลิกเพิ่มดัชนี
  3. ป้อนชื่อคอลเล็กชันและตั้งค่าช่องที่ต้องการใช้จัดเรียงดัชนี
  4. คลิกสร้าง

ช่องดัชนีต้อง เป็นไปตาม ข้อจำกัดของเส้นทางช่อง

การสร้างดัชนีอาจใช้เวลา 2-3 นาที ทั้งนี้ขึ้นอยู่กับขนาดของการค้นหา หลังจากสร้างดัชนีแล้ว คุณจะเห็นดัชนีและสถานะของดัชนีในส่วนดัชนีผสม หากดัชนียังอยู่ระหว่างการสร้าง คอนโซล Firebase จะแสดงแถบสถานะการสร้าง

นำดัชนีออก

วิธีลบดัชนี

  1. ในคอนโซล Firebase ให้ไปที่ฐานข้อมูลและพื้นที่เก็บข้อมูล > Firestore
  2. ในแท็บดัชนี ให้วางเมาส์เหนือดัชนีที่ต้องการลบ แล้วเลือกลบ จากเมนูบริบท
  3. ยืนยันว่าต้องการลบโดยคลิกลบ จากการแจ้งเตือน

ใช้ Firebase CLI

นอกจากนี้ คุณยังทำให้ดัชนีใช้งานได้ด้วย Firebase CLI ได้ด้วย หากต้องการเริ่มต้นใช้งาน ให้เรียกใช้ firebase init firestore ในไดเรกทอรีโปรเจ็กต์ ระหว่างการตั้งค่า Firebase CLI จะสร้างไฟล์ JSON ที่มีดัชนีเริ่มต้นในรูปแบบที่ถูกต้อง แก้ไขไฟล์เพื่อเพิ่มดัชนีเพิ่มเติมและทำให้ใช้งานได้ด้วยคำสั่ง firebase deploy

หากต้องการทำให้ดัชนีและกฎของ Cloud Firestore ใช้งานได้เท่านั้น ให้เพิ่มแฟล็ก --only firestore

หากคุณแก้ไขดัชนีโดยใช้คอนโซล Firebase โปรดตรวจสอบว่าได้อัปเดตไฟล์ดัชนีในเครื่องด้วย ดูข้อมูลอ้างอิงคำจำกัดความของดัชนี JSON

ใช้ Terraform

การสร้างดัชนีในฐานข้อมูล

ฐานข้อมูล Cloud Firestore สามารถมีดัชนีแบบช่องเดียว (อัตโนมัติ) และดัชนีผสม (ที่สร้างด้วยตนเอง) คุณสามารถแก้ไขไฟล์กำหนดค่า Terraform เพื่อสร้างดัชนีสำหรับฐานข้อมูลได้ ดัชนีอัตโนมัติและดัชนีที่สร้างด้วยตนเองใช้ประเภททรัพยากร Terraform ที่แตกต่างกัน (google_firestore_index และ google_firestore_field)

ดัชนีแบบช่องเดียว (อัตโนมัติ)

ไฟล์กำหนดค่า Terraform ตัวอย่างต่อไปนี้จะสร้างดัชนีแบบช่องเดียวในช่อง name ในคอลเล็กชัน chatrooms

firestore.tf

resource "random_id" "variable"{
  byte_length = 8
}

resource "google_firestore_field" "single-index" {
  project = "project-id"
  database = "database-id"
  collection = "chatrooms_${random_id.variable.hex}"
  field = "name"

  index_config {
    indexes {
        order = "ASCENDING"
        query_scope = "COLLECTION_GROUP"
    }
    indexes {
        array_config = "CONTAINS"
    }
  }

  ttl_config {}
}
  • แทนที่ project-id ด้วยรหัสโปรเจ็กต์ รหัสโปรเจ็กต์ต้องไม่ซ้ำกัน
  • แทนที่ database-id ด้วยรหัสฐานข้อมูล

ดัชนีผสม (ที่สร้างด้วยตนเอง)

ไฟล์กำหนดค่า Terraform ตัวอย่างต่อไปนี้จะสร้างดัชนีผสมสำหรับช่อง name และช่อง description ในคอลเล็กชัน chatrooms

firestore.tf

resource "google_firestore_index" "composite-index" {
  project = "project-id"
  database = "database-id"

  collection = "chatrooms"

  fields {
    field_path = "name"
    order      = "ASCENDING"
  }

  fields {
    field_path = "description"
    order      = "DESCENDING"
  }

}
  • แทนที่ project-id ด้วยรหัสโปรเจ็กต์ รหัสโปรเจ็กต์ต้องไม่ซ้ำกัน
  • แทนที่ database-id ด้วยรหัสฐานข้อมูล

ดัชนีเวกเตอร์

ไฟล์กำหนดค่า Terraform ตัวอย่างต่อไปนี้จะสร้างดัชนีเวกเตอร์ในช่อง embedding ในคอลเล็กชัน chatrooms

firestore.tf

resource "google_firestore_index" "vector-index" {
  project = "project-id"
  database = "database-id"
  collection = "chatrooms"

  fields {
    field_path = "__name__"
    order = "ASCENDING"
  }

  fields {
    field_path = "embedding"
    vector_config {
      dimension = 128
      flat {}
    }
  }
}
  • แทนที่ project-id ด้วยรหัสโปรเจ็กต์ รหัสโปรเจ็กต์ต้องไม่ซ้ำกัน
  • แทนที่ database-id ด้วยรหัสฐานข้อมูล

เวลาบิลด์ดัชนี

หากต้องการสร้างดัชนี Cloud Firestore ต้องตั้งค่าดัชนีก่อน แล้วจึงเติมข้อมูลที่มีอยู่ลงในดัชนี เวลาบิลด์ดัชนีคือผลรวมของเวลาตั้งค่าและเวลาเติมข้อมูล

  • การตั้งค่าดัชนีใช้เวลา 2-3 นาที เวลาสร้างดัชนีขั้นต่ำคือ 2-3 นาที แม้ว่าจะเป็นฐานข้อมูลที่ว่างเปล่าก็ตาม

  • เวลาเติมข้อมูลจะขึ้นอยู่กับปริมาณข้อมูลที่มีอยู่ซึ่งอยู่ในดัชนีใหม่ ค่าช่องที่ตรงกับคำจำกัดความของดัชนีมากเท่าใด การเติมข้อมูลลงในดัชนีก็จะใช้เวลานานขึ้นเท่านั้น

การสร้างดัชนีเป็นการดำเนินการที่ใช้เวลานาน

หลังจากที่คุณเริ่มสร้างดัชนี Cloud Firestore จะกำหนดชื่อที่ไม่ซ้ำกันให้กับการดำเนินการ ชื่อการดำเนินการจะมีคำนำหน้าเป็น projects/[PROJECT_ID]/databases/(default)/operations/ เช่น

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

อย่างไรก็ตาม คุณสามารถละเว้นคำนำหน้าเมื่อระบุชื่อการดำเนินการสำหรับคำสั่ง describe

แสดงรายการการดำเนินการที่ใช้เวลานานทั้งหมด

หากต้องการแสดงรายการการดำเนินการที่ใช้เวลานาน ให้ใช้คำสั่ง gcloud firestore operations list คำสั่งนี้จะแสดงรายการการดำเนินการที่กำลังดำเนินการอยู่และการดำเนินการที่เพิ่งเสร็จสมบูรณ์ ระบบจะแสดงรายการการดำเนินการเป็นเวลา 2-3 วันหลังจากเสร็จสมบูรณ์

gcloud firestore operations list

ตรวจสอบสถานะการดำเนินการ

คุณสามารถแสดงรายละเอียดของการดำเนินการเดียวแทนที่จะแสดงรายการการดำเนินการที่ใช้เวลานานทั้งหมดได้

gcloud firestore operations describe operation-name

การประมาณเวลาเสร็จสมบูรณ์

เมื่อการดำเนินการทำงานอยู่ ให้ดูค่าของช่อง state เพื่อดูสถานะโดยรวมของการดำเนินการ

คำขอสถานะของการดำเนินการที่ใช้เวลานานจะแสดงเมตริก workEstimated และ workCompleted ด้วย ระบบจะแสดงเมตริกเหล่านี้สำหรับจำนวนเอกสาร workEstimated แสดงจำนวนเอกสารทั้งหมดโดยประมาณที่การดำเนินการจะประมวลผล workCompleted แสดงจำนวนเอกสารที่ประมวลผลไปแล้ว หลังจากที่การดำเนินการเสร็จสมบูรณ์ workCompleted จะแสดงจำนวนเอกสารทั้งหมดที่ประมวลผลจริง ซึ่งอาจแตกต่างจากค่าของ workEstimated

นำ workCompleted มาหารด้วย workEstimated เพื่อประมาณความคืบหน้าคร่าวๆ การประมาณอาจไม่ถูกต้องเนื่องจากขึ้นอยู่กับการเก็บรวบรวมสถิติที่ล่าช้า

ตัวอย่างเช่น สถานะความคืบหน้าของการสร้างดัชนีมีดังนี้

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

เมื่อการดำเนินการเสร็จสิ้น คำอธิบายการดำเนินการจะมี "done": true ดูค่าของช่อง state field เพื่อดูผลลัพธ์ของการดำเนินการ หากไม่ได้ตั้งค่าช่อง done ในการตอบกลับ ค่าของช่องจะเป็น false อย่าพึ่งพาการมีอยู่ของค่า done สำหรับการดำเนินการที่กำลังดำเนินการอยู่

ข้อผิดพลาดในการสร้างดัชนี

คุณอาจพบข้อผิดพลาดในการสร้างดัชนีเมื่อจัดการดัชนีที่สร้างด้วยตนเองและการยกเว้นดัชนีอัตโนมัติ การดำเนินการจัดทำดัชนีอาจล้มเหลวหาก Cloud Firestore พบปัญหาเกี่ยวกับข้อมูลที่กำลังจัดทำดัชนี ซึ่งส่วนใหญ่มักหมายความว่าคุณถึงขีดจำกัดของดัชนี เช่น การดำเนินการอาจมีรายการดัชนีต่อเอกสารถึงจำนวนสูงสุดแล้ว

หากการสร้างดัชนีล้มเหลว คุณจะเห็นข้อความแสดงข้อผิดพลาดในคอนโซล หลังจาก ตรวจสอบแล้วว่าคุณไม่ได้ถึง ขีดจำกัดของดัชนี ให้ลองดำเนินการกับดัชนีอีกครั้ง