Sử dụng tính năng tìm kiếm bằng văn bản

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:

  1. Đả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 đó.

  2. Đả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.

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 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"} } },
  ]);

Để 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ử $near và toán tử $text trong 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ử $text cho mỗi cụm từ tìm kiếm find hoặc aggregation.
  • Trong các hoạt động tổng hợp, giai đoạn $match$text phải là giai đoạn đầu tiên của quy trình.
  • Bạn chỉ có thể lồng $text bên trong $and$or.
  • Nếu $text nằ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 $text vớ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.