ดัชนีเป็นปัจจัยสําคัญในประสิทธิภาพของฐานข้อมูล ดัชนีฐานข้อมูลจะจับคู่รายการต่างๆ ในฐานข้อมูลกับตำแหน่งในฐานข้อมูล ซึ่งคล้ายกับดัชนีของหนังสือที่จับคู่หัวข้อในหนังสือกับเลขหน้า เมื่อคุณค้นหาฐานข้อมูล ฐานข้อมูลจะใช้ดัชนีเพื่อระบุตำแหน่งของรายการที่คุณขอได้อย่างร��ดเร็ว
หน้านี้อธิบายดัชนี 2 ประเภทที่ Cloud Firestore ใช้ ได้แก่ ดัชนีช่องเดียวและดัชนีผสม
คําจํากัดความและโครงสร้างดัชนี
ดัชนีจะกำหนดในรายการช่องของเอกสารหนึ่งๆ โดยมีโหมดดัชนีที่สอดคล้องกันสำหรับแต่ละช่อง
ดัชนีมีรายการสําหรับทุกช่องที่มีชื่ออยู่ในคําจํากัดความของดัชนี ดัชนีจะรวมเอกสารทั้งหมดที่อาจเป็นผลการค้นหาสําหรับคําค้นหาตามดัชนี เอกสารจะรวมอยู่ในดัชนีก็ต่อเมื่อมีการตั้งค่าค่าที่จัดทําดัชนีสําหรับทุกช่องที่ใช้ในดัชนี หากคําจํากัดความดัชนีอ้างอิงถึงช่องที่เอกสารไม่ได้ตั้งค่าค่าไว้ เอกสารนั้นจะไม่ปรากฏในดัชนี ในกรณีนี้ ระบบจะไม่แสดงเอกสารเป็นผลการค้นหาสำหรับคำค้นหาใดๆ ตามดัชนี
ดัชนีผสมจะจัดเรียงตามค่าของช่อง ตามลำดับที่ระบุในการกำหนดดัชนี
ดัชนีที่อยู่เบื้องหลังการค้นหาแต่ละครั้ง
ถ้าไม่มีดัชนีสำหรับการค้นหา ฐานข้อมูลส่วนใหญ่จะรวบรวมข้อมูลผ่านรายการเนื้อหาแยกตามรายการ ซึ่งเป็นกระบวนการที่ช้าซึ่งจะช้าลงไปอีกเมื่อฐานข้อมูลมีขนาดใหญ่ขึ้น Cloud Firestore รับประกันประสิทธิภาพการค้นหาที่สูงโดยใช้ดัชนีสําหรับการค้นหาทั้งหมด ด้วยเหตุนี้ ประสิทธิภาพการค้นหาจึงขึ้นอยู่กับขนาดของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล
จัดการดัชนีน้อยลง พัฒนาแอปมากขึ้น
Cloud Firestore มีฟีเจอร์ที่ลดระยะเวลาที่ต้องใช้ในการจัดการดัชนี ระบบจะสร้างดัชนีที่จําเป็นสําหรับการค้นหาพื้นฐานที่สุดให้คุณโดยอัตโนมัติ ขณะใช้และทดสอบแอป Cloud Firestoreจะช่วยคุณระบุและสร้างดัชนีเพิ่มเติมที่แอปของคุณต้องใช้
ประเภทดัชนี
Cloud Firestore ใช้ดัชนี 2 ประเภท ได้แก่ ช่องเดียวและcomposite นอกจากจำนวนช่องที่มีการจัดทำดัชนีแล้ว ดัชนีช่องเดียวและดัชนีผสมยังขึ้นอยู่กับว่าคุณจัดการช่องเหล่านั้นอย่างไร
ดัชนีแบบช่องเดียว
ดัชนีช่องเดียวจะเก็บการแมปที่จัดเรียงของเอกสารทั้งหมดในคอลเล็กชันที่มีช่องที่ระบุ แต่ละรายการในดัชนีช่องเดียวจะบันทึกค่าของเอกสารสำหรับช่องใดช่องหนึ่งและตำแหน่งของเอกสารในฐานข้อมูล Cloud Firestore ใช้ดัชนีเหล่านี้เพื่อทำการค้นหาพื้นฐานหลายรายการ คุณจัดการดัชนีช่องเดียวได้โดยกำหนดการตั้งค่าการจัดทำดัชนีอัตโนมัติของฐานข้อมูลและการยกเว้นดัชนี
การจัดทำดัชนีอัตโนมัติ
โดยค่าเริ่มต้น Cloud Firestore จะเก็บรักษาดัชนีช่องเดียวสำหรับแต่ละช่องในเอกสาร และแต่ละช่องย่อยในแผนที่โดยอัตโนมัติ Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีช่องเดียว
สําหรับช่องที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละช่อง Cloud Firestore จะกําหนดดัชนีช่องเดี่ยวระดับคอลเล็กชัน 2 รายการ โดย 1 รายการเป็นโหมดจากน้อยไปมาก และอีก 1 รายการเป็นโหมดจากมากไปน้อย
Cloud Firestore จะสร้างสิ่งต่อไปนี้สําหรับแต่ละช่องแผนที่
- ดัชนีแบบขึ้นตามลําดับระดับคอลเล็กชัน 1 รายการสําหรับแต่ละช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่
- ดัชนีที่กำหนดขอบเขตระดับคอลเล็กชัน 1 รายการสำหรับช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่
- อาร์เรย์ขอบเขตคอลเล็กชัน 1 รายการมีดัชนีสำหรับช่องย่อยของอาร์เรย์แต่ละฟิลด์
- Cloud Firestore จัดทำดัชนีช่องย่อยของแผนที่แต่ละช่องแบบซ้ำ
สําหรับช่องอาร์เรย์แต่ละช่องในเอกสาร Cloud Firestore จะสร้างและดูแลรักษาดัชนีที่มีอาร์เรย์ระดับคอลเล็กชัน
ระบบจะไม่ดูแลรักษาดัชนีแบบช่องเดียวที่มีขอบเขตกลุ่มคอลเล็กชันโดยค่าเริ่มต้น
การยกเว้นดัชนีช่องเดียว
คุณยกเว้นช่องจากการตั้งค่าการจัดทำดัชนีอัตโนมัติได้โดยสร้างการยกเว้นดัชนีช่องเดียว การยกเว้นการจัดทําดัชนีจะลบล้างการตั้งค่าดัชนีอัตโนมัติทั่วทั้งฐานข้อมูล การยกเว้นอาจเปิดใช้��ัชนีแบบช่องเดียวที่การตั้งค่าการจัดทําดัชนีอัตโนมัติจะปิดใช้ หรือปิดใช้ดัชนีแบบช่องเดียวที่การจัดทําดัชนีอัตโนมัติจะเปิดใช้ สำหรับกรณีที่การยกเว้นจะมีประโยชน์ โปรดดูแนวทางปฏิบัติแนะนำในการจัดทำดัชนี
ใช้ค่าเส้นทางฟิลด์ *
เพื่อเพิ่มการยกเว้นดัชนีระดับคอลเล็กชันในฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน ตัวอย่างเช่น สำหรับกลุ่มคอลเล็กชัน comments
ให้ตั้งค่าเส้นทางช่องเป็น *
เพื่อจับคู่ช่องทั้งหมดในกลุ่มคอลเล็กชัน comments
และปิดใช้การจัดทำดัชนีของช่องทั้งหมดในกลุ่มคอลเล็กชัน จากนั้นคุณสามารถเพิ่มการยกเว้นเพื่อจัดทำดัชนีเฉพาะช่องที่จำเป็นสำหรับการค้นหาได้ การลดจํานวนช่องที่จัดทําดัชนีจะช่วยลดค่าใช้จ่ายในการจัดเก็บและอาจปรับปรุงประสิทธิภาพการเขียนได้
หากคุณสร้างการยกเว้นดัชนีช่องเดี่ยวสําหรับช่องแผนที่ ช่องย่อยของแผนที่จะรับช่วงการตั้งค่าเหล่านั้น อย่างไรก็ตาม คุณกำหนดการยกเว้นดัชนีช่องเดียวสำหรับช่องย่อยที่เจาะจงได้ หากคุณลบการยกเว้นสำหรับช่องย่อย ช่องย่อยจะรับช่วงการตั้งค่าการยกเว้นของระดับบนสุด (หากมี) หรือใช้การตั้งค่าทั่วทั้งฐานข้อมูลหากไม่มีการยกเว้นระดับบนสุด
หากต้องการสร้างและจัดการการยกเว้นดัชนีช่องเดียว โปรดดูจัดการดัชนี
ดัชนีผสม
ดัชนีผสมจะจัดเก็บการแมปที่เรียงลํา���ับของเอกสารทั้งหมดในคอลเล็กชัน โดยอิงตามรายการช่องที่จัดเรียงเพื่อจัดทำดัชนี
Cloud Firestore ใช้ดัชนีผสมเพื่อรองรับคำค้นหาที่ดัชนีช่องเดียวไม่รองรับคำค้นหา
Cloud Firestore จะไม่สร้างดัชนีผสมโดยอัตโนมัติเหมือนที่ทำกับดัชนีช่องเดียว เนื่องจากมีชุดค่าผสมของช่องที่เป็นไปได้เป็นจำนวนมาก แต่ Cloud Firestore จะช่วยคุณระบุและสร้างดัชนีคอมโพสิทที่จําเป็นขณะที่คุณ��ร้างแอป
เมื่อใดก็ตามที่คุณทำการค้นหาที่ดัชนีไม่รองรับ Cloud Firestore จะแสดงผลข้อความแสดงข้อผิดพลาดพร้อมลิงก์ที่คุณใช้คลิกเพื่อสร้างดัชนีที่ขาดหายไปได้
คุณยังสามารถกำหนดและจัดการดัชนีผสมด้วยตนเองได้โดยใช้คอนโซลหรือ Firebase CLI ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและจัดการดัชนีคอมโพสิทได้ที่จัดการดัชนี
โหมดดัชนีและขอบเขตการค้นหา
คุณกําหนดค่าดัชนีแบบช่องเดียวและดัชนีผสมแตกต่างกัน แต่ทั้ง 2 ประเภทกําหนดให้คุณกําหนดค่าโหมดดัชนีและขอบเขตการค้นหาสําหรับดัชนี
โหมดดัชนี
เมื่อกําหนดดัชนี คุณจะเลือกโหมดดัชนีสําหรับฟิลด์ที่จัดทําดัชนีแต่ละฟิลด์ โหมดดัชนีของช่องแต่ละช่องรองรับคำสั่งการค้นหาที่เฉพาะเจาะจงในช่องนั้น คุณสามารถเลือกจากโหมดดัชนีต่อไปนี้
โหมดดัชนี | คำอธิบาย |
---|---|
น้อยไปมาก | รองรับคำสั่งค้นหา < , <= , == , >= , > , != , in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลําดับจากน้อยไปมากตามค่าในช่องนี้ |
มากไปน้อย | รองรับข้อความคำค้นหา < , <= , == , >= , > , != , in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลำดับจากมากไปน้อยตามค่าช่องนี้ |
Array-contains | รองรับคำสั่งค้นหา array-contains และ array-contains-any ในช่อง |
เวกเตอร์ | รองรับคำสั่งค้นหา FindNearest ในช่อง |
ขอบเขตการค้นหา
ดัชนีแต่ละรายการจะกำหนดขอบเขตไว้เป็นคอลเล็กชันหรือกลุ่มคอลเล็กชัน ซึ่งเรียกว่าขอบเขตการค้นหาของดัชนี
- ขอบเขตคอลเล็กชัน
- Cloud Firestore สร้างดัชนีที่มีขอบเขตคอลเล็กชันโดยค่าเริ่มต้น ดัชนีเหล่านี้รองรับการค้นหาที่แสดงผลลัพธ์จากคอลเล็กชันเดียว
- ขอบเขตกลุ่มคอลเล็กชัน
- กลุ่มคอลเล็กชันจะมีคอลเล็กชันทั้งหมดที่มีรหัสคอลเล็กชันเดียวกัน หากต้องการเรียกใช้การค้นหากลุ่มคอลเล็กชัน��ี่แสดงผลลัพธ์ที่กรองหรือจัดเรียงจากกลุ่มคอลเล็กชัน คุณต้องสร้างดัชนีที่เกี่ยวข้องซึ่งมีขอบเขตกลุ่มคอลเล็กชัน
การจัดเรียงเริ่มต้นและช่อง __name__
นอกจากการจัดเรียงเอกสารตามโหมดดัชนีที่ระบุสำหรับแต่ละช่อง (จากน้อยไปมากหรือจากมากไปน้อย) แล้ว ดัชนียังใช้การจัดเรียงขั้นสุดท้ายตามช่อง __name__
ของเอกสารแต่ละรายการ ค่าของช่อง __name__
ได้รับการตั้งค่าเป็นเส้นทางแบบเต็มของเอกสาร ซึ่งหมายความว่าเอกสารในชุดผลลัพธ์ที่มีค่าช่องเดียวกันจะจัดเรียงตามเส้นทางของเอกสาร
โดยค่าเริ่มต้น ระบบจะจัดเรียงช่อง __name__
ในทิศทางเดียวกับช่องที่จัดเรียงล่าสุดในคําจํากัดความของดัชนี เช่น
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
เมือง | __name__ |
ชื่อ การรวบรวม |
เมือง | __name__ |
state, การรวบรวม |
เมือง | __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")
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
เมือง | ประเทศ, ประชากร | การรวบรวม |
cities | ประเทศ, ประชากร | การรวบรวม |
เพื่อหลีกเลี่ยงการสู���เ����ย��ระ���������ิ��าพที่เกิดจากการผสานดัชนี เราขอแนะนำให้คุณสร้างดัชนีคอมโพสิทเพื่อรวมการค้นหา 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
- อุณหภูมิ ฤดูร้อน อส.
- อุณหภูมิs.ฤดูร้อน DESC
- อุณหภูมิสีในฤดูหนาว ASC
- temperatures.winter DESC
- ย่านใกล้เคียงของอาร์เรย์ มี (ASC และ DESC)
ดัชนีผสม
- City_name ASC, ย่าน ARRAY
- city_name DESC, neighborhoods ARRAY
รายการดัชนี
การกำหนดค่าการจัดทำดัชนีนี้จะส่งผลให้เกิดรายการดัชนีต่อไปนี้สำหรับเอกสาร
ดัชนี | ข้อมูลที่จัดทำดัชนี |
---|---|
รายการดัชนีแบบช่องเดียว | |
city_name ASC | City_name: "เชียงใหม่" |
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 |
อาร์เรย์ neighborhoods มี ASC | ย่าน: "Mission" |
อาร์เรย์ย่านใกล้เคียงมี DESC | ย่าน: "Mission" |
อาร์เรย์ย่านใกล้เคียงมี ASC | ย่าน: "ดาวน์ทาวน์" |
อาร์เรย์ neighborhoods มี DESC | ย่าน: "ดาวน์ทาวน์" |
อาร์เรย์ neighborhoods มี ASC | ย่านใกล้เคียง: "มารินา" |
อาร์เรย์ย่านใกล้เคียงมี DESC | ย่าน: "Marina" |
รายการดัชนีผสม | |
City_name ASC, ย่าน ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "มิชชัน" |
city_name ASC, neighborhoods ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "ตัวเมือง" |
City_name ASC, ย่าน ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
City_name DESC, ย่าน ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "มิชชัน" |
city_name DESC, neighborhoods ARRAY | City_name: "เชียงใหม่", ย่านใกล้เคียง: "เชียงใหม่" |
City_name DESC, ย่าน ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
ดัชนีและราคา
ดัชนีจะเพิ่มค่าใช้จ่ายในการจัดเก็บข้อมูลของแอปพลิเคชัน ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีคำนวณขนาดพื้นที่เก็บข้อมูลสำหรับดัชนีได้ที่ขนาดรายการดัชนี
ใช้การรวมดัชนี
แม้ว่า Cloud Firestore จะใช้ดัชนีสำหรับการค้นหาทุกรายการ แต่ก็ไม่จำเป็นว่าต้องมี 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
แบบ ascending เสมอ ดังนี้
เว็บ
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")
คุณสามารถสร้างดัชนีสําหรับการค้นหาแต่ละรายการได้ ดังนี้
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
ร้านอาหาร | หมวดหมู่ | , การให้คะแนน ดาวการรวบรวม |
ร้านอาหาร | เมือง, ดาว | การรวบรวม |
ร้านอาหาร | category, city, star_rating | การรวบรวม |
ร้านอาหาร | category, city, editors_pick, star_rating | การรวบรวม |
วิธีที่ดีกว่าคือคุณสามารถลดจํานวนดัชนีได้โดยใช้ความสามารถของ Cloud Firestore ในการผสานดัชนีสําหรับประโยคสัมพัทธ์
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
ร้านอาหาร | หมวดหมู่ | , การให้คะแนน ดาวการรวบรวม |
ร้านอาหาร | เมือง, ดาว | การรวบรวม |
ร้านอาหาร | เลือกเครื่องมือแก้ไข | รายการ, การให้คะแนน ดาวการรวบรวม |
ชุดดัชนีนี้ไม่เพียงแต่จะเล็กกว่าเท่านั้น แต่ยังรองรับการค้นหาเพิ่มเติมด้วย
เว็บ
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
ขีดจำกัดของการจัดทำดัชนี
ขีดจำกัดต่อไปนี้มีผลกับดัชนี ดูข้อมูลเพิ่มเติมเกี่ยวกับโควต้าและขีดจำกัดได้ที่หัวข้อโควต้าและขีดจำกัด
ขีดจำกัด | รายละเอียด |
---|---|
จำนวนสูงสุดของดัชนีผสมสำหรับฐานข้อมูล |
|
จำนวนสูงสุดของการกำหนดค่าช่องเดียวสำหรับฐานข้อมูล |
การกําหนดค่าระดับฟิลด์ 1 รายการอาจมีการกำหนดค่าหลายรายการสําหรับฟิลด์เดียวกัน เช่น การยกเว้นการ��ัดทำดัชนีช่องเดียวและนโยบาย TTL ในช่องเดียวกันจะนับเป็นการกําหนดค่าช่องเดียวในขีดจํากัด |
จำนวนรายการดัชนีสูงสุดสำหรับเอกสารแต่ละรายการ |
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
) ได้ที่หน้าการแก้ปัญหา