ใช้ฟีเจอร์การค้นหาข้อความใน Cloud Firestoreเพื่อค้นหาสตริงที่เฉพาะเจาะจงภายในคอลเล็กชัน
ก่อนเริ่มต้น
ก่อนเริ่มใช้คำค้นหาที่เป็นข้อความ ให้ทำดังนี้
ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงฐานข้อมูลการดำเนินการที่เข้ากันได้กับ MongoDB ที่มีอยู่ หรือสร้างฐานข้อมูลและเชื่อมต่อกับฐานข้อมูลนั้น
ตรวจสอบว่าคุณมีดัชนีข้อความ หรือ สร้างดัชนีข้อความ
สิทธิ์ IAM
หากต้องการสร้างดัชนีใน Cloud Firestore โปรดตรวจสอบว่าคุณได้รับมอบหมายบทบาทต่อไปนี้
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
หากต้องการมอบหมายบทบาท โปรดดูมอบหมายบทบาทเดียว ดูข้อมูลเพิ่มเติมเกี่ยวกับCloud Firestoreบทบาทและสิทธิ์ที่เกี่ยวข้องได้ที่บทบาทที่กำหนดไว้ล่วงหน้า
หากคุณกำหนดบทบาทที่กำหนดเอง ให้มอบสิทธิ์ต่อไปนี้ทั้งหมดเพื่อ สร้างดัชนี
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
เรียกใช้การค้นหาด้วยข้อความ
การค้นหาด้วยข้อความจะใช้โอเปอเรเตอร์ $text ภายในตัวกรอง
ระบุสตริงที่ค้นหาในอาร์กิวเมนต์ $search
เรียกใช้การค้นหาข้อความทั่วไป
เรียกใช้การค้นหาต่อไปนี้เพื่อทำการค้นหาทั่วไป
# Find query
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation query
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 query
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
ค้นหาชุดคำ
ระบุชุดคำเพื่อให้คำค้นหาแม่นยำยิ่งขึ้น เช่น คำค้นหาต่อไปนี้จะแสดงเอกสารที่ตรงกับคำค้นหาbest AND french AND ("bread" OR "is")
# Find query
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
ยกเว้นคำ
หากต้องการยกเว้นคำออกจากคำค้นหา ให้ใส่ขีดกลาง (-) นำหน้าคำนั้น
# Find query
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
คำนวณคะแนนความเกี่ยวข้อง
ใช้การแสดงผล {$meta: "textScore"} เพื่อคำนวณคะแนนความเกี่ยวข้องของ
เอกสารที่ตรงกับคำค้นหาข้อความ หากต้องการจัดเรียงผลลัพธ์ตามคะแนนจากมากไปน้อย
ให้ใช้ $meta ในนิพจน์การจัดเรียง พิจารณาตัวอย่างต่อไปนี้
โดยที่ SCORE_FIELD คือชื่อของฟิลด์ที่ใช้จัดเก็บค่าคะแนน
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
นอกจากนี้ คุณยังใช้คะแนนข้อความในนิพจน์การคาดการณ์ได้ด้วย เช่น
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation query
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ไม่ได้