ดัชนีเป็นปัจจัยสำคัญต่อประสิทธิภาพของฐานข้อมูล ดัชนีฐานข้อมูลจะแมปรายการในฐานข้อมูลกับตำแหน่งของรายการในฐานข้อมูล คล้ายกับดัชนีของหนังสือที่แมปหัวข้อในหนังสือกับหมายเลขหน้า เมื่อคุณค้นหาฐานข้อมูล ฐานข้อมูลจะใช้ดัชนีเพื่อระบุตำแหน่งของรายการที่คุณขอได้อย่างรวดเร็ว
หน้านี้อธิบายดัชนี 2 ประเภทที่ Cloud Firestore ใช้ ได้แก่ ดัชนีช่องเดียวและดัชนีผสม
คำจำกัดความและโครงสร้างของดัชนี
ดัชนีจะกำหนดในรายการฟิลด์ของเอกสารที่กำหนด โดยมีโหมดดัชนีที่สอดคล้องกันสำหรับแต่ละฟิลด์
ดัชนีจะมีรายการสำหรับทุกช่องที่ตั้งชื่อไว้ในคำจำกัดความดัชนี ดัชนีประกอบด้วยเอกสารทั้งหมดซึ่งเป็นผลลัพธ์ที่เป็นไปได้สำหรับคำค้นหาที่อิงตาม ดัชนี ระบบจะรวมเอกสารไว้ในดัชนีก็ต่อเมื่อเอกสารมีค่าที่จัดทำดัชนี ซึ่งตั้งค่าไว้สำหรับทุกช่องที่ใช้ในดัชนี หากคำจำกัดความดัชนีอ้างอิงถึงฟิลด์ ที่เอกสารไม่ได้ตั้งค่าไว้ เอกสารนั้นจะไม่ปรากฏในดัชนี ในกรณีนี้ ระบบจะไม่แสดงเอกสารเป็นผลลัพธ์สำหรับคำค้นหาใดๆ ที่อิงตามดัชนี
ระบบจะจัดเรียงดัชนีแบบผสมตามค่าฟิลด์ตามลำดับที่ระบุไว้ใน คำจำกัดความดัชนี
ดัชนีที่อยู่เบื้องหลังทุกคำค้นหา
หากไม่มีดัชนีสำหรับการค้นหา ฐานข้อมูลส่วนใหญ่จะทำการ Crawl เนื้อหาทีละรายการ ซึ่งเป็นกระบวนการที่ช้าและจะช้าลงไปอีกเมื่อฐานข้อมูลมีขนาดใหญ่ขึ้น Cloud Firestore รับประกันประสิทธิภาพการค้นหาสูงโดยใช้ดัชนีสำหรับคำค้นหาทั้งหมด ด้วยเหตุนี้ ประสิทธิภาพการค้นหาจึงขึ้นอยู่กับขนาดของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล
จัดการดัชนีน้อยลง พัฒนาแอปได้มากขึ้น
Cloud Firestore มีฟีเจอร์ที่ช่วยลดเวลาที่คุณต้องใช้ในการจัดการดัชนี ระบบจะสร้างดัชนีที่จำเป็นสำหรับคำค้นหาพื้นฐานที่สุดให้คุณโดยอัตโนมัติ ขณะที่คุณใช้และทดสอบแอป Cloud Firestore จะช่วยคุณระบุและสร้างดัชนีเพิ่มเติมที่แอปต้องการ
ประเภทดัชนี
Cloud Firestore ใช้ดัชนี 2 ประเภท ได้แก่ ดัชนีช่องเดียวและดัชนีผสม นอกเหนือจากจำนวนฟิลด์ที่จัดทำดัชนีแล้ว ดัชนีแบบฟิลด์เดียวและดัชนีแบบผสมยังแตกต่างกันในวิธีจัดการ
ดัชนีแบบฟิลด์เดียว
ดัชนีฟิลด์เดียวจะจัดเก็บการแมปที่จัดเรียงของเอกสารทั้งหมดในคอลเล็กชันที่มีฟิลด์ที่เฉพาะเจาะจง แต่ละรายการในดัชนีแบบฟิลด์เดียว จะบันทึกค่าของเอกสารสำหรับฟิลด์ที่เฉพาะเจาะจงและตำแหน่งของเอกสาร ในฐานข้อมูล Cloud Firestore ใช้ดัชนีเหล่านี้เพื่อทำการค้นหาพื้นฐานหลายอย่าง คุณจัดการดัชนีแบบฟิลด์เดียวได้โดยการกำหนดค่า การตั้งค่าการจัดทำดัชนีอัตโนมัติและการยกเว้นดัชนีของฐานข้อมูล
การจัดทำดัชนีอัตโนมัติ
โดยค่าเริ่มต้น Cloud Firestore จะดูแลรักษาดัชนีแบบฟิลด์เดียวโดยอัตโนมัติ สำหรับแต่ละฟิลด์ในเอกสารและแต่ละฟิลด์ย่อยในแผนที่ Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีแบบฟิลด์เดียว
สำหรับฟิลด์ที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่ Cloud Firestore จะกำหนดดัชนีฟิลด์เดี่ยว 2 รายการระดับคอลเล็กชัน โดยรายการหนึ่งอยู่ในโหมดขึ้นและอีกรายการอยู่ในโหมดลง
สำหรับฟิลด์แผนที่แต่ละรายการ Cloud Firestore จะสร้างรายการต่อไปนี้
- ดัชนีที่เพิ่มขึ้นระดับคอลเล็กชัน 1 รายการสําหรับฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละรายการ
- ดัชนีจากมากไปน้อยระดับคอลเล็กชัน 1 รายการสำหรับฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละรายการ
- ดัชนี array-contains ระดับคอลเล็กชัน 1 รายการสําหรับฟิลด์ย่อยของอาร์เรย์แต่ละรายการ
- Cloud Firestore จะจัดทำดัชนีฟิลด์ย่อยของแผนที่แต่ละรายการแบบเรียกซ้ำ
สำหรับฟิลด์อาร์เรย์แต่ละรายการในเอกสาร Cloud Firestore จะสร้างและ ดูแลรักษาดัชนี array-contains ที่ระดับคอลเล็กชัน
ระบบจะไม่ดูแลดัชนีแบบฟิลด์เดียวที่มีขอบเขตกลุ่มคอลเล็กชันโดยค่าเริ่มต้น
การยกเว้นดัชนีช่องเดียว
คุณยกเว้นช่องจากการตั้งค่าการจัดทำดัชนีอัตโนมัติได้ โดยสร้างการยกเว้นดัชนีแบบช่องเดียว การยกเว้นการจัดทำดัชนีจะลบล้างการตั้งค่าดัชนีอัตโนมัติทั่วทั้งฐานข้อมูล การยกเว้นสามารถเปิดใช้ดัชนีแบบฟิลด์เดียวที่การตั้งค่าการจัดทำดัชนีอัตโนมัติ จะปิดใช้ หรือปิดใช้ดัชนีแบบฟิลด์เดียวที่การจัดทำดัชนีอัตโนมัติ จะเปิดใช้ สำหรับกรณีที่การยกเว้นอาจมีประโยชน์ โปรดดูแนวทางปฏิบัติแนะนำในการจัดทำดัชนี
ใช้ค่าเส้นทางฟิลด์ * เพื่อเพิ่มข้อยกเว้นดัชนีระดับคอลเล็กชันในฟิลด์ทั้งหมด
ในกลุ่มคอลเล็กชัน เช่น สำหรับกลุ่มคอลเล็กชัน comments ให้ตั้งค่าเส้นทางฟิลด์เป็น * เพื่อให้ตรงกับฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน comments และปิดใช้การจัดทำดัชนีของฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน จากนั้นคุณสามารถเพิ่มการยกเว้นเพื่อจัดทำดัชนีเฉพาะช่องที่จำเป็นสำหรับคำค้นหา การลด
จำนวนฟิลด์ที่จัดทำดัชนีจะช่วยลดค่าใช้จ่ายในการจัดเก็บและเพิ่มประสิทธิภาพการเขียน
ได้
หากคุณสร้างการยกเว้นดัชนีช่องเดียวสำหรับช่องแผนที่ ฟิลด์ย่อยของแผนที่จะรับช่วงการตั้งค่าเหล่านั้น อย่างไรก็ตาม คุณสามารถกำหนดข้อยกเว้นดัชนีแบบฟิลด์เดียวสำหรับฟิลด์ย่อยที่เฉพาะเจาะจงได้ หากคุณลบข้อยกเว้นสำหรับฟิลด์ย่อย ฟิลด์ย่อยจะรับช่วงการตั้งค่าข้อยกเว้นของฟิลด์หลัก (หากมี) หรือการตั้งค่า ทั่วทั้งฐานข้อมูลหากไม่มีข้อยกเว้นของฟิลด์หลัก
หากต้องการสร้างและจัดการข้อยกเว้นดัชนีแบบฟิลด์เดียว โปรดดู จัดการดัชนี
ดัชนีผสม
ดัชนีผสมจะจัดเก็บการแมปที่จัดเรียงของเอกสารทั้งหมดในคอลเล็กชัน โดยอิงตามรายการฟิลด์ที่จัดเรียงเพื่อจัดทำดัชนี
Cloud Firestore ใช้ดัชนีผสมเพื่อรองรับคำค้นหาที่ยังไม่ได้รับการรองรับโดยดัชนีช่องเดียว
Cloud Firestore ไม่ได้สร้างดัชนีผสมโดยอัตโนมัติเหมือนกับที่ทำสำหรับดัชนีช่องเดียว เนื่องจากมีชุดค่าผสมของช่องที่เป็นไปได้จำนวนมาก แต่ Cloud Firestore จะช่วยให้คุณระบุและสร้าง ดัชนีแบบผสมที่จำเป็นขณะสร้างแอป
เมื่อใดก็ตามที่คุณพยายามค้นหาที่ดัชนีไม่รองรับ Cloud Firestore จะแสดงข้อความแสดงข้อผิดพลาดพร้อมลิงก์ที่คุณใช้สร้างดัชนีที่ขาดหายไปได้
คุณยังกำหนดและจัดการดัชนีแบบผสมด้วยตนเองได้ โดยใช้คอนโซลหรือใช้ Firebase CLI ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและจัดการ ดัชนีแบบผสมได้ที่จัดการดัชนี
โหมดดัชนีและขอบเขตการค้นหา
คุณกำหนดค่าดัชนีแบบฟิลด์เดียวและดัชนีผสมแตกต่างกัน แต่ทั้ง 2 แบบต้องกำหนดค่าโหมดดัชนีและขอบเขตการค้นหาสำหรับดัชนี
โหมดดัชนี
เมื่อกำหนดดัชนี คุณจะต้องเลือกโหมดดัชนีสำหรับแต่ละฟิลด์ที่จัดทำดัชนี โหมดดัชนีของแต่ละฟิลด์รองรับกลไกการค้นหาที่เฉพาะเจาะจงในฟิลด์นั้น คุณเลือกโหมดดัชนีต่อไปนี้ได้
| โหมดดัชนี | คำอธิบาย |
|---|---|
| น้อยไปมาก | รองรับ <, <=, ==, >=, >, !=, in และ not-in, วลีการค้นหาในช่อง และรองรับการจัดเรียงผลลัพธ์จากน้อยไปมากตามค่าของช่องนี้ |
| มากไปน้อย | รองรับกลไกการค้นหา <, <=, ==, >=, >, !=, in และ not-in ในฟิลด์ และรองรับการจัดเรียงผลลัพธ์จากมากไปน้อยตามค่าของฟิลด์นี้ |
| มีในอาร์เรย์ | รองรับคําสั่งย่อยของคําค้นหา array-contains และ array-contains-any ในฟิลด์ |
| เวกเตอร์ | รองรับกลไกการค้นหา FindNearest ในช่อง |
ขอบเขตการค้นหา
ดัชนีแต่ละรายการจะมีขอบเขตเป็นคอลเล็กชันหรือกลุ่มคอลเล็กชัน ซึ่งเรียกว่าขอบเขตการค้นหาของดัชนี
- ขอบเขตคอลเล็กชัน
- Cloud Firestore จะสร้างดัชนีที่มีขอบเขตของคอลเล็กชันโดยค่าเริ่มต้น ดัชนีเหล่านี้รองรับการค้นหาที่แสดงผลลัพธ์จากคอลเล็กชันเดียว
- ขอบเขตกลุ่มคอลเล็กชัน
- กลุ่มคอลเล็กชันประกอบด้วยคอลเล็กชันทั้งหมดที่มีรหัสคอลเล็กชันเดียวกัน หากต้องการเรียกใช้การค้นหากลุ่มคอลเล็กชันที่แสดงผลลัพธ์ที่กรองแล้ว หรือจัดเรียงแล้วจากกลุ่มคอลเล็กชัน คุณต้องสร้างดัชนีที่เกี่ยวข้องซึ่งมีขอบเขตกลุ่มคอลเล็กชัน
การจัดเรียงเริ่มต้นและฟิลด์ __name__
นอกเหนือจากการจัดเรียงเอกสารตามโหมดดัชนีที่ระบุสำหรับแต่ละฟิลด์ (ขึ้นหรือลง) แล้ว ดัชนียังใช้การจัดเรียงขั้นสุดท้ายตามฟิลด์ __name__ ของแต่ละเอกสารด้วย ค่าของฟิลด์ __name__
จะตั้งเป็นเส้นทางเอกสารแบบเต็ม ซึ่งหมายความว่าเอกสาร
ในชุดผลลัพธ์ที่มีค่าฟิลด์เดียวกันจะได้รับการจัดเรียงตามเส้นทางเอกสาร
โดยค่าเริ่มต้น ระบบจะจัดเรียงฟิลด์ __name__ ในทิศทางเดียวกับฟิลด์ที่จัดเรียงล่าสุด
ในคําจํากัดความของดัชนี เช่น
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| เมือง | ชื่อ __name__ |
การรวบรวม |
| เมือง | รัฐ __name__ |
การรวบรวม |
| เมือง | ประเทศ ประชากร __name__ |
การรวบรวม |
หากต้องการจัดเรียงผลลัพธ์ตาม__name__ทิศทางที่ไม่ใช่ค่าเริ่มต้น คุณต้อง
สร้างดัชนีนั้น
พร็อพเพอร์ตี้ของดัชนี
ดัชนีที่ช่วยให้เรียกใช้การค้นหาได้อย่างมีประสิทธิภาพมากที่สุดจะกำหนดโดยพร็อพเพอร์ตี้ต่อไปนี้
- ฟิลด์ที่ใช้ในตัวกรองความเท่ากัน
- ฟิลด์ที่ใช้ในลำดับการจัดเรียง
- ฟิลด์ที่ใช้ในตัวกรองช่วงและตัวกรองความไม่เท่ากัน (ที่ยังไม่ได้รวมอยู่ในลำดับการจัดเรียง)
- ฟิลด์ที่ใช้ในการรวบรวม (ที่ยังไม่ได้รวมอยู่ในการจัดเรียงและตัวกรองช่วงและความไม่เท่ากัน)
Cloud Firestore จะคำนวณผลลัพธ์สำหรับคำค้นหาดังนี้
- ระบุดัชนีที่สอดคล้องกับคอลเล็กชันของคำค้นหา พร็อพเพอร์ตี้ตัวกรอง ตัวดำเนินการตัวกรอง และลำดับการจัดเรียง
- ระบุตำแหน่งดัชนีที่จะเริ่มการสแกน ตำแหน่งเริ่มต้นจะนำหน้าด้วยตัวกรองความเท่ากันของคำค้นหา และลงท้ายด้วยตัวกรองช่วงและตัวกรองความไม่เท่ากันในฟิลด์
orderByแรก - เริ่มสแกนดัชนี โดยจะแสดงเอกสารแต่ละรายการที่ตรงกับตัวกรองทั้งหมด จนกว่ากระบวนการสแกนจะทำอย่างใดอย่างหนึ่งต่อไปนี้
- พบเอกสารที่ไม่ตรงตามเงื่อนไขตัวกรองและยืนยันว่าเอกสารต่อๆ ไปจะไม่มีวันตรงตามเงื่อนไขตัวกรองอย่างสมบูรณ์
- ไปถึงจุดสิ้นสุดของดัชนี
- รวบรวมผลลัพธ์ตามจำนวนสูงสุดที่คำค้นหาขอ
ตัวอย่างการจัดทำดัชนี
การสร้างดัชนีแบบฟิลด์เดียวโดยอัตโนมัติช่วยให้แอปพลิเคชันของคุณรองรับการค้นหาฐานข้อมูลพื้นฐานที่สุดได้อย่างรวดเร็วCloud Firestore
ดัชนีแบบฟิลด์เดียวช่วยให้คุณทำการค้นหาอย่างง่ายตามค่าของฟิลด์
และตัวเปรียบเทียบ <, <=, ==, >=, > และ in สำหรับฟิลด์อาร์เรย์ ฟิลด์เหล่านี้จะช่วยให้คุณทำการค้นหา array-contains และ array-contains-any ได้
เพื่อเป็นการยกตัวอย่าง ให้ดูตัวอย่างต่อไปนี้จากมุมมองของการสร้างดัชนี
ข้อมูลโค้ดต่อไปนี้จะสร้างเอกสาร city ไม่กี่รายการในคอลเล็กชัน cities และตั้งค่าฟิลด์ name, state, country, capital, population และ tags สำหรับแต่ละเอกสาร
เว็บ
var citiesRef = db.collection("cities"); citiesRef.doc("SF").set({ name: "San Francisco", state: "CA", country: "USA", capital: false, population: 860000, regions: ["west_coast", "norcal"] }); citiesRef.doc("LA").set({ name: "Los Angeles", state: "CA", country: "USA", capital: false, population: 3900000, regions: ["west_coast", "socal"] }); citiesRef.doc("DC").set({ name: "Washington, D.C.", state: null, country: "USA", capital: true, population: 680000, regions: ["east_coast"] }); citiesRef.doc("TOK").set({ name: "Tokyo", state: null, country: "Japan", capital: true, population: 9000000, regions: ["kanto", "honshu"] }); citiesRef.doc("BJ").set({ name: "Beijing", state: null, country: "China", capital: true, population: 21500000, regions: ["jingjinji", "hebei"] });
เมื่อใช้การตั้งค่าการจัดทำดัชนีอัตโนมัติเริ่มต้น Cloud Firestore จะอัปเดต ดัชนีแบบฟิลด์เดียวที่เรียงจากน้อยไปมาก 1 รายการต่อฟิลด์ที่ไม่ใช่อาร์เรย์ ดัชนีแบบฟิลด์เดียวที่เรียงจากมากไปน้อย 1 รายการต่อฟิลด์ที่ไม่ใช่ อาร์เรย์ และดัชนีแบบฟิลด์เดียวที่ใช้การค้นหาอาร์เรย์ 1 รายการสำหรับ ฟิลด์อาร์เรย์ แต่ละแถวในตารางต่อไปนี้แสดงรายการในดัชนีแบบฟิลด์เดียว
| การรวบรวม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| เมือง | ชื่อ | การรวบรวม |
| เมือง | รัฐ | การรวบรวม |
| เมือง | ประเทศ | การรวบรวม |
| เมือง | เมืองหลวง | การรวบรวม |
| เมือง | ประชากร | การรวบรวม |
| เมือง | ชื่อ | การรวบรวม |
| เมือง | รัฐ | การรวบรวม |
| เมือง | ประเทศ | การรวบรวม |
| เมือง | เมืองหลวง | การรวบรวม |
| เมือง | ประชากร | การรวบรวม |
| เมือง | array-contains ภูมิภาค |
การรวบรวม |
การค้นหาที่ดัชนีช่องเดียวรองรับ
การใช้ดัชนีแบบฟิลด์เดียวที่สร้างขึ้นโดยอัตโนมัติเหล่านี้ คุณจะเรียกใช้การค้นหาอย่างง่ายได้ เช่น การค้นหาต่อไปนี้
เว็บ
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
นอกจากนี้ คุณยังสร้างการค้นหาinและ==ได้ด้วย
เว็บ
citiesRef.where('country', 'in', ["USA", "Japan", "China"])
// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
.where("capital", "==", false)
.where("state", "==", "CA")
.where("population", "==", 860000)หากต้องการเรียกใช้การค้นหาแบบผสมที่ใช้การเปรียบเทียบช่วง (<, <=,
> หรือ >=) หรือหากต้องการจัดเรียงตามฟิลด์อื่น คุณต้องสร้างดัชนีแบบผสมสำหรับการค้นหานั้น
array-contains ดัชนีช่วยให้คุณค้นหาฟิลด์อาร์เรย์ regions ได้
เว็บ
citiesRef.where("regions", "array-contains", "west_coast") // array-contains-any and array-contains use the same indexes citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
การค้นหาที่ดัชนีผสมรองรับ
Cloud Firestore ใช้ดัชนีผสมเพื่อรองรับการค้นหาแบบผสมที่ยังไม่ได้รับการรองรับโดยดัชนีช่องเดียว ตัวอย่างเช่น คุณ จะต้องมีดัชนีแบบผสมสำหรับการค้นหาต่อไปนี้
เว็บ
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
.where("population", ">", 690000)การค้นหาเหล่านี้ต้องใช้ดัชนีแบบรวมด้านล่าง เนื่องจากการค้นหาใช้
ความเท่ากัน (== หรือ in) สำหรับฟิลด์ country คุณจึงใช้
โหมดดัชนีจากน้อยไปมากหรือจากมากไปน้อยสำหรับฟิลด์นี้ได้ โดยค่าเริ่มต้น
ข้อความที่ระบุความไม่เท่ากันจะใช้ลำดับการจัดเรียงจากน้อยไปมากตามฟิลด์ใน
ข้อความที่ระบุความไม่เท่ากัน
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| เมือง | (หรือ ) ประเทศ ประชากร | การรวบรวม |
หากต้องการเรียกใช้การค้นหาเดียวกันแต่มีลำดับการจัดเรียงจากมากไปน้อย คุณ
ต้องมีดัชนีแบบผสมเพิ่มเติมในทิศทางจากมากไปน้อยสำหรับ population
เว็บ
citiesRef.where("country", "==", "USA").orderBy("population", "desc")
citiesRef.where("country", "==", "USA")
.where("population", "<", 3800000)
.orderBy("population", "desc")
citiesRef.where("country", "==", "USA")
.where("population", ">", 690000)
.orderBy("population", "desc")
citiesRef.where("country", "in", ["USA", "Japan", "China"])
.where("population", ">", 690000)
.orderBy("population", "desc")| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| เมือง | ประเทศ ประชากร | การรวบรวม |
| เมือง | ประเทศ ประชากร | การรวบรวม |
เพื่อหลีกเลี่ยงประสิทธิภาพที่ลดลงซึ่งเกิดจากการผสานดัชนี เราขอแนะนำให้คุณสร้าง
ดัชนีแบบผสมเพื่อรวมคำค้นหา array-contains หรือ array-contains-any
เข้ากับข้อความเพิ่มเติม
เว็บ
citiesRef.where("regions", "array-contains", "east_coast") .where("capital", "==", true) // array-contains-any and array-contains use the same index citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"]) .where("capital", "==", true)
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| เมือง | แท็ก array-contains, (หรือ ) ตัวพิมพ์ใหญ่ | การรวบรวม |
การค้นหาที่ดัชนีกลุ่มคอลเล็กชันรองรับ
หากต้องการสาธิตดัชนีที่มีขอบเขตกลุ่มคอลเล็กชัน ให้เพิ่มคอลเล็กชันย่อย landmarks ลงในเอกสาร city บางรายการ
เว็บ
var citiesRef = db.collection("cities"); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Bridge", category : "bridge" }); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Park", category : "park" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Gallery of Art", category : "museum" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Mall", category : "park" });
การใช้ดัชนีแบบฟิลด์เดียวต่อไปนี้ที่มีขอบเขตคอลเล็กชัน คุณจะค้นหาคอลเล็กชัน landmarks ของเมืองเดียวตามฟิลด์ category ได้
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| จุดสังเกต | หมวดหมู่ (หรือ ) | การรวบรวม |
เว็บ
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])หากคุณสนใจที่จะค้นหาสถานที่สำคัญในทุกเมือง เช่น
คุณเรียกใช้การค้นหานี้ในกลุ่มคอลเล็กชันที่ประกอบด้วยlandmarks
คอลเล็กชันทั้งหมด นอกจากนี้ คุณยังต้องเปิดใช้landmarksดัชนีแบบฟิลด์เดียวที่มีขอบเขตกลุ่มคอลเล็กชันด้วย
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| จุดสังเกต | หมวดหมู่ (หรือ ) | กลุ่มคอลเล็กชัน |
เมื่อเปิดใช้ดัชนีนี้ คุณจะค้นหากลุ่มคอลเล็กชัน landmarks ได้โดยใช้คำสั่งต่อไปนี้
เว็บ
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
หากต้องการเรียกใช้การค้นหากลุ่มคอลเล็กชันที่แสดงผลลัพธ์ที่กรองแล้ว หรือจัดเรียงแล้ว คุณต้องเปิดใช้ดัชนีแบบฟิลด์เดียวหรือดัชนีแบบรวมที่สอดคล้องกันซึ่งมีขอบเขตกลุ่มคอลเล็กชัน อย่างไรก็ตาม คำค้นหากลุ่มคอลเล็กชันที่ไม่ได้กรอง หรือจัดลำดับผลลัพธ์ไม่จำเป็นต้องมีคำจำกัดความดัชนีเพิ่มเติม
เช่น คุณสามารถเรียกใช้การค้นหากลุ่มคอลเล็กชันต่อไปนี้ได้โดยไม่ต้องเปิดใช้ดัชนีเพิ่มเติม
เว็บ
db.collectionGroup("landmarks").get()รายการดัชนี
ดัชนีที่กำหนดค่าไว้ของโปรเจ็กต์และโครงสร้างของเอกสารจะเป็นตัวกำหนด จำนวนรายการดัชนีสำหรับเอกสาร รายการดัชนีจะนับรวมในขีดจำกัดจำนวนรายการดัชนี
ตัวอย่างต่อไปนี้แสดงรายการดัชนีของเอกสาร
เอกสาร
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
ดัชนีแบบฟิลด์เดียว
- city_name ASC
- city_name DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- ย่านมีอาร์เรย์ (ASC และ DESC)
ดัชนีผสม
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
รายการดัชนี
การกำหนดค่าการจัดทำดัชนีนี้จะส่งผลให้เกิดรายการดัชนีต่อไปนี้สำหรับเอกสาร
| ดัชนี | ข้อมูลที่จัดทำดัชนี |
|---|---|
| รายการดัชนีแบบฟิลด์เดียว | |
| city_name ASC | city_name: "San Francisco" |
| city_name DESC | city_name: "San Francisco" |
| temperatures.summer ASC | temperatures.summer: 67 |
| temperatures.summer DESC | temperatures.summer: 67 |
| temperatures.winter ASC | temperatures.winter: 55 |
| temperatures.winter DESC | temperatures.winter: 55 |
| ย่านมีอาร์เรย์ ASC | ย่าน: "มิชชัน" |
| neighborhoods Array Contains DESC | ย่าน: "มิชชัน" |
| ย่านมีอาร์เรย์ ASC | ย่าน: "ดาวน์ทาวน์" |
| neighborhoods Array Contains DESC | ย่าน: "ดาวน์ทาวน์" |
| ย่านมีอาร์เรย์ ASC | ย่าน: "มารีน่า" |
| neighborhoods Array Contains DESC | ย่าน: "มารีน่า" |
| รายการดัชนีผสม | |
| city_name ASC, neighborhoods ARRAY | city_name: "ซานฟรานซิสโก", neighborhoods: "มิชชัน" |
| city_name ASC, neighborhoods ARRAY | city_name: "ซานฟรานซิสโก", neighborhoods: "ดาวน์ทาวน์" |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
| city_name DESC, neighborhoods ARRAY | city_name: "ซานฟรานซิสโก", neighborhoods: "มิชชัน" |
| city_name DESC, neighborhoods ARRAY | city_name: "ซานฟรานซิสโก", neighborhoods: "ดาวน์ทาวน์" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
ดัชนีและการกำหนดราคา
ดัชนีจะส่งผลต่อค่าใช้จ่ายในการจัดเก็บของแอปพลิเคชัน ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีคำนวณขนาดพื้นที่เก็บข้อมูลสำหรับดัชนีได้ที่ ขนาดรายการดัชนี
ใช้การผสานดัชนี
แม้ว่า Cloud Firestore จะใช้อินเด็กซ์สำหรับการค้นหาทุกครั้ง แต่ก็ไม่จำเป็นต้องมีอินเด็กซ์ 1 รายการต่อการค้นหา 1 ครั้ง สำหรับการค้นหาที่มีหลายคําสั่งเท่ากับ
(==) และอาจมีคําสั่ง orderBy Cloud Firestore สามารถ
ใช้ดัชนีที่มีอยู่ซ้ำได้ Cloud Firestore สามารถผสานดัชนีสำหรับตัวกรองความเท่ากันอย่างง่ายเพื่อสร้างดัชนีผสมที่จำเป็นสำหรับการค้นหาความเท่ากันที่ใหญ่ขึ้น
คุณลดต้นทุนการจัดทำดัชนีได้โดยระบุสถานการณ์ที่คุณใช้การผสานดัชนีได้ ตัวอย่างเช่น ในrestaurantsคอลเล็กชันสำหรับแอปให้คะแนนร้านอาหาร
ร้านอาหาร แห่ง
burgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
แอปนี้ใช้การค้นหา เช่น การค้นหาต่อไปนี้ แอปใช้ชุดค่าผสมของข้อความเท่ากันสำหรับ category, city และ editors_pick ขณะที่เรียงตาม star_rating จากน้อยไปมากเสมอ
เว็บ
db.collection("restaurants").where("category", "==", "burgers")
.orderBy("star_rating")
db.collection("restaurants").where("city", "==", "San Francisco")
.orderBy("star_rating")
db.collection("restaurants").where("category", "==", "burgers")
.where("city", "==", "San Francisco")
.orderBy("star_rating")
db.collection("restaurants").where("category", "==", "burgers")
.where("city", "==" "San Francisco")
.where("editors_pick", "==", true )
.orderBy("star_rating")คุณสร้างดัชนีสําหรับการค้นหาแต่ละรายการได้ดังนี้
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| ร้านอาหาร | หมวดหมู่ star_rating | การรวบรวม |
| ร้านอาหาร | city, star_rating | การรวบรวม |
| ร้านอาหาร | หมวดหมู่ เมือง star_rating | การรวบรวม |
| ร้านอาหาร | หมวดหมู่ เมือง Editors_Pick star_rating | การรวบรวม |
คุณสามารถลดจำนวนดัชนีได้โดยใช้ประโยชน์จากความสามารถของ Cloud Firestore ในการผสานดัชนีสำหรับข้อความที่ระบุความเท่ากัน ซึ่งเป็นวิธีแก้ปัญหาที่ดีกว่า
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| ร้านอาหาร | หมวดหมู่ star_rating | การรวบรวม |
| ร้านอาหาร | city, star_rating | การรวบรวม |
| ร้านอาหาร | editors_pick, star_rating | การรวบรวม |
ชุดดัชนีนี้ไม่เพียงมีขนาดเล็กลง แต่ยังรองรับการค้นหาเพิ่มเติมด้วย
เว็บ
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")ขีดจำกัดการจัดทำดัชนี
ดัชนีมีข้อจำกัดดังต่อไปนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโควต้าและขีดจำกัดได้ที่ โควต้าและขีดจำกัด
| ขีดจำกัด | รายละเอียด |
|---|---|
| จำนวนสูงสุดของดัชนีผสมสำหรับฐานข้อมูล |
|
| จำนวนสูงสุดของการกำหนดค่าฟิลด์เดียวสำหรับฐานข้อมูล |
การกำหนดค่าระดับฟิลด์ 1 รายการ สามารถมีการกำหนดค่าหลายรายการสำหรับฟิลด์เดียวกัน เช่น การยกเว้นการจัดทำดัชนีฟิลด์เดียวและนโยบาย TTL ในฟิลด์เดียวกัน จะนับเป็นการกำหนดค่าฟิลด์ 1 รายการในขีดจำกัด |
|
จำนวนรายการดัชนีสูงสุดสำหรับแต่ละเอกสาร |
40,000 จำนวนรายการดัชนีคือผลรวมของรายการต่อไปนี้สำหรับเอกสาร
หากต้องการดูวิธีที่ Cloud Firestore เปลี่ยนเอกสารและชุดดัชนีเป็นรายการดัชนี โปรดดูตัวอย่างการนับรายการดัชนีนี้ |
| จำนวนฟิลด์สูงสุดในดัชนีแบบผสม | 100 |
| ขนาดสูงสุดของรายการดัชนี |
7.5 KiB หากต้องการดูวิธีที่ Cloud Firestore คำนวณขนาดรายการดัชนี โปรดดู ขนาดรายการดัชนี |
| ผลรวมสูงสุดของขนาดรายการดัชนีของเอกสาร |
8 MiB ขนาดทั้งหมดคือผลรวมของรายการต่อไปนี้สำหรับเอกสาร |
| ขนาดสูงสุดของค่าฟิลด์ที่จัดทำดัชนี |
1500 ไบต์ ระบบจะตัดค่าฟิลด์ที่ยาวเกิน 1,500 ไบต์ การค้นหาที่มีค่าฟิลด์ที่ถูกตัดทอนอาจแสดงผลลัพธ์ที่ไม่สอดคล้องกัน |
แนวทางปฏิบัติแนะนำในการจัดทำดัชนี
สำหรับแอปส่วนใหญ่ คุณสามารถใช้การจัดทำดัชนีอัตโนมัติและลิงก์ข้อความแสดงข้อผิดพลาดเพื่อ จัดการดัชนี อย่างไรก็ตาม คุณอาจต้องการเพิ่มการยกเว้นแบบฟิลด์เดียวในกรณีต่อไปนี้
| การก | คำอธิบาย |
|---|---|
| ฟิลด์สตริงขนาดใหญ่ | หากมีฟิลด์สตริงที่มักจะมีค่าสตริงยาวๆ ซึ่ง คุณไม่ได้ใช้ในการค้นหา คุณจะลดค่าใช้จ่ายในการจัดเก็บได้โดยยกเว้นฟิลด์ จากการจัดทำดัชนี |
| อัตราการเขียนสูงไปยังคอลเล็กชันที่มีเอกสารที่มีค่าตามลําดับ | หากจัดทำดัชนีฟิลด์ที่เพิ่มขึ้นหรือลดลงตามลำดับระหว่างเอกสารในคอลเล็กชัน เช่น การประทับเวลา อัตราการเขียนสูงสุดไปยังคอลเล็กชันคือ 500 รายการต่อวินาที หากไม่ได้ค้นหาตามช่องที่มีค่าตามลําดับ คุณสามารถยกเว้นช่อง จากการจัดทําดัชนีเพื่อข้ามขีดจํากัดนี้ได้ ในกรณีการใช้งาน IoT ที่มีอัตราการเขียนสูง เช่น คอลเล็กชันที่มีเอกสารที่มีช่องการประทับเวลา อาจมีอัตราการเขียนใกล้ถึงขีดจำกัด 500 รายการต่อวินาที |
| ฟิลด์ TTL |
หากใช้นโยบาย TTL (Time to Live) โปรดทราบว่าฟิลด์ TTL ต้องเป็นไทม์สแตมป์ การจัดทำดัชนีในฟิลด์ TTL จะเปิดใช้โดยค่าเริ่มต้นและอาจ ส่งผลต่อประสิทธิภาพที่อัตราการเข้าชมที่สูงขึ้น แนวทางปฏิบัติแนะนำคือให้เพิ่ม การยกเว้นช่องเดี่ยวสำหรับช่อง TTL |
| ฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่ | ฟิลด์อาร์เรย์หรือฟิลด์แผนที่ขนาดใหญ่อาจมีรายการดัชนีได้เกือบ 40,000 รายการต่อเอกสาร หากไม่ได้ค้นหาตามอาร์เรย์หรือฟิลด์แผนที่ขนาดใหญ่ คุณควรยกเว้นฟิลด์ดังกล่าวจากการจัดทำดัชนี |
หากคุณใช้การค้นหาที่มีโอเปอเรเตอร์ช่วงและโอเปอเรเตอร์ความไม่เท่ากันในหลายฟิลด์ โปรดดูข้อควรพิจารณาในการจัดทำดัชนีที่คุณควรพิจารณาเพื่อเพิ่มประสิทธิภาพและลดต้นทุนของการค้นหา Cloud Firestore
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขปัญหาการจัดทำดัชนี (การกระจายดัชนี ข้อผิดพลาด INVALID_ARGUMENT) ได้ที่หน้าการแก้ปัญหา