ใช้ Text Index ร่วมกับ operator $text และ $search เพื่อค้นหาข้อความหลายคำในหลายฟิลด์พร้อมกัน
ข้อกำหนดเบื้องต้น
ต้องสร้าง Text Index ก่อน:
db.collectionName.createIndex({ "field1": "text", "field2": "text" })
ตัวอย่างเต็มรูปแบบ
1. สร้างข้อมูลตัวอย่าง
> db.searchMultipleFieldsDemo.insertOne({"_id":100,"FirstSubject":"Java","SecondSubject":"MongoDB"});
> db.searchMultipleFieldsDemo.insertOne({"_id":101,"FirstSubject":"MongoDB","SecondSubject":"MySQL"});
> db.searchMultipleFieldsDemo.insertOne({"_id":102,"FirstSubject":"MySQL","SecondSubject":"Java"});
2. แสดงข้อมูลทั้งหมด
> db.searchMultipleFieldsDemo.find().pretty();
{ "_id" : 100, "FirstSubject" : "Java", "SecondSubject" : "MongoDB" }
{ "_id" : 101, "FirstSubject" : "MongoDB", "SecondSubject" : "MySQL" }
{ "_id" : 102, "FirstSubject" : "MySQL", "SecondSubject" : "Java" }
3. สร้าง Text Index (จำเป็น)
> db.searchMultipleFieldsDemo.createIndex({ "FirstSubject": "text", "SecondSubject": "text" });
4. ค้นหา "Java" และ "MongoDB" ในทั้งสองฟิลด์
> db.searchMultipleFieldsDemo.find({ $text: { $search: "Java MongoDB" } });
{ "_id" : 102, "FirstSubject" : "MySQL", "SecondSubject" : "Java" }
{ "_id" : 100, "FirstSubject" : "Java", "SecondSubject" : "MongoDB" }
{ "_id" : 101, "FirstSubject" : "MongoDB", "SecondSubject" : "MySQL" }
พฤติกรรมของ $search
"Java MongoDB"= ค้นหาเอกสารที่มี Java หรือ MongoDB (OR logic)"\"Java MongoDB\""= ค้นหาคำวลี "Java MongoDB" ตรงๆ (Phrase search)"Java -MongoDB"= มี Java แต่ ไม่มี MongoDB- ค้นหาได้ทุกฟิลด์ที่อยู่ใน Text Index
- ผลลัพธ์เรียงตาม Text Score (ความเกี่ยวข้อง)
ดู Text Score
db.collection.find(
{ $text: { $search: "Java MongoDB" } },
{ score: { $meta: "textScore" } }
).sort({ score: { $meta: "textScore" } })
สรุป
- ต้องสร้าง Text Index ก่อน (หนึ่งคอลเลกชันได้แค่ 1 Text Index)
- ใช้
$text+$searchสำหรับ full-text search - รองรับหลายภาษา, stemming, case-insensitive
- ไม่เหมาะกับ exact match หรือ pattern matching (ใช้ regex แทน)