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 truy vấn 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 hiện có tương thích với MongoDB 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.
Quyền IAM
Để tạo chỉ mục trong Cloud Firestore, hãy đảm bảo rằng bạn được chỉ định bất kỳ vai trò nào sau đây:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Để cấp một vai trò, hãy xem bài viết Cấp một vai trò. Để biết thêm thông tin về các vai trò trong Cloud Firestore và các quyền liên quan, hãy xem bài viết Các vai trò được xác định trước.
Nếu bạn đã xác định các vai trò tuỳ chỉnh, hãy chỉ định tất cả các quyền sau đây để tạo chỉ mục:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Chạy truy vấn văn bản
Truy vấn 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 truy vấn văn bản chung
Chạy truy vấn sau đây để thực hiện truy vấn chung:
# Find query
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation query
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 đẳng thức "and" trong truy vấn.
Ví dụ: nếu có phân vùng city, bạn có thể lọc truy vấn 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 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 truy vấn bằng cách sử dụng "and".
Đặt ngôn ngữ truy vấn
Bạn có thể đặt ngôn ngữ truy vấ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ữ truy vấn, thì truy vấn sẽ sử dụng ngôn ngữ của chỉ mục văn bản.
Truy vấn một cụm từ chính xác
Để truy vấn 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 từ được đặt trong dấu ngoặc kép. Ví dụ:
# Find query
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
Truy vấn tổ hợp cụm từ
Để truy vấn chính xác hơn, hãy chỉ định một chuỗi cụm từ. Ví dụ: truy vấn sau đây trả về các tài liệu khớp với tổ hợp best AND french AND ("bread" OR "is"):
# Find query
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
Loại trừ một cụm từ
Để loại trừ một cụm từ khỏi truy vấn, hãy thêm dấu gạch ngang (-) vào trước cụm từ đó:
# Find query
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation query
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 do truy vấn văn bản so khớp. Để sắp xếp kết quả theo thứ tự điểm giảm dần, 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 đây, trong đó SCORE_FIELD là tên của trường dùng để lưu trữ giá trị điểm số:
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation query
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 các biểu thức chiếu. Ví dụ:
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
Mở rộng nội dung tìm kiếm
Để tăng mức độ liên quan của kết quả truy vấn, toán tử $text sẽ tăng cường chuỗi tìm kiếm theo ngôn ngữ đã chỉ định để bao gồm các kết quả khớp cho từ đồng nghĩa theo ngữ cảnh, dạng gốc, cụm từ đã sửa lỗi chính tả, biến thể dấu phụ và nhiều kết quả khác.
Hạn chế
- Không thể sử dụng toán tử
$nearvà toán tử$texttrong cùng một truy vấn. - Bạn chỉ được phép sử dụng một toán tử
$textcho mỗi truy vấnfindhoặcaggregation. - Trong các phép tổng hợp, giai đoạn
$matchcó$textphải là giai đoạn đầu tiên của quy trình. $textchỉ có thể được lồng bên trong$andvà$or.- Nếu
$textnằm trong$or, thì các phần tử không 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á truy vấn. Nếu các phần tử không tìm kiếm khác không được lập chỉ mục, thì truy vấn sẽ dựa vào quá trình quét bộ sưu tập. - Không thể sử dụng
$textvới gợi ý truy vấn. - Truy vấn có tính năng tìm kiếm văn bản không thể sắp xếp theo
$natural.