ประเภทดัชนีใน Cloud Firestore

ดัชนีเป็นปัจจัยสําคัญในประสิทธิภาพของฐานข้อมูล ดัชนีฐานข้อมูลจะเชื่อมโยงรายการในฐานข้อมูลกับตําแหน่งในฐานข้อมูล เช่นเดียวกับดัชนีหนังสือที่เชื่อมโยงหัวข้อในหนังสือกับหมายเลขหน้า เมื่อคุณค้นหาฐานข้อมูล ฐานข้อมูลจะใช้ดัชนีเพื่อระบุตำแหน่งของรายการที่คุณขอได้อย่างรวดเร็ว

หน้านี้อธิบายดัชนี 2 ประเภทที่ Cloud Firestore ใช้ ได้แก่ ดัชนีช่องเดียวและดัชนีผสม

คําจํากัดความและโครงสร้างดัชนี

ดัชนีจะกำหนดในรายการช่องของเอกสารหนึ่งๆ โดยมีโหมดดัชนีที่สอดคล้องกันสำหรับแต่ละช่อง

ดัชนีมีรายการสําหรับทุกช่องที่มีชื่ออยู่ในคําจํากัดความของดัชนี ดัชนีจะรวมเอกสารทั้งหมดที่อาจเป็นผลการค้นหาสําหรับคําค้นหาตามดัชนี เอกสารจะรวมอยู่ในดัชนีก็ต่อเมื่อมีการตั้งค่าค่าที่จัดทําดัชนีสําหรับทุกช่องที่ใช้ในดัชนี หากคําจํากัดความดัชนีอ้างอิงถึงช่องที่เอกสารไม่ได้ตั้งค่าค่าไว้ เอกสารนั้นจะไม่ปรากฏในดัชนี ในกรณีนี้ ระบบจะไม่แสดงเอกสารเป็นผลการค้นหาสำหรับคำค้นหาใดๆ ตามดัชนี

ระบบจะจัดเรียงดัชนีคอมโพสิตตามค่าช่องตามลำดับที่ระบุไว้ในคำจำกัดความของดัชนี

ดัชนีที่อยู่เบื้องหลังการค้นหาแต่ละครั้ง

หากไม่มีดัชนีสําหรับการค้นหา ฐานข้อมูลส่วนใหญ่จะทำการ Crawl เนื้อหาทีละรายการ ซึ่งเป็นกระบวนการที่ช้าและยิ่งช้าลงเมื่อฐานข้อมูลมีขนาดใหญ่ขึ้น Cloud Firestore รับประกันประสิทธิภาพการค้นหาที่สูงโดยใช้ดัชนีสําหรับการค้นหาทั้งหมด ด้วยเหตุนี้ ประสิทธิภาพการค้นหาจึงขึ้นอยู่กับขนาดของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล

จัดการดัชนีน้อยลง พัฒนาแอปมากขึ้น

Cloud Firestore มีฟีเจอร์ที่ช่วยให้คุณจัดการดัชนีได้เร็วขึ้น ระบบจะสร้างดัชนีที่จําเป็นสําหรับการค้นหาพื้นฐานที่สุดให้คุณโดยอัตโนมัติ ขณะใช้และทดสอบแอป Cloud Firestoreจะช่วยคุณระบุและสร้างดัชนีเพิ่มเติมที่แอปของคุณต้องใช้

ประเภทดัชนี

Cloud Firestore ใช้ดัชนี 2 ประเภท ได้แก่ ช่องเดียวและแบบผสม นอกจากจำนวนช่องที่จัดทําดัชนีแล้ว ดัชนีแบบช่องเดียวและดัชนีผสมยังมีวิธีจัดการที่แตกต่างกันด้วย

ดัชนีแบบช่องเดียว

ดัชนีแบบช่องเดียวจะจัดเก็บการแมปที่เรียงลำดับของเอกสารทั้งหมดในคอลเล็กชันที่มีช่องหนึ่งๆ รายการแต่ละรายการในดัชนีแบบช่องเดียวจะบันทึกค่าของเอกสารสำหรับช่องที่เฉพาะเจาะจงและตำแหน่งของเอกสารในฐานข้อมูล 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__ การรวบรวม
เมือง state, __name__ การรวบรวม
เมือง ประเทศ, จำนวนประชากร, __name__ การรวบรวม

หากต้องการจัดเรียงผลลัพธ์ตามลำดับ __name__ ที่ไม่ใช่ค่าเริ่มต้น คุณต้องสร้างดัชนีนั้น

พร็อพเพอร์ตี้ของดัชนี

ดัชนีที่ช่วยให้ดำเนินการค้นหาได้อย่างมีประสิทธิภาพมากที่สุดจะกำหนดโดยพร็อพเพอร์ตี้ต่อไปนี้

  • ฟิลด์ที่ใช้ในตัวกรองแบบเท่ากับ
  • ฟิลด์ที่ใช้ในลําดับการจัดเรียง
  • ฟิลด์ที่ใช้ในตัวกรองช่วงและตัวกรองความไม่เท่ากัน (ซึ่งไม่ได้รวมอยู่ในลําดับการจัดเรียงอยู่แล้ว)
  • ฟิลด์ที่ใช้ในการรวม (ซึ่งไม่ได้รวมอยู่ในลําดับการจัดเรียง ตัวกรองช่วง และตัวกรองความไม่เท่ากัน)

Cloud Firestore คํานวณผลลัพธ์สําหรับคําค้นหาดังนี้

  1. ระบุดัชนีที่สอดคล้องกับคอลเล็กชัน พร็อพเพอร์ตี้ตัวกรอง โอเปอเรเตอร์ตัวกรอง และลําดับการจัดเรียงของคําค้นหา
  2. ระบุตําแหน่งดัชนีที่การสแกนจะเริ่ม ตำแหน่งเริ่มต้นจะขึ้นต้นด้วยตัวกรองความเท่าเทียมของการค้นหา และลงท้ายด้วยตัวกรองช่วงและความไม่เท่าเทียมในช่อง orderBy แรก
  3. เริ่มสแกนดัชนี โดยแสดงเอกสารแต่ละรายการที่ตรงกับตัวกรองทั้งหมดจนกว่ากระบวนการสแกนจะทำอย่างใดอย่างหนึ่งต่อไปนี้
    • พบเอกสารที่ไม่เป็นไปตามเงื่อนไขตัวกรอง และยืนยันว่าเอกสารที่ตามมาจะไม่เป็นไปตามเงื่อนไขตัวกรองโดยสมบูรณ์
    • มาถึงส่วนท้ายของดัชนี
    • รวบรวมผลลัพธ์สูงสุดที่คำค้นหาขอ

ตัวอย่างการจัดทําดัชนี

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 country, population การรวบรวม

เพื่อหลีกเลี่ยงการสูญเสียประสิทธิภาพที่เกิดจากการผสานดัชนี เราขอแนะนำให้คุณสร้างดัชนีคอมโพสิทเพื่อรวมการค้นหา 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
  • มีในอาร์เรย์ "neighborhoods" (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
อาร์เรย์ neighborhoods มี ASC ย่าน: "Mission"
อาร์เรย์ neighborhoods มี DESC ย่าน: "Mission"
อาร์เรย์ neighborhoods มี ASC ย่าน: "ดาวน์ทาวน์"
อาร์เรย์ neighborhoods มี DESC ย่าน: "ดาวน์ทาวน์"
อาร์เรย์ neighborhoods มี ASC ย่าน: "Marina"
อาร์เรย์ neighborhoods มี DESC ย่าน: "Marina"
รายการดัชนีผสม
city_name ASC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Mission"
city_name ASC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Downtown"
city_name ASC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Marina"
city_name DESC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Mission"
city_name DESC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Downtown"
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 แบบ 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, star_rating การรวบรวม
ร้านอาหาร city, star_rating การรวบรวม
ร้านอาหาร category, city, star_rating การรวบรวม
ร้านอาหาร category, city, editors_pick, star_rating การรวบรวม

วิธีที่ดีกว่าคือคุณสามารถลดจํานวนดัชนีได้โดยใช้ความสามารถของ Cloud Firestore ในการผสานดัชนีสําหรับประโยคสัมพัทธ์ที่เท่ากัน ดังนี้

การรวบรวม ช่องที่จัดทำดัชนี ขอบเขตการค้นหา
ร้านอาหาร category, 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

ขนาดทั้งหมดคือผลรวมของข้อมูลต่อไปนี้สำหรับเอกสาร

  • ผลรวมของขนาดรายการดัชนีแบบช่องเดียวของเอกสาร
  • ผลรวมของขนาดรายการดัชนีผสมของเอกสาร
  • ขนาดสูงสุดของค่าในช่องที่จัดทําดัชนี

    1,500 ไบต์

    ระบบจะตัดค่าของช่องที่เกิน 1,500 ไบต์ให้สั้นลง การค้นหาที่เกี่ยวข้องกับค่าฟิลด์ที่ถูกตัดอาจแสดงผลลัพธ์ที่ไม่สอดคล้องกัน

    แนวทางปฏิบัติแนะนำในการจัดทำดัชนี

    สําหรับแอปส่วนใหญ่ คุณสามารถใช้การจัดทำดัชนีอัตโนมัติและลิงก์ข้อความแสดงข้อผิดพลาดเพื่อจัดการดัชนีได้ อย่างไรก็ตาม คุณอาจต้องเพิ่มการยกเว้นช่องเดียวในกรณีต่อไปนี้

    การก คำอธิบาย
    ช่องสตริงขนาดใหญ่

    หากมีฟิลด์สตริงที่มักเก็บค่าสตริงยาวๆ ที่คุณไม่ได้ใช้สำหรับค้นหา คุณสามารถลดค่าใช้จ่ายในการจัดเก็บได้โดยยกเว้นฟิลด์นั้นไม่ให้ได้รับการจัดทําดัชนี

    อัตราการเขียนสูงไปยังคอลเล็กชันที่มีเอกสารซึ่งมีค่าตามลำดับ

    หากคุณจัดทำดัชนีช่องที่เพิ่มขึ้นหรือลดลงตามลำดับระหว่างเอกสารในคอลเล็กชัน เช่น การประทับเวลา อัตราเขียนสูงสุดไปยังคอลเล็กชันจะเป็น 500 ครั้งต่อวินาที หากไม่ได้ค้นหาตามช่องที่มีค่าตามลําดับ คุณสามารถยกเว้นช่องนั้นจากการจัดทำดัชนีเพื่อข้ามขีดจํากัดนี้ได้

    ตัวอย่างเช่น ใน Use Case ของ IoT ที่มีอัตราการเขียนสูง คอลเล็กชันที่มีเอกสารซึ่งมีช่องการประทับเวลาอาจเข้าใกล้ขีดจํากัดการเขียน 500 ครั้งต่อวินาที

    ฟิลด์ TTL

    หากคุณใช้นโยบาย TTL (Time-To-Live) โปรดทราบว่าช่อง TTL ต้องเป็นการประทับเวลา ระบบจะเปิดใช้การจัดทำดัชนีในช่อง TTL โดยค่าเริ่มต้น ซึ่งอาจส่งผลต่อประสิทธิภาพเมื่ออัตราการเข้าชมสูงขึ้น แนวทางปฏิบัติแนะนำคือเพิ่มการยกเว้นช่องเดี่ยวสำหรับช่อง TTL

    ฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่

    ฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่อาจเข้าใกล้ขีดจํากัดของรายการดัชนี 40,000 รายการต่อเอกสาร หากคุณไม่ได้ค้นหาตามอาร์เรย์ขนาดใหญ่หรือฟิลด์แผนที่ คุณควรยกเว้นฟิลด์ดังกล่าวจากการจัดทำดัชนี

    หากคุณใช้การค้นหาที่มีโอเปอเรเตอร์ช่วงและโอเปอเรเตอร์ที่ไม่เท่ากันในหลายฟิลด์ โปรดดูข้อควรพิจารณาในการจัดทำดัชนีที่คุณควรพิจารณาเพื่อเพิ่มประสิทธิภาพและต้นทุนของการค้นหา Cloud Firestore

    ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ปัญหาการจัดทําดัชนี (การแยกกลุ่มดัชนี ข้อผิดพลาด INVALID_ARGUMENT) ได้ที่หน้าการแก้ปัญหา