ประเภทดัชนีใน 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 รายการสำหรับฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละรายการ
    • ดัชนีที่เพิ่มขึ้นระดับคอลเล็กชัน 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 และ array-contains-any ในฟิลด์
เวกเตอร์ รองรับกลไกการค้นหา FindNearest ในช่อง

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

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

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

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

การเรียงลำดับเริ่มต้นและฟิลด์ __name__

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

โดยค่าเริ่มต้น ระบบจะจัดเรียงฟิลด์ __name__ ในทิศทางเดียวกับฟิลด์ที่จัดเรียงล่าสุด ในการกําหนดดัชนี เช่น

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

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

พร็อพเพอร์ตี้ดัชนี

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

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

Cloud Firestore จะคำนวณผลลัพธ์สำหรับการค้นหาดังนี้

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

ตัวอย่างการจัดทำดัชนี

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

เพื่อเป็นการยกตัวอย่าง ให้ดูตัวอย่างต่อไปนี้จากมุมมองของการสร้างดัชนี ข้อมูลโค้ดต่อไปนี้จะสร้างเอกสาร city 2-3 รายการในคอลเล็กชัน cities และตั้งค่าฟิลด์ name, state, country, capital, population และ regions สำหรับแต่ละเอกสาร

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

การรวบรวม จัดทำดัชนีฟิลด์แล้ว ขอบเขตการค้นหา
เมือง ชื่อ การรวบรวม
เมือง รัฐ การรวบรวม
เมือง ประเทศ การรวบรวม
เมือง ตัวพิมพ์ใหญ่ การรวบรวม
เมือง ประชากร การรวบรวม
เมือง ภูมิภาค การรวบรวม
เมือง ชื่อ การรวบรวม
เมือง รัฐ การรวบรวม
เมือง ประเทศ การรวบรวม
เมือง ตัวพิมพ์ใหญ่ การรวบรวม
เมือง ประชากร การรวบรวม
เมือง ภูมิภาค การรวบรวม
เมือง 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
  • neighborhoods 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"]
neighborhoods 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: "ซานฟรานซิสโก", neighborhoods: "มิชชัน"
city_name ASC, neighborhoods ARRAY city_name: "ซานฟรานซิสโก", neighborhoods: "ดาวน์ทาวน์"
city_name ASC, neighborhoods ARRAY city_name: "ซานฟรานซิสโก", neighborhoods: "มารีน่า"
city_name DESC, neighborhoods ARRAY city_name: "ซานฟรานซิสโก", neighborhoods: "มิชชัน"
city_name DESC, neighborhoods ARRAY city_name: "ซานฟรานซิสโก", neighborhoods: "ดาวน์ทาวน์"
city_name DESC, neighborhoods ARRAY city_name: "ซานฟรานซิสโก", neighborhoods: "มารีน่า"

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

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

ใช้การผสานดัชนี

แม้ว่า 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 การรวบรวม
ร้านอาหาร category, city, 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) ได้ที่หน้าการแก้ปัญหา