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

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

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

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

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

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

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

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

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

ลดการจัดการดัชนี เพิ่มการพัฒนาแอป

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

ประเภทดัชนี

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

ดัชนีอัตโนมัติ

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

ค่าเริ่มต้นของดัชนีอัตโนมัติ

Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีอัตโนมัติ

  • สำหรับช่องที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่ Cloud Firestore จะกำหนดดัชนีขอบเขตคอลเล็กชัน 2 รายการ โดยรายการหนึ่งอยู่ในโหมดจากน้อยไปมากและอีกรายการหนึ่งอยู่ในโหมดจากมากไปน้อย

  • Cloud Firestore จะสร้างสิ่งต่อไปนี้สำหรับช่องแผนที่แต่ละช่อง

    • ดัชนีจากน้อยไปมากระดับคอลเล็กชัน 1 รายการสำหรับฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละรายการ
    • ดัชนีจากมากไปน้อยระดับคอลเล็กชัน 1 รายการสำหรับช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละรายการ
    • ดัชนีจากน้อยไปมากระดับคอลเล็กชัน 1 รายการสำหรับค่าแผนที่ทั้งหมด
    • ดัชนีจากมากไปน้อยระดับคอลเล็กชัน 1 รายการสำหรับค่าแผนที่ทั้งหมด
    • ดัชนี array-contains ระดับคอลเล็กชัน 1 รายการสำหรับฟิลด์ย่อยของอาร์เรย์แต่ละรายการ
    • Cloud Firestore จะจัดทำดัชนีฟิลด์ย่อยของแผนที่แต่ละรายการซ้ำๆ
  • สำหรับช่องอาร์เรย์แต่ละช่องในเอกสาร Cloud Firestore จะสร้างสิ่งต่อไปนี้

    • ดัชนีจากน้อยไปมาก 1 รายการในขอบเขตคอลเล็กชันสำหรับค่าอาร์เรย์ทั้งหมด
    • ดัชนีจากมากไปน้อยระดับคอลเล็กชัน 1 รายการสำหรับค่าอาร์เรย์ทั้งหมด
    • ดัชนี array-contains ระดับคอลเล็กชัน 1 รายการ
  • ระบบจะไม่ดูแลรักษาดัชนีอัตโนมัติที่มีขอบเขตกลุ่มคอลเล็กชันโดยค่าเริ่มต้น

การยกเว้นดัชนีอัตโนมัติ

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

ใช้ค่าเส้นทางฟิลด์ * เพื่อเพิ่มข้อยกเว้นดัชนีระดับคอลเล็กชันในฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน เช่น สำหรับกลุ่มคอลเล็กชัน comments ให้ตั้งค่าเส้นทางฟิลด์เป็น * เพื่อให้ตรงกับฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน comments และปิดใช้การจัดทำดัชนีของฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน จากนั้นคุณสามารถเพิ่มข้อยกเว้นเพื่อจัดทำดัชนีเฉพาะช่องที่จำเป็นสำหรับการค้นหา การลดจำนวนช่องที่จัดทำดัชนีจะช่วยลดค่าใช้จ่ายในการจัดเก็บและปรับปรุงประสิทธิภาพการเขียนได้

หากคุณสร้างข้อยกเว้นดัชนีสำหรับช่องแผนที่ ช่องย่อยของแผนที่จะรับการตั้งค่าเหล่านั้นมา อย่างไรก็ตาม คุณสามารถกำหนดข้อยกเว้นการจัดทำดัชนีสำหรับฟิลด์ย่อยที่เฉพาะเจาะจงได้ หากคุณลบการยกเว้นสำหรับฟิลด์ย่อย ฟิลด์ย่อยจะรับค่าการตั้งค่าการยกเว้นของฟิลด์หลัก (หากมี) หรือการตั้งค่าทั้งฐานข้อมูลหากไม่มีการยกเว้นของฟิลด์หลัก

หากต้องการสร้างและจัดการการยกเว้นดัชนีอัตโนมัติ โปรดดูหัวข้อจัดการดัชนี

ดัชนีที่สร้างด้วยตนเอง

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

Cloud Firestore ใช้ดัชนีที่กำหนดเองเพื่อรองรับการค้นหาที่ดัชนีอัตโนมัติยังไม่รองรับ

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

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

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

โหมดดัชนีและขอบเขตการค้นหา

คุณกำหนดค่าดัชนีอัตโนมัติและดัชนีที่กำหนดเองแตกต่างกัน แต่ทั้ง 2 แบบกำหนดให้คุณต้องกำหนดค่าโหมดดัชนีและขอบเขตการค้นหาสำหรับดัชนี

โหมดดัชนี

เมื่อกำหนดดัชนี คุณจะต้องเลือกโหมดดัชนีสำหรับแต่ละช่องที่จัดทำดัชนี โหมดดัชนีของแต่ละช่องรองรับส่วนคำสั่งการค้นหาที่เฉพาะเจาะจงในช่องนั้น คุณเลือกโหมดดัชนีต่อไปนี้ได้

โหมดดัชนี คำอธิบาย
จากน้อยไปมาก รองรับส่วนคำสั่งการค้นหา <, <=, ==, >=, >, !=, in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลำดับจากน้อยไปมากตามค่าของช่องนี้
จากมากไปน้อย รองรับส่วนคำสั่งการค้นหา <, <=, ==, >=, >, !=, in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์จากมากไปน้อยตามค่าของช่องนี้
Array‑contains รองรับส่วนคำสั่งการค้นหา array-contains และ array-contains-any ในช่อง
Vector รองรับส่วนคำสั่งการค้นหา FindNearest ในช่อง

ขอบเขตการค้นหา

ดัชนีแต่ละรายการจะกำหนดขอบเขตเป็นคอลเล็กชันหรือกลุ่มคอลเล็กชัน ซึ่งเรียกว่าขอบเขตการค้นหาของดัชนี

ขอบเขตคอลเล็กชัน
Cloud Firestore สร้างดัชนีที่มีขอบเขตคอลเล็กชันโดยค่าเริ่มต้น ดัชนีเหล่านี้รองรับการค้นหาที่แสดงผลลัพธ์จากคอลเล็กชันเดียว

ขอบเขตกลุ่มคอลเล็กชัน
กลุ่มคอลเล็กชันประกอบด้วยคอลเล็กชันทั้งหมดที่มีรหัสคอลเล็กชันเดียวกัน หากต้องการเรียกใช้การค้นหากลุ่มคอลเล็กชันที่แสดงผลลัพธ์ที่กรองหรือจัดเรียงจากกลุ่มคอลเล็กชัน คุณต้องสร้างดัชนีที่เกี่ยวข้องซึ่งมีขอบเขตเป็นกลุ่มคอลเล็กชัน

การเรียงลำดับเริ่มต้นและช่อง __name__

นอกจากการจัดเรียงเอกสารตามโหมดดัชนีที่ระบุไว้สำหรับแต่ละฟิลด์ (จากน้อยไปมากหรือจากมากไปน้อย) แล้ว ดัชนียังใช้การจัดเรียงขั้นสุดท้ายตามฟิลด์ __name__ ของเอกสารแต่ละรายการด้วย ค่าของช่อง __name__ จะตั้งเป็นเส้นทางเอกสารแบบเต็ม ซึ่งหมายความว่าเอกสารในชุดผลลัพธ์ที่มีค่าฟิลด์เดียวกันจะจัดเรียงตามเส้นทางเอกสาร

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

การรวบรวม ช่องที่จัดทำดัชนี ขอบเขตการค้นหา
เมือง __name__ การรวบรวม
เมือง รัฐ __name__ การรวบรวม
เมือง ประเทศ ประชากร __name__ การรวบรวม

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

คุณสมบัติของดัชนี

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

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

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

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

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

การสร้างดัชนีแบบช่องเดียวให้คุณโดยอัตโนมัติจะช่วยให้ Cloud Firestore รองรับการค้นหาฐานข้อมูลขั้นพื้นฐานที่สุดได้อย่างรวดเร็ว ดัชนีแบบช่องเดียวช่วยให้คุณทำการค้นหาอย่างง่ายโดยอิงตามค่าของช่องและตัวเปรียบเทียบ <, <=, ==, >=, > และ in สำหรับช่องอาร์เรย์ ช่องเหล่านี้จะช่วยให้คุณทำการค้นหา array-contains และ array-contains-any ได้

ลองดูตัวอย่างต่อไปนี้จากมุมมองของการสร้างดัชนีเพื่อทำความเข้าใจให้ชัดเจนยิ่งขึ้น ข้อมูลโค้ดต่อไปนี้จะสร้างเอกสาร city 2-3 รายการในคอลเล็กชัน cities และตั้งค่าช่อง name, state, country, capital, population และ regions สำหรับเอกสารแต่ละรายการ

เว็บ
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"])

การค้นหาที่รองรับโดยดัชนีที่สร้างด้วยตนเอง

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

เว็บ
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
  • neighborhoods ASC
  • ย่านใกล้เคียง DESC
  • อุณหภูมิ ASC
  • อุณหภูมิ DESC
  • temperatures.summer ASC
  • temperatures.summer DESC
  • temperatures.winter ASC
  • temperatures.winter DESC
  • neighborhoods Array Contains

ดัชนีที่สร้างด้วยตนเอง

  • city_name ASC, neighborhoods ARRAY
  • city_name DESC, neighborhoods ARRAY

รายการดัชนี

การกำหนดค่าการจัดทำดัชนีนี้ส่งผลให้เกิดรายการดัชนีต่อไปนี้สำหรับเอกสาร

ดัชนี ข้อมูลที่จัดทำดัชนี
รายการดัชนีอัตโนมัติ
city_name ASC city_name: "San Francisco"
city_name DESC city_name: "San Francisco"
neighborhoods ASC neighborhoods: ["Mission", "Downtown", "Marina"]
ย่านใกล้เคียง DESC neighborhoods: ["Mission", "Downtown", "Marina"]
อุณหภูมิ ASC temperatures: {summer: 67, winter: 55}
อุณหภูมิ DESC temperatures: {summer: 67, winter: 55}
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 Array Contains neighborhoods: "Mission"
neighborhoods Array Contains neighborhoods: "Downtown"
neighborhoods Array Contains neighborhoods: "Marina"
รายการดัชนีที่สร้างด้วยตนเอง
city_name ASC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Mission"
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: "San Francisco", neighborhoods: "Mission"
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")

คุณสามารถสร้างดัชนีสำหรับการค้นหาแต่ละรายการได้ดังนี้

การรวบรวม ช่องที่จัดทำดัชนี ขอบเขตการค้นหา
ร้านอาหาร หมวดหมู่, การให้ดาว ดวง การรวบรวม
ร้านอาหาร city, star_rating การรวบรวม
ร้านอาหาร category, city, star_rating การรวบรวม
ร้านอาหาร category, city, editors_pick, star_rating การรวบรวม

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

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