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

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

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

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

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

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

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

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

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

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

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

ประเภทดัชนี

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

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

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

การจัดทำดัชนีอัตโนมัติ

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

  • สำหรับช่องที่ไม่ใช่อาร์เรย์และช่องที่ไม่ใช่แผนที่ Cloud Firestore จะกำหนด ดัชนีช่องเดียว collection-scope ช่องที่อยู่ในโหมดจากน้อยไปมาก และอีกรายการในโหมดจากมากไปน้อย

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

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

  • ดัชนีช่องเดียวที่มีขอบเขตกลุ่มคอลเล็กชันไม่ได้รับการดูแลโดย "ค่าเริ่มต้น"

การยกเว้นดัชนีช่องเดียว

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

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

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

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

ดัชนีผสม

ดัชนีผสมจะจัดเก็บการจับคู่ที่จัดเรียงของเอกสารทั้งหมดในคอลเล็กชัน อิงตามรายการช่องที่เรียงลำดับเพื่อจัดทำดัชนี

Cloud Firestore ใช้ดัชนีผสมเพื่อรองรับ การค้นหาที่ดัชนีช่องเดียวไม่รองรับคำค้นหาดังกล่าว

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

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

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

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

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

โหมดดัชนี

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

โหมดดัชนี คำอธิบาย
น้อยไปมาก รองรับคำสั่งการค้นหาในช่อง <, <=, ==, >=, >, !=, in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลำดับจากน้อยไปมากตามค่าของช่องนี้
จากมากไปน้อย รองรับข้อความคำค้นหา <, <=, ==, >=, >, !=, in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลำดับจากมากไปน้อยตามค่าช่องนี้
Array-contains รองรับวลีการค้นหา 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 ไม่กี่รายการใน 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 รายการมีดัชนีฟิลด์เดียวสำหรับ ฟิลด์อาร์เรย์ แต่ละแถวในตารางต่อไปนี้แสดงรายการใน ดัชนีช่องเดียว:

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

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

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

  • ชื่อเมือง ASC
  • ชื่อเมือง DESC
  • อุณหภูมิ ฤดูร้อน อส.
  • อุณหภูมิs.ฤดูร้อน DESC
  • อุณหภูมิสีในฤดูหนาว ASC
  • Temperatures.winter DESC
  • ย่านใกล้เคียงของอาร์เรย์ มี (ASC และ DESC)

ดัชนีผสม

  • City_name ASC, ย่าน ARRAY
  • City_name DESC, ย่าน ARRAY

รายการดัชนี

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

ดัชนี ข้อมูลที่จัดทำดัชนี
รายการดัชนีแบบช่องเดียว
ชื่อเมือง ASC City_name: "เชียงใหม่"
ชื่อเมือง DESC City_name: "เชียงใหม่"
อุณหภูมิ ฤดูร้อน อส. อุณหภูมิในฤดูร้อน: 67
อุณหภูมิs.ฤดูร้อน DESC อุณหภูมิในฤดูร้อน: 67
อุณหภูมิสีในฤดูหนาว ASC อุณหภูมิในฤดูหนาว: 55
Temperatures.winter DESC อุณหภูมิในฤดูหนาว: 55
อาร์เรย์ย่านใกล้เคียงมี ASC ย่านใกล้เคียง: "พันธกิจ"
อาร์เรย์ย่านใกล้เคียงมี DESC ย่านใกล้เคียง: "พันธกิจ"
อาร์เรย์ย่านใกล้เคียงมี ASC ย่านใกล้เคียง: "ตัวเมือง"
อาร์เรย์ย่านใกล้เคียงมี DESC ย่านใกล้เคียง: "ตัวเมือง"
อาร์เรย์ย่านใกล้เคียงมี ASC ย่านใกล้เคียง: "มารินา"
อาร์เรย์ย่านใกล้เคียงมี DESC ย่านใกล้เคียง: "มารินา"
รายการดัชนีผสม
City_name ASC, ย่าน ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "มิชชัน"
City_name ASC, ย่าน ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "เชียงใหม่"
City_name ASC, ย่าน ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "มารินา"
City_name DESC, ย่าน ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "มิชชัน"
City_name DESC, ย่าน ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "ตัวเมือง"
City_name DESC, ย่าน ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "มารินา"

ดัชนีและการกำหนดราคา

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

ใช้การรวมดัชนี

แม้ว่า Cloud Firestore จะใช้ดัชนีสำหรับทุกการค้นหา แต่จะไม่ ต้องมี 1 ดัชนีต่อการค้นหา 1 รายการ สำหรับคำค้นหาที่มีความเท่ากันหลายข้อ (==) วลี หรือ Cloud Firestore อาจใช้ได้ (ไม่บังคับ)orderBy นำดัชนีที่มีอยู่กลับมาใช้ใหม่ Cloud Firestore สามารถผสานดัชนีเพื่อให้ ตัวกรองความเท่าเทียมเพื่อสร้างดัชนีผสมที่จำเป็นสำหรับความเท่าเทียมที่มากขึ้น การค้นหา

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

  • ร้านอาหาร แห่ง

    • เบอร์เกอร์

      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")

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

การรวบรวม ช่องที่จัดทำดัชนี ขอบเขตการค้นหา
ร้านอาหาร หมวดหมู่ , การให้คะแนน ดาว การรวบรวม
ร้านอาหาร เมือง, ดาว การรวบรวม
ร้านอาหาร หมวดหมู่ , เมือง, ดาว การรวบรวม
ร้านอาหาร หมวดหมู่ , เมือง, Editor_pick, ดาว การรวบรวม

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

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

ดัชนีชุดนี้ไม่เพียงแต่เล็กลงเท่านั้น แต่ยังรองรับการค้นหาเพิ่มเติมด้วย ได้แก่

เว็บ
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 รายการ) ได้ที่หน้าการแก้ปัญหา