ใช้การค้นหาข้อความ

ใช้ฟีเจอร์การค้นหาข้อความใน Cloud Firestore เพื่อค้นหาสตริงที่เฉพาะเจาะจงภายในคอลเล็กชัน

ก่อนเริ่มต้น

ก่อนเริ่มใช้การค้นหาข้อความ ให้ทำดังนี้

  1. ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงฐานข้อมูลการดำเนินการที่เข้ากันได้กับ MongoDB ที่มีอยู่ หรือสร้างฐานข้อมูลและเชื่อมต่อกับฐานข้อมูลดังกล่าว

  2. ตรวจสอบว่าคุณมีดัชนีข้อความ หรือ สร้างดัชนีข้อความ

การค้นหาข้อความใช้โอเปอเรเตอร์ $text ภายในตัวกรอง ระบุสตริงที่ค้นหาในอาร์กิวเมนต์ $search

เรียกใช้คำสั่งต่อไปนี้เพื่อทำการค้นหาข้อความทั่วไป

  # Find search
  db.cities.find({ $text: { $search: "french bread" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "french bread" } } }
  ]);

หากดัชนีมีการแบ่งพาร์ติชัน คุณสามารถกรองตามพาร์ติชันได้โดยใส่พาร์ติชันในตัวกรองความเท่ากัน "and" ภายในคำค้นหา เช่น หากคุณมีพาร์ติชัน city คุณสามารถกรองการค้นหาข้อความได้ดังนี้

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

นอกจากนี้ คุณยังกรองการรวมตามพาร์ติชันได้ด้วย เช่น

db.myCollection.aggregate([
 { $match: { $text: { $search: "french bread" } } },
 { "city": "Paris" }
] );

ค่าของพาร์ติชันต้องเป็นสตริง ตัวกรองพาร์ติชันต้องเข้าร่วมกับการค้นหาข้อความโดยใช้ "and"

ตั้งค่าภาษาสำหรับการค้นหาข้อความ

คุณสามารถตั้งค่าภาษาสำหรับการค้นหาข้อความได้โดยใช้อาร์กิวเมนต์ $language เช่น

  db.cities.find({ $text: { $search: "french bread", $language: "en"} })

หากคุณไม่ได้ตั้งค่าภาษา การค้นหาจะใช้ภาษาของดัชนีข้อความ

ค้นหาคำที่ตรงกันทุกประการ

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

  # Find search
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best french bread\"" } } },
  ]);

ค้นหาชุดคำ

หากต้องการให้การค้นหาข้อความแม่นยำยิ่งขึ้น ให้ระบุชุดคำ เช่น การค้นหาต่อไปนี้จะแสดงเอกสารที่ตรงกับชุดคำ best AND french AND ("bread" OR "is")

  # Find search
  db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
  ]);

ยกเว้นคำ

หากต้องการยกเว้นคำจากการค้นหาข้อความ ให้ใส่ยัติภังค์ (-) ไว้หน้าคำ

  # Find search
  db.cities.find({ $text: { $search: "best bread -french"} })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best bread -french" } } },
  ]);

คำนวณคะแนนความเกี่ยวข้อง

ใช้นิพจน์ {$meta: "textScore"} เพื่อคำนวณคะแนนความเกี่ยวข้องของ เอกสารที่ตรงกับการค้นหาข้อความ หากต้องการเรียงลำดับผลลัพธ์ตามคะแนนจากมากไปน้อย ให้ใช้ $meta ในนิพจน์การเรียงลำดับ ดูตัวอย่างต่อไปนี้ ซึ่ง SCORE_FIELD คือชื่อของช่องที่ใช้เก็บค่าคะแนน

  # Find search
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .sort({ SCORE_FIELD: { $meta: "textScore" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
  ]);

นอกจากนี้ คุณยังใช้คะแนนข้อความในนิพจน์การฉายภาพได้ด้วย เช่น

  # Find search
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $project: { "scoreField": { $meta: "textScore"} } },
  ]);

โอเปอเรเตอร์ $text จะเพิ่มสตริงการค้นหาตามภาษาที่ระบุเพื่อรวมรายการที่ตรงกันสำหรับคำพ้องความหมายที่คำนึงถึงบริบท รูปแบบที่ได้จากการตัดคำ คำที่สะกดถูกต้อง ตัวแปรการออกเสียง และอื่นๆ เพื่อเพิ่มความเกี่ยวข้องของผลการค้นหาข้อความ

ข้อจำกัด

  • ไม่สามารถใช้โอเปอเรเตอร์ $near และโอเปอเรเตอร์ $text ในการค้นหาข้อความเดียวกัน
  • อนุญาตให้ใช้โอเปอเรเตอร์ $text รายการเดียวต่อการค้นหา find หรือ aggregation
  • ในการรวม ขั้นตอน $match ที่มี $text ต้องเป็นขั้นตอนแรกของไปป์ไลน์
  • $text สามารถซ้อนอยู่ภายใน $and และ $or เท่านั้น
  • หาก $text อยู่ภายใน $or การแยกที่ไม่ใช่การค้นหาอาจใช้ดัชนีที่เรียงลำดับที่มีอยู่เพื่อเพิ่มประสิทธิภาพการค้นหา หากการแยกอื่นๆ ไม่ได้ทำดัชนี การค้นหาจะขึ้นอยู่กับการสแกนคอลเล็กชัน
  • ไม่สามารถใช้ $text กับคำแนะนำ
  • การค้นหาที่มีการค้นหาข้อความจะเรียงลำดับตาม $natural ไม่ได้