ประเภทดัชนีใน 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. ระบุตำแหน่งดัชนีที่จะเริ่มการสแกน โดย start position จะขึ้นต้นด้วยตัวกรองความเท่ากันของคำค้นหาและลงท้ายด้วยตัวกรองช่วง และตัวกรองความไม่เท่ากันในฟิลด์ 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 จะอัปเดต ดัชนีแบบฟิลด์เดียวแบบขึ้นต่อฟิลด์ ดัชนีแบบฟิลด์เดียวแบบลงต่อ ฟิลด์ และดัชนีแบบฟิลด์เดียวแบบมีอาร์เรย์สำหรับ ฟิลด์อาร์เรย์ แต่ละแถวในตารางต่อไปนี้แสดงรายการใน ดัชนีแบบฟิลด์เดียว

การรวบรวม จัดทำดัชนีฟิลด์แล้ว ขอบเขตการค้นหา
เมือง ชื่อ การรวบรวม
เมือง รัฐ การรวบรวม
เมือง ประเทศ การรวบรวม
เมือง เมืองหลวง การรวบรวม
เมือง ประชากร การรวบรวม
เมือง ภูมิภาค การรวบรวม
เมือง ชื่อ การรวบรวม
เมือง รัฐ การรวบรวม
เมือง ประเทศ การรวบรวม
เมือง เมืองหลวง การรวบรวม
เมือง ประชากร การรวบรวม
เมือง ภูมิภาค การรวบรวม
เมือง 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
  • มีอาร์เรย์ย่านใกล้เคียง

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

  • 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
มีอาร์เรย์ย่านใกล้เคียง ย่าน: "Mission"
มีอาร์เรย์ย่านใกล้เคียง ย่าน: "ดาวน์ทาวน์"
มีอาร์เรย์ย่านใกล้เคียง ย่าน: "มารีน่า"
รายการดัชนีที่สร้างขึ้นด้วยตนเอง
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 การรวบรวม
ร้านอาหาร 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

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

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

    1,500 ไบต์

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

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

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

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

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

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

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

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

    ฟิลด์ TTL

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

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

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

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

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