จัดการดัชนีใน 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 สำหรับผลลัพธ์ของการดำเนินการ หากไม่ได้ตั้งค่าช่อง done ในการตอบกลับ ค่าของช่องจะเป็น false อย่าใช้ค่า done สำหรับการดำเนินการที่กำลังดำเนินการอยู่

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

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

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