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
- ไปที่ส่วน Cloud Firestore ของคอนโซล Firebase
- ไปที่แท็บดัชนี แล้วคลิกเพิ่มดัชนี
- ป้อนชื่อคอลเล็กชันและตั้งค่าช่องที่ต้องการจัดเรียงดัชนี
- คลิกสร้าง
ช่องดัชนีต้องเป็นไปตามข้อจำกัดเกี่ยวกับเส้นทางของช่อง
การสร้างดัชนีอาจใช้เวลา 2-3 นาที ทั้งนี้ขึ้นอยู่กับขนาดของข้อความค้นหา หลังจากสร้างแล้ว คุณจะเห็นดัชนีและสถานะดัชนีในส่วนดัชนีคอมโพสิต หากยังสร้างอยู่ คอนโซล Firebase จะมีแถบสถานะการสร้าง
นำดัชนีออก
วิธีลบดัชนี
- ไปที่ส่วน Cloud Firestore ของคอนโซล Firebase
- คลิกแท็บดัชนี
- วางเมาส์เหนือดัชนีที่ต้องการลบ แล้วเลือกลบจากเมนูบริบท
- ยืนยันว่าต้องการลบโดยคลิกลบจากข้อความแจ้ง
ใช้ 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 พบปัญหาเกี่ยวกับข้อมูลที่จัดทําดัชนี ในกรณีส่วนใหญ่ ปัญหานี้หมายความว่าคุณถึงขีดจํากัดของดัชนี เช่น การดำเนินการอาจมีรายการดัชนีถึงจำนวนสูงสุดต่อเอกสาร
หากการสร้างดัชนีไม่สำเร็จ คุณจะเห็นข้อความแสดงข้อผิดพลาดในคอนโซล หลังจากยืนยันว่าคุณไม่ได้ใช้ขีดจํากัดของดัชนีแล้ว ให้ลองดําเนินการกับดัชนีอีกครั้ง