ประเภทดัชนีใน 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 รายการสำหรับฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละรายการ
    • ดัชนีที่เพิ่มขึ้นระดับคอลเล็กชันสำหรับค่าแผนที่ทั้งหมด
    • ดัชนีจากมากไปน้อยระดับคอลเล็กชันสำหรับค่าแผนที่ทั้งหมด
    • ดัชนี array-contains ระดับคอลเล็กชัน 1 รายการสําหรับฟิลด์ย่อยของอาร์เรย์แต่ละรายการ
    • Cloud Firestore จะจัดทำดัชนีฟิลด์ย่อยของแผนที่แต่ละรายการแบบเรียกซ้ำ
  • สำหรับฟิลด์อาร์เรย์แต่ละรายการในเอกสาร Cloud Firestore จะสร้างรายการต่อไปนี้

    • ดัชนีที่เพิ่มขึ้นระดับคอลเล็กชันสำหรับค่าอาร์เรย์ทั้งหมด
    • ดัชนีจากมากไปน้อยระดับคอลเล็กชันสำหรับค่าอาร์เรย์ทั้งหมด
    • ดัชนี 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-any ในฟิลด์
เวกเตอร์ รองรับกลไกการค้นหา 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 และ 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"])

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

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

เว็บ
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
  • ละแวกใกล้เคียง 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"
ละแวกใกล้เคียง 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 Array Contains ย่าน: "ดาวน์ทาวน์"
Neighborhoods Array Contains ย่าน: "มารีน่า"
รายการดัชนีที่สร้างขึ้นด้วยตนเอง
city_name ASC, neighborhoods ARRAY city_name: "ซานฟรานซิสโก", neighborhoods: "มิชชัน"
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: "ซานฟรานซิสโก", neighborhoods: "มิชชัน"
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 การรวบรวม
ร้านอาหาร city, star_rating การรวบรวม
ร้านอาหาร หมวดหมู่ เมือง star_rating การรวบรวม
ร้านอาหาร หมวดหมู่, เมือง, editors_pick, star_rating การรวบรวม

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

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

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

  • ผลรวมของขนาดรายการดัชนีฟิลด์เดียวของเอกสาร
  • ผลรวมของขนาดรายการดัชนีแบบคอมโพสิตของเอกสาร
  • ขนาดสูงสุดของค่าฟิลด์ที่จัดทำดัชนี

    1500 ไบต์

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

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

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

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

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

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

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

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

    ฟิลด์ TTL

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

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

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

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

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