ใช้ฟีเจอร์การค้นหาข้อความใน Cloud Firestore เพื่อค้นหาสตริงที่เฉพาะเจาะจงภายในคอลเล็กชัน
ก่อนเริ่มต้น
ก่อนเริ่มใช้การค้นหาข้อความ ให้ทำดังนี้
ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงฐานข้อมูลการดำเนินการที่เข้ากันได้กับ MongoDB ที่มีอยู่ หรือสร้างฐานข้อมูลและเชื่อมต่อกับฐานข้อมูลดังกล่าว
ตรวจสอบว่าคุณมีดัชนีข้อความ หรือสร้างดัชนีข้อความ
เรียกใช้การค้นหาข้อความ
การค้นหาข้อความใช้โอเปอเรเตอร์ $text ภายในตัวกรอง
ระบุสตริงที่ค้นหาในอาร์กิวเมนต์ $search
เรียกใช้การค้นหาข้อความทั่วไป
เรียกใช้คำสั่งต่อไปนี้เพื่อทำการค้นหาข้อความทั่วไป
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
หากดัชนีมีการแบ่งพาร์ติชัน คุณจะกรองตามพาร์ติชันได้โดยรวมพาร์ติชันไว้ในตัวกรองความเท่ากัน "และ" ภายในการค้นหา
ตัวอย่างเช่น หากคุณมีพาร์ติชัน 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ไม่ได้ - ระบบไม่รองรับการค้นหาข้อความสำหรับแพ็กเกจการควบคุม Assured Workloads ที่บังคับใช้ถิ่นที่อยู่ของข้อมูลที่ใช้งานอยู่ ซึ่งมีการบังคับใช้ข้อจำกัดนโยบายองค์กร
constraints/firestore.managed.disableEnhancedTextSearchโดยค่าเริ่มต้น