จัดการดัชนีใน 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. ไปที่ส่วน Cloud Firestore ของ คอนโซล Firebase
  2. ไปที่แท็บดัชนี แล้วคลิกเพิ่มดัชนี
  3. ป้อนชื่อคอลเล็กชันและตั้งค่าช่องที่ต้องการใช้จัดลำดับดัชนี
  4. คลิกสร้าง

ช่องดั0}ต้อง เป็นไปตามข้อจำกัดของเส้นทางช่องconstraints on field paths

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

นำดัชนีออก

วิธีลบดัชนี

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

ใช้ 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 พบปัญหาเกี่ยวกับข้อมูลที่กำลังจัดทำดัชนี ซึ่งส่วนใหญ่มักหมายความว่าคุณถึงขีดจำกัดของดัชนีแล้ว เช่น การดำเนินการอาจมีรายการดัชนีต่อเอกสารถึงจำนวนสูงสุดแล้ว

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