ดัชนีเป็นปัจจัยสำคัญต่อประสิทธิภาพของฐานข้อมูล ดัชนีฐานข้อมูลจะจับคู่รายการในฐานข้อมูลกับตำแหน่งของรายการในฐานข้อมูล คล้ายกับดัชนีของหนังสือที่จับคู่หัวข้อในหนังสือกับหมายเลขหน้า เมื่อคุณค้นหาฐานข้อมูล ฐานข้อมูลจะใช้ดัชนีเพื่อระบุตำแหน่งของรายการที่คุณขอได้อย่างรวดเร็ว
หน้านี้อธิบายดัชนี 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
2-3 รายการในคอลเล็กชัน 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 รายการต่อฟิลด์ที่ไม่ใช่ อาร์เรย์ และดัชนีแบบฟิลด์เดียวที่ใช้ตัวดำเนินการ array-contains 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
) ได้ที่หน้าการแก้ปัญหา