Khi truy vấn trên trường **chưa có index**, MongoDB phải quét toàn bộ collection (COLLSCAN) - rất chậm với dữ liệu lớn. Giải pháp: **Tạo index phù hợp**. Đối với tìm kiếm văn bản phức tạp (full-text search), hãy dùng **Text Index** thay vì $regex.
1. Tạo bộ sưu tập và chèn dữ liệu
> db.demo400.insertOne({ "SubjectName": "Java Spring" });
> db.demo400.insertOne({ "SubjectName": "Spring Hibernate" });
> db.demo400.insertOne({ "SubjectName": "Java Hibernate" });
2. Tạo Text Index trên SubjectName
> db.demo400.createIndex({ "SubjectName": "text" });
{ "createdCollectionAutomatically": false, "numIndexesBefore": 1, "numIndexesAfter": 2, "ok": 1 }
3. Xem dữ liệu
> db.demo400.find();
Kết quả:
{ "_id": ObjectId("..."), "SubjectName": "Java Spring" }
{ "_id": ObjectId("..."), "SubjectName": "Spring Hibernate" }
{ "_id": ObjectId("..."), "SubjectName": "Java Hibernate" }
4. Tìm kiếm toàn văn bản từ khóa "Spring"
> db.demo400.find({ $text: { $search: "Spring" } });
5. Kết quả
{ "_id": ObjectId("..."), "SubjectName": "Spring Hibernate" }
{ "_id": ObjectId("..."), "SubjectName": "Java Spring" }
Tại sao Text Index tốt hơn $regex?
$regex(trừ prefix^...) không dùng được index -> COLLSCAN.- Text Index: Tách từ (tokenize), bỏ stop words, hỗ trợ xếp hạng độ liên quan (
textScore), tìm từ khóa ở bất kỳ vị trí nào trong chuỗi. - Hiệu suất: Text Index dùng inverted index -> cực nhanh cho full-text search.
Mẹo: Sắp xếp theo độ liên quan: .sort({ score: { $meta: "textScore" } }).