Sử dụng các tính năng tìm kiếm văn bản trong Cloud Firestore để tìm kiếm các chuỗi cụ thể trong một bộ sưu tập.
Trước khi bắt đầu
Trước khi bắt đầu sử dụng tính năng tìm kiếm bằng văn bản, hãy làm như sau:
Đảm bảo rằng bạn có quyền truy cập vào một cơ sở dữ liệu hoạt động tương thích với MongoDB hiện có hoặc Tạo cơ sở dữ liệu và kết nối với cơ sở dữ liệu đó.
Đảm bảo rằng bạn có một chỉ mục văn bản hoặc Tạo chỉ mục văn bản.
Chạy tìm kiếm bằng văn bản
Lệnh tìm kiếm văn bản sử dụng toán tử $text bên trong một bộ lọc.
Chỉ định chuỗi được truy vấn trong đối số $search.
Chạy một cụm từ tìm kiếm chung chung
Chạy lệnh sau để thực hiện tìm kiếm văn bản chung:
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
Nếu chỉ mục của bạn được phân vùng, thì bạn có thể lọc dựa trên phân vùng bằng cách đưa phân vùng vào bộ lọc bình đẳng "và" trong cụm từ tìm kiếm.
Ví dụ: nếu có một phân vùng city, bạn có thể lọc một cụm từ tìm kiếm văn bản như sau:
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
Bạn cũng có thể lọc một phép tổng hợp dựa trên một phân vùng. Ví dụ:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
Giá trị của phân vùng phải là một chuỗi. Bạn phải kết hợp bộ lọc phân vùng với cụm từ tìm kiếm bằng văn bản bằng cách sử dụng "và".
Đặt ngôn ngữ tìm kiếm bằng văn bản
Bạn có thể đặt ngôn ngữ tìm kiếm bằng văn bản bằng đối số $language. Ví dụ:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
Nếu bạn không đặt ngôn ngữ, thì hoạt động tìm kiếm sẽ sử dụng ngôn ngữ của chỉ mục văn bản.
Tìm kiếm một cụm từ chính xác
Để tìm một cụm từ chính xác, hãy định cấu hình cụm từ đó dưới dạng một chuỗi các từ được đặt trong dấu ngoặc kép. Ví dụ:
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
Tìm kiếm một tổ hợp cụm từ
Để tìm kiếm văn bản chính xác hơn, hãy chỉ định một chuỗi các cụm từ. Ví dụ: cụm từ tìm kiếm sau đây sẽ trả về những tài liệu khớp với tổ hợp best AND french AND ("bread" OR "is"):
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
Loại trừ một từ khoá
Để loại trừ một cụm từ khỏi nội dung tìm kiếm bằng văn bản, hãy thêm dấu gạch nối (-) vào trước cụm từ đó:
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
Tính điểm mức độ liên quan
Sử dụng biểu thức {$meta: "textScore"} để tính điểm mức độ liên quan của các tài liệu được so khớp bằng tính năng tìm kiếm văn bản. Để sắp xếp kết quả theo thứ tự giảm dần của điểm số, hãy sử dụng $meta trong biểu thức sắp xếp. Hãy xem xét các ví dụ sau, trong đó SCORE_FIELD là tên của trường dùng để lưu trữ giá trị điểm số:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
Bạn cũng có thể sử dụng điểm văn bản trong biểu thức chiếu. Ví dụ:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
Mở rộng phạm vi tìm kiếm
Để nâng cao mức độ liên quan của kết quả tìm kiếm văn bản, toán tử $text sẽ tăng cường chuỗi tìm kiếm theo ngôn ngữ được chỉ định để bao gồm các kết quả khớp cho từ đồng nghĩa có nhận biết ngữ cảnh, dạng từ gốc, cụm từ đã sửa lỗi chính tả, biến thể có dấu và nhiều kết quả khác.
Hạn chế
- Bạn không thể dùng toán tử
$nearvà toán tử$texttrong cùng một cụm từ tìm kiếm văn bản. - Bạn chỉ được dùng một toán tử
$textcho mỗi cụm từ tìm kiếmfindhoặcaggregation. - Trong các hoạt động tổng hợp, giai đoạn
$matchcó$textphải là giai đoạn đầu tiên của quy trình. - Bạn chỉ có thể lồng
$textbên trong$andvà$or. - Nếu
$textnằm trong$or, thì các thành phần không liên kết trong tìm kiếm có thể sử dụng các chỉ mục được sắp xếp hiện có để tối ưu hoá hoạt động tìm kiếm. Nếu các thành phần tách biệt khác không được lập chỉ mục, thì hoạt động tìm kiếm sẽ dựa vào một lượt quét tập hợp. - Không thể dùng
$textvới gợi ý. - Các cụm từ tìm kiếm bằng văn bản không thể sắp xếp theo
$natural.