จัดการดัชนีใน 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. คลิกสร้าง

ฟิลด์ดัชนีต้องเป็นไปตามข้อจำกัดเกี่ยวกับเส้นทางฟิลด์

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

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

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

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