ดัชนีเป็นปัจจัยสำคัญต่อประสิทธิภาพของฐานข้อมูล คล้ายกับ ดัชนีของหนังสือที่จับคู่หัวข้อในหนังสือกับเลขหน้า ดัชนีฐานข้อมูล จับคู่รายการในฐานข้อมูลกับตำแหน่งในฐานข้อมูล เมื่อคุณค้นหา ฐานข้อมูล ฐานข้อมูลสามารถใช้ดัชนีเพื่อระบุตำแหน่งของ รายการที่คุณขอ
หน้านี้อธิบายดัชนี 2 ประเภทที่ Cloud Firestore ใช้ ดัชนีช่องเดียวและแบบผสม ดัชนี
คำจำกัดความของดัชนีและโครงสร้าง
จะมีการกำหนดดัชนีไว้ในรายการช่องของเอกสารหนึ่งๆ พร้อมด้วย โหมดดัชนีที่เกี่ยวข้องสําหรับแต่ละช่อง
ดัชนีจะมีรายการสำหรับทุกฟิลด์ที่มีชื่ออยู่ในคำจำกัดความของดัชนี ดัชนี จะรวมเอกสารทั้งหมดที่เป็นผลลัพธ์ที่เป็นไปได้สำหรับคำค้นหาตาม ดัชนี เอกสารจะรวมอยู่ในดัชนีก็ต่อเมื่อมีค่าที่จัดทำดัชนีแล้วเท่านั้น ตั้งค่าสำหรับทุกฟิลด์ที่ใช้ในดัชนี หากคำจำกัดความของดัชนีอ้างอิงถึงช่อง ซึ่งเอกสารไม่ได้ตั้งค่าไว้ เอกสารนั้นจะไม่ปรากฏในดัชนี ในกรณีนี้ ระบบจะไม่แสดงผลเอกสารเป็นผลลัพธ์สำหรับการค้นหาตามดัชนี
ดัชนีผสมจะจัดเรียงตามค่าของช่อง ตามลำดับที่ระบุไว้ใน ของดัชนี
ดัชนีที่อยู่เบื้องหลังทุกคำค้นหา
ถ้าไม่มีดัชนีสำหรับการค้นหา ฐานข้อมูลส่วนใหญ่จะรวบรวมข้อมูลผ่านรายการเนื้อหา แต่ละรายการ กระบวนการทำงานที่ช้าลงซึ่งจะช้าลงไปอีกเมื่อฐานข้อมูลมีขนาดใหญ่ขึ้น Cloud Firestore รับประกันประสิทธิภาพการค้นหาที่สูงโดยใช้ดัชนีสำหรับ การค้นหาทั้งหมด ดังนั้น ประสิทธิภาพของการค้นหาจึงขึ้นอยู่กับขนาด ของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล
การจัดการดัชนีน้อยลง การพัฒนาแอปมากขึ้น
Cloud Firestore มีฟีเจอร์ที่ลดระยะเวลา ใช้จ่ายไปกับการจัดการดัชนี ดัชนีที่จำเป็นสำหรับการแสดงผลขั้นพื้นฐาน ที่ระบบสร้างข้อความค้นหาให้คุณโดยอัตโนมัติ เมื่อคุณใช้และทดสอบแอป Cloud Firestore ช่วยให้คุณระบุและ สร้างดัชนีเพิ่มเติมที่แอปของคุณต้องการ
ประเภทดัชนี
Cloud Firestore ใช้ดัชนี 2 ประเภท ได้แก่ ช่องเดียวและ composite นอกเหนือจากจำนวนฟิลด์ที่ได้รับการจัดทำดัชนี ฟิลด์เดี่ยวและ ดัชนีผสมนั้นมีวิธีการจัดการต่างกัน
ดัชนีช่องเดียว
ดัชนีช่องเดียวจะจัดเก็บการจับคู่ที่จัดเรียงของเอกสารทั้งหมดใน ที่มีช่องข้อมูลเฉพาะ แต่ละรายการในดัชนีช่องเดียว บันทึกค่าของเอกสารในช่องที่เจาะจงและตำแหน่งของเอกสาร ในฐานข้อมูล Cloud Firestore ใช้ดัชนีเหล่านี้เพื่อดำเนินการหลายรายการ คำค้นหาพื้นฐาน คุณจัดการดัชนีแบบช่องเดียวได้ด้วยการกำหนดค่าฐานข้อมูล การตั้งค่าการจัดทำดัชนีอัตโนมัติและการยกเว้นดัชนี
การจัดทำดัชนีอัตโนมัติ
โดยค่าเริ่มต้น Cloud Firestore จะเก็บรักษาดัชนีช่องเดียวโดยอัตโนมัติ สำหรับแต่ละฟิลด์ในเอกสาร และฟิลด์ย่อยแต่ละฟิลด์ในแผนที่ Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีช่องเดียว
สำหรับช่องที่ไม่ใช่อาร์เรย์และช่องที่ไม่ใช่แผนที่ Cloud Firestore จะระบุค่า ดัชนีช่องเดียว collection-scope หนึ่งในโหมดจากน้อยไปมาก และอีกรายการในโหมดจากมากไปน้อย
สำหรับช่องแผนที่แต่ละช่อง Cloud Firestore จะสร้างสิ่งต่อไปนี้
- ดัชนีจากน้อยไปมากสำหรับขอบเขตคอลเล็กชัน 1 รายการสำหรับช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่
- ดัชนีที่กำหนดขอบเขตระดับคอลเล็กชัน 1 รายการสำหรับช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่
- อาร์เรย์ขอบเขตคอลเล็กชัน 1 รายการมีดัชนีสำหรับช่องย่อยของอาร์เรย์แต่ละฟิลด์
- Cloud Firestore จัดทำดัชนีฟิลด์ย่อยของแผนที่แต่ละฟิลด์ซ้ำ
สำหรับอาร์เรย์แต่ละช่องในเอกสาร Cloud Firestore จะสร้างและ จะเก็บดัชนีอาร์เรย์-มีขอบเขตการรวบรวมไว้
ดัชนีช่องเดียวที่มีขอบเขตกลุ่มคอลเล็กชันไม่ได้รับการดูแลโดย "ค่าเริ่มต้น"
การยกเว้นดัชนีช่องเดียว
คุณยกเว้นช่องจากการจัดทำดัชนีอัตโนมัติได้ โดยการสร้างการยกเว้นดัชนีช่องเดียว การยกเว้นการจัดทำดัชนีจะลบล้างการตั้งค่าดัชนีอัตโนมัติของทั้งฐานข้อมูล CANNOT TRANSLATE การยกเว้นสามารถเปิดใช้ดัชนีช่องเดียวที่การตั้งค่าการจัดทำดัชนีอัตโนมัติของคุณ จะปิดใช้หรือปิดใช้ดัชนีช่องเดียวที่การจัดทำดัชนีอัตโนมัติ จะเปิดใช้หรือไม่ สำหรับกรณีที่การยกเว้นจะมีประโยชน์ โปรดดู แนวทางปฏิบัติแนะนำในการจัดทำดัชนี
ใช้ค่าเส้นทางช่อง *
เพื่อเพิ่มการยกเว้นดัชนีระดับคอลเล็กชันในทุกผลิตภัณฑ์
ในกลุ่มคอลเล็กชันได้ด้วย เช่น สำหรับกลุ่มคอลเล็กชัน comments
ให้ตั้งค่า
เส้นทางฟิลด์ไปยัง *
เพื่อให้ตรงกับฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน comments
และ
ปิดใช้การจัดทำดัชนีช่องทั้งหมดในกลุ่มคอลเล็กชัน จากนั้นคุณจะเพิ่ม
การยกเว้น เพื่อจัดทำดัชนีเฉพาะฟิลด์ที่จำเป็นสำหรับการค้นหาของคุณ การลด
จำนวนช่องที่จัดทำดัชนีจะช่วยลดต้นทุนในการจัดเก็บข้อมูลและปรับปรุงการเขียน
ด้านประสิทธิภาพ
หากคุณสร้างการยกเว้นดัชนีช่องเดียวสำหรับฟิลด์แผนที่ ฟิลด์ ส่วนช่องย่อยจะรับช่วงการตั้งค่าเหล่านั้น อย่างไรก็ตาม คุณสามารถกำหนดดัชนีช่องเดียว การยกเว้นสำหรับช่องย่อยที่เฉพาะเจาะจง หากคุณลบการยกเว้นสำหรับช่องย่อย ช่องย่อยจะรับช่วงการตั้งค่าการยกเว้นของระดับบนสุด (หากมี) หรือ การตั้งค่าทั้งฐานข้อมูลหากไม่มีการยกเว้นระดับบนสุด
หากต้องการสร้างและจัดการการยกเว้นดัชนีช่องเดียว โปรดดู จัดการดัชนี
ดัชนีผสม
ดัชนีผสมจะจัดเก็บการจับคู่ที่จัดเรียงของเอกสารทั้งหมดในคอลเล็กชัน อิงตามรายการช่องที่เรียงลำดับเพื่อจัดทำดัชนี
Cloud Firestore ใช้ดัชนีผสมเพื่อรองรับ การค้นหาที่ดัชนีช่องเดียวไม่รองรับคำค้นหาดังกล่าว
Cloud Firestore ไม่ได้สร้างดัชนีผสมแบบเดียวกันโดยอัตโนมัติ ใช้กับดัชนีช่องเดียวเนื่องจากมีช่องที่เป็นไปได้จำนวนมาก ชุดค่าผสม แต่ Cloud Firestore จะช่วยคุณระบุและสร้าง ต้องใช้ดัชนีผสมขณะที่สร้างแอป
ทุกครั้งที่คุณพยายามทำการค้นหาที่ดัชนีไม่รองรับ Cloud Firestore แสดงข้อความแสดงข้อผิดพลาดพร้อมด้วยลิงก์ที่คุณสามารถใช้เพื่อสร้าง ดัชนี
นอกจากนี้ คุณยังสามารถกำหนดและจัดการดัชนีผสมด้วยตนเอง โดยใช้คอนโซลหรือด้วยฟังก์ชัน Firebase CLI ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและจัดการ ดัชนีผสม โปรดดูจัดการดัชนี
โหมดดัชนีและขอบเขตการค้นหา
คุณกำหนดค่าดัชนีช่องเดียวและดัชนีผสมแตกต่างกัน แต่ทั้งสองแบบต้องใช้ ที่คุณกำหนดค่าโหมดดัชนีและขอบเขตการค้นหาสำหรับดัชนีของคุณ
โหมดดัชนี
เมื่อกำหนดดัชนี คุณต้องเลือกโหมดดัชนีสำหรับฟิลด์ที่จัดทำดัชนีแต่ละช่อง ชิ้น โหมดดัชนีของฟิลด์สนับสนุนข้อความข้อความค้นหาที่เฉพาะเจาะจงในฟิลด์นั้น คุณ สามารถเลือกโหมดดัชนีต่อไปนี้ได้
โหมดดัชนี | คำอธิบาย |
---|---|
น้อยไปมาก | รองรับคำสั่งการค้นหาในช่อง < , <= , == , >= , > , != , in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลำดับจากน้อยไปมากตามค่าของช่องนี้ |
มากไปน้อย | รองรับข้อความคำค้นหา < , <= , == , >= , > , != , in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลำดับจากมากไปน้อยตามค่าช่องนี้ |
Array-contains | รองรับวลีการค้นหา 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 รายการมีดัชนีฟิลด์เดียวสำหรับ ฟิลด์อาร์เรย์ แต่ละแถวในตารางต่อไปนี้แสดงรายการใน ดัชนีช่องเดียว:
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
เมือง | ชื่อ | การรวบรวม |
เมือง | รัฐ | การรวบรวม |
เมือง | ประเทศ | การรวบรวม |
เมือง | เมืองหลวง | การรวบรวม |
เมือง | ประชากร | คนการรวบรวม |
เมือง | ชื่อ | การรวบรวม |
เมือง | รัฐ | การรวบรวม |
เมือง | ประเทศ | การรวบรวม |
เมือง | เมืองหลวง | การรวบรวม |
เมือง | ประชากร | คนการรวบรวม |
เมือง | 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"]
ดัชนีช่องเดียว
- ชื่อเมือง ASC
- ชื่อเมือง DESC
- อุณหภูมิสีในฤดูร้อน แอสซีซัม
- อุณหภูมิs.ฤดูร้อน DESC
- อุณหภูมิสีในฤดูหนาว ASC
- Temperatures.winter DESC
- ย่านใกล้เคียงของอาร์เรย์ มี (ASC และ DESC)
ดัชนีผสม
- City_name ASC, ย่าน ARRAY
- City_name DESC, ย่าน ARRAY
รายการดัชนี
การกำหนดค่าการจัดทำดัชนีนี้จะส่งผลให้เกิดรายการดัชนีต่อไปนี้สำหรับ เอกสาร:
ดัชนี | ข้อมูลที่จัดทำดัชนี |
---|---|
รายการดัชนีแบบช่องเดียว | |
ชื่อเมือง ASC | City_name: "เชียงใหม่" |
ชื่อเมือง DESC | City_name: "เชียงใหม่" |
อุณหภูมิสีในฤดูร้อน แอสซีซัม | อุณหภูมิในฤดูร้อน: 67 |
อุณหภูมิs.ฤดูร้อน DESC | อุณหภูมิในฤดูร้อน: 67 |
อุณหภูมิสีในฤดูหนาว ASC | อุณหภูมิในฤดูหนาว: 55 |
Temperatures.winter DESC | อุณหภูมิในฤดูหนาว: 55 |
อาร์เรย์ย่านใกล้เคียงมี ASC | ย่านใกล้เคียง: "พันธกิจ" |
อาร์เรย์ย่านใกล้เคียงมี DESC | ย่านใกล้เคียง: "พันธกิจ" |
อาร์เรย์ย่านใกล้เคียงมี ASC | ย่านใกล้เคียง: "ตัวเมือง" |
อาร์เรย์ย่านใกล้เคียงมี DESC | ย่านใกล้เคียง: "ตัวเมือง" |
อาร์เรย์ย่านใกล้เคียงมี ASC | ย่านใกล้เคียง: "มารินา" |
อาร์เรย์ย่านใกล้เคียงมี DESC | ย่านใกล้เคียง: "มารินา" |
รายการดัชนีผสม | |
City_name ASC, ย่าน ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "มิชชัน" |
City_name ASC, ย่าน ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "ตัวเมือง" |
City_name ASC, ย่าน ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "มารินา" |
City_name DESC, ย่าน ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "มิชชัน" |
City_name DESC, ย่าน ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "ตัวเมือง" |
City_name DESC, ย่าน ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "มารินา" |
ดัชนีและการกำหนดราคา
ดัชนีมีผลต่อค่าใช้จ่ายในการจัดเก็บแอปพลิเคชันของคุณ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีคำนวณขนาดของพื้นที่เก็บข้อมูลสำหรับดัชนีได้ที่ ขนาดรายการดัชนี
ใช้การรวมดัชนี
แม้ว่า Cloud Firestore จะใช้ดัชนีสำหรับทุกการค้นหา แต่จะไม่
ต้องมี 1 ดัชนีต่อการค้นหา 1 รายการ สำหรับคำค้นหาที่มีความเท่ากันหลายข้อ
(==
) วลี หรือวรรค orderBy
(ไม่บังคับ) Cloud Firestore สามารถ
นำดัชนีที่มีอยู่กลับมาใช้ใหม่ Cloud Firestore สามารถผสานดัชนีสำหรับ
ตัวกรองความเท่าเทียมเพื่อสร้างดัชนีผสมที่จำเป็นสำหรับความเท่าเทียมที่มากขึ้น
การค้นหา
คุณสามารถลดค่าใช้จ่ายในการจัดทำดัชนีได้โดยระบุสถานการณ์ที่คุณสามารถใช้ดัชนี
การผสาน ตัวอย่างเช่น ในคอลเล็กชัน restaurants
สำหรับแอปให้คะแนนร้านอาหาร:
ร้านอาหาร
แห่งเบอร์เกอร์
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")
คุณสามารถสร้างดัชนีสำหรับคำค้นหาแต่ละรายการดังนี้
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
ร้านอาหาร | หมวดหมู่ | , การให้คะแนน ดาวการรวบรวม |
ร้านอาหาร | เมือง, ดาว | การรวบรวม |
ร้านอาหาร | หมวดหมู่ | , เมือง, ดาวการรวบรวม |
ร้านอาหาร | หมวดหมู่ | , เมือง, Editor_pick, ดาวการรวบรวม |
วิธีแก้ปัญหาที่ดีกว่าคือ คุณสามารถลดจำนวน ของดัชนีโดยใช้ประโยชน์จากความสามารถในการผสานรวมของ Cloud Firestore ดัชนีข้อความด้านความเท่าเทียม:
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
ร้านอาหาร | หมวดหมู่ | , การให้คะแนน ดาวการรวบรวม |
ร้านอาหาร | เมือง, ดาว | การรวบรวม |
ร้านอาหาร | เลือกเครื่องมือแก้ไข | รายการ, การให้คะแนน ดาวการรวบรวม |
ดัชนีชุดนี้ไม่เพียงแต่เล็กลงเท่านั้น แต่ยังรองรับการค้นหาเพิ่มเติมด้วย ได้แก่
เว็บ
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
รายการ) ได้ที่หน้าการแก้ปัญหา