Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Chạy truy vấn phức tạp hiệu quả trên trường chưa index trong MongoDB

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" } }).