ประเภทดัชนีใน 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")
การรวบรวม ช่องที่จัดทำดัชนี ขอบเขตการค้นหา
เมือง ประเทศ, ประชากร คน การรวบรวม
เมือง ประเทศ, ประชากร การรวบรวม

เพื่อหลีกเลี่ยงการสูญเสียประสิทธิภาพที่เกิดจากการรวมดัชนี เราขอแนะนำให้คุณสร้างดัชนีเพื่อรวมการค้นหา 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
  • neighborhoods 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"]
neighborhoods 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")

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

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

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

การรวบรวม ช่องที่จัดทำดัชนี ขอบเขตการค้นหา
ร้านอาหาร หมวดหมู่, การให้ดาว ดวง การรวบรวม
ร้านอาหาร เมือง, 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 ครั้งต่อวินาที หากไม่ได้ค้นหาตามฟิลด์ที่มีค่าตามลำดับ คุณสามารถยกเว้นฟิลด์จากการจัดทำดัชนีเพื่อข้ามขีดจำกัดนี้ได้

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

    ช่อง TTL

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

    ช่องอาร์เรย์หรือแผนที่ขนาดใหญ่

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

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

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