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

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

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

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

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

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

ระบบจะจัดเรียงดัชนีแบบรวมตามค่าฟิลด์ตามลำดับที่ระบุไว้ใน คำจำกัดความดัชนี

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

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

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

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

ประเภทดัชนี

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

ดัชนีแบบฟิลด์เดียว

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

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

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

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

  • สำหรับฟิลด์แผนที่แต่ละรายการ Cloud Firestore จะสร้างรายการต่อไปนี้

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

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

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

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

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

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

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

ดัชนีผสม

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

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 รายการต่อฟิลด์ที่ไม่ใช่ อาร์เรย์ และดัชนีแบบฟิลด์เดียวที่ใช้ตัวดำเนินการ array-contains 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"]

ดัชนีแบบฟิลด์เดียว

  • city_name ASC
  • city_name DESC
  • temperatures.summer ASC
  • temperatures.summer DESC
  • temperatures.winter ASC
  • temperatures.winter DESC
  • ย่านมีอาร์เรย์ (ASC และ 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"
temperatures.summer ASC temperatures.summer: 67
temperatures.summer DESC temperatures.summer: 67
temperatures.winter ASC temperatures.winter: 55
temperatures.winter DESC temperatures.winter: 55
ย่านมีอาร์เรย์ ASC ย่าน: "มิชชัน"
neighborhoods Array Contains DESC ย่าน: "มิชชัน"
ย่านมีอาร์เรย์ ASC ย่าน: "ดาวน์ทาวน์"
neighborhoods Array Contains DESC ย่าน: "ดาวน์ทาวน์"
ย่านมีอาร์เรย์ ASC ย่าน: "มารีน่า"
neighborhoods Array Contains DESC ย่าน: "มารีน่า"
รายการดัชนีผสม
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) ได้ที่หน้าการแก้ปัญหา