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

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

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

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

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

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

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

ดัชนีที่อยู่เบื้องหลังการค้นหาแต่ละครั้ง

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

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

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

ประเภทดัชนี

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ดัชนีผสม

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

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

เพื่อหลีกเลี่ยงการสู���เ����ย��ระ���������ิ��าพที่เกิดจากการผสานดัชนี เราขอแนะนำให้คุณสร้างดัชนีคอมโพสิทเพื่อรวมการค้นหา 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
  • อุณหภูมิ ฤดูร้อน อส.
  • อุณหภูมิs.ฤดูร้อน DESC
  • อุณหภูมิสีในฤดูหนาว ASC
  • temperatures.winter DESC
  • ย่านใกล้เคียงของอาร์เรย์ มี (ASC และ DESC)

ดัชนีผสม

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

รายการดัชนี

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

ดัชนี ข้อมูลที่จัดทำดัชนี
รายการดัชนีแบบช่องเดียว
city_name ASC City_name: "เชียงใหม่"
city_name DESC city_name: "San Francisco"
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 มี ASC ย่าน: "Mission"
อาร์เรย์ย่านใกล้เคียงมี DESC ย่าน: "Mission"
อาร์เรย์ย่านใกล้เคียงมี ASC ย่าน: "ดาวน์ทาวน์"
อาร์เรย์ neighborhoods มี DESC ย่าน: "ดาวน์ทาวน์"
อาร์เรย์ neighborhoods มี ASC ย่านใกล้เคียง: "มารินา"
อาร์เรย์ย่านใกล้เคียงมี DESC ย่าน: "Marina"
รายการดัชนีผสม
City_name ASC, ย่าน ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "มิชชัน"
city_name ASC, neighborhoods ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "ตัวเมือง"
City_name ASC, ย่าน ARRAY city_name: "San Francisco", neighborhoods: "Marina"
City_name DESC, ย่าน ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "มิชชัน"
city_name DESC, neighborhoods ARRAY City_name: "เชียงใหม่", ย่านใกล้เคียง: "เชียงใหม่"
City_name DESC, ย่าน ARRAY city_name: "San Francisco", neighborhoods: "Marina"

ดัชนีและราคา

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

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

แม้ว่า Cloud Firestore จะใช้ดัชนีสำหรับการค้นหาทุกรายการ แต่ก็ไม่จำเป็นว่าต้องมี 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 แบบ ascending เสมอ ดังนี้

เว็บ
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")

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

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

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

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

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

เว็บ
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

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

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

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

การกําหนดค่าระดับฟิลด์ 1 รายการอาจมีการกำหนดค่าหลายรายการสําหรับฟิลด์เดียวกัน เช่น การยกเว้นการ��ัดทำดัชนีช่องเดียวและนโยบาย 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) ได้ที่หน้าการแก้ปัญหา