Trong chương này, chúng ta sẽ giới thiệu về tìm kiếm toàn văn cơ bản của MongoDB, có sự khác biệt so với toán tử "like" trong SQL. Tìm kiếm toàn văn của MongoDB hiệu quả hơn trong việc tìm kiếm văn bản so với cách thức thực hiện "like" trong SQL.

Chuẩn bị dữ liệu thử nghiệm

Thêm một số bản ghi vào bộ sưu tập stores:

db.stores.insert(
   [
     { _id: 1, name: "Java Hut", description: "Cà phê và bánh ngọt" },
     { _id: 2, name: "Burger Buns", description: "Burger sang trọng" },
     { _id: 3, name: "Coffee Shop", description: "Chỉ cà phê" },
     { _id: 4, name: "Clothes Clothes Clothes", description: "Quần áo giảm giá" },
     { _id: 5, name: "Java Shopping", description: "Hàng Indonesia" }
   ]
)

Tạo chỉ mục văn bản

Để sử dụng khả năng tìm kiếm toàn văn, bạn cần tạo một chỉ mục văn bản. Ví dụ:

db.stores.createIndex( { name: "text", description: "text" } )

Giải thích:

  • Tạo một chỉ mục loại văn bản cho trường tên và mô tả.

Lưu ý: Một bộ sưu tập chỉ cho phép một chỉ mục văn bản, nhưng một chỉ mục văn bản có thể bao gồm nhiều trường.

Toán tử $text

Sử dụng toán tử $text để tìm kiếm văn bản.

Cú pháp:

{ $text: { $search: "từ khóa tìm kiếm" } }

Ví dụ:

db.stores.find( { $text: { $search: "cà phê cửa hàng java" } } )

Giải thích:

  • Tìm kiếm các tài liệu chứa các từ khóa "cà phê", "cửa hàng" và "java" trong trường tên và mô tả.

Kết quả:

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Chỉ cà phê" }
{ "_id" : 1, "name" : "Java Hut", "description" : "Cà phê và bánh ngọt" }
{ "_id" : 5, "name" : "Java Shopping", "description" : "Hàng Indonesia" }

Tìm kiếm cụm từ

db.stores.find( { $text: { $search: "\"cà phê cửa hàng\"" } } )

Kết quả:

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Chỉ cà phê" }

Sắp xếp theo mức độ liên quan

Mặc định, kết quả của truy vấn $text là không được sắp xếp. Truy vấn $text tính toán một điểm số (textScore) cho mức độ liên quan của mỗi tài liệu. Chúng ta có thể sử dụng điểm số này để sắp xếp và hiển thị các tài liệu có mức độ liên quan cao nhất lên đầu.

db.stores.find(
   { $text: { $search: "java cà phê cửa hàng" } },
   { score: { $meta: "textScore" } }  // Khai báo trả về điểm số liên quan textScore
).sort( { score: { $meta: "textScore" } } ) // Chỉ định sắp xếp bằng cách sử dụng textScore

Lưu ý: Tìm kiếm toàn văn MongoDB không cung cấp hỗ trợ tốt cho các cụm từ tiếng Trung.