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

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

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

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

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

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

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

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

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

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

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

ประเภทดัชนี

Cloud Firestore ใช้ดัชนี 2 ประเภท ได้แก่ ช่องเดียวและcomposite นอกจากจำนวนช่องที่มีการจัดทำดัชนีแล้ว ดัชนีช่องเดียวและดัชนีผสมยังขึ้นอยู่กับว่าคุณจัดการช่องเหล่านั้นอย่างไร

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

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

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

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

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

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

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

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

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

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

ใช้ค่าเส้นทางช่อง * เพื่อเพิ่มการยกเว้นดัชนีระดับคอลเล็กชันในทุกช่องในกลุ่มคอลเล็กชัน ตัวอย่างเช่น สำหรับกลุ่มคอลเล็กชัน 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 ในช่อง
เวกเตอร์ รองรับวลีการค้นหา FindNearest ในช่อง

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

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

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

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

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

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

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

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

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

ดัชนีที่สมบูรณ์แบบ

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

  1. ช่องที่ใช้ในตัวกรองความเท่าเทียมกัน
  2. ช่องที่ใช้ในลำดับการจัดเรียง
  3. ฟิลด์ที่ใช้ในตัวกรองช่วงและอสมการ (ที่ไม่ได้รวมอยู่ในลำดับการจัดเรียง)
  4. ช่องที่ใช้ในการรวม (ที่ยังไม่ได้รวมอยู่ในลำดับการจัดเรียง และตัวกรองช่วงและอสมการ)

Firestore จะคำนวณผลลัพธ์ของคำค้นหาดังนี้

  1. ระบุดัชนีที่เกี่ยวข้องกับคอลเล็กชันของคำค้นหา พร็อพเพอร์ตี้ตัวกรอง โอเปอเรเตอร์ตัวกรอง และลำดับการจัดเรียง
  2. ระบุตำแหน่งดัชนีเพื่อเริ่มสแกนจากการใช้ตัวกรองความเท่าเทียมกันของคำค้นหา รวมถึงตัวกรองช่วงและอสมการในลำดับแรกตามช่อง
  3. เริ่มสแกนดัชนีและแสดงผลเอกสารแต่ละรายการที่ตรงกับตัวกรองทั้งหมดจนกว่าจะทำดังนี้
    1. พบเอกสารที่ไม่ตรงตามเงื่อนไขตัวกรองและยืนยันว่าเอกสารต่อๆ มาจะไม่ตรงตามเงื่อนไขตัวกรองทั้งหมด หรือ
    2. ถึงจุดสิ้นสุดของดัชนี หรือ
    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 รายการต่อช่องที่ไม่ใช่อาร์เรย์ ดัชนีช่องเดียวที่มีมากไปหาน้อยต่อช่องที่ไม่ใช่อาร์เรย์ และอาร์เรย์ 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

รายการดัชนี

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

ดัชนี ข้อมูลที่จัดทำดัชนี
รายการดัชนีแบบช่องเดียว
ชื่อเมือง 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 ดัชนีต่อการค้นหา สำหรับการค้นหาที่มีวลีที่เท่ากันหลายรายการ (==) และอนุประโยค orderBy (ไม่บังคับ) Cloud Firestore จะใช้ดัชนีที่มีอยู่ซ้ำได้ 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")

ขีดจำกัดของการจัดทำดัชนี

ขีดจำกัดต่อไปนี้มีผลกับดัชนี โปรดดูโควต้าและขีดจำกัดทั้งหมดที่หัวข้อโควต้าและขีดจำกัด

ขีดจำกัด รายละเอียด
จำนวนสูงสุดของดัชนีผสมสำหรับฐานข้อมูล
จำนวนสูงสุดของการกำหนดค่าช่องเดียวสำหรับฐานข้อมูล

การกำหนดค่าระดับช่องรายการเดียวอาจมีการกำหนดค่าหลายรายการสำหรับช่องเดียวกัน เช่น การยกเว้นการจัดทำดัชนีช่องเดียวและนโยบาย TTL ในช่องเดียวกันจะนับเป็นการกําหนดค่าช่องเดียวในขีดจํากัด

จำนวนรายการดัชนีสูงสุดสำหรับเอกสารแต่ละรายการ

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