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

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