Thực hiện tìm kiếm toàn bộ văn bản bằng Data Connect

Firebase Data Connect hỗ trợ tính năng tìm kiếm toàn văn, dựa trên PostgreSQL. Tính năng tìm kiếm toàn văn bản giúp bạn nhanh chóng và hiệu quả tìm thấy thông tin trong các tập dữ liệu lớn bằng cách tìm kiếm từ khoá và cụm từ trên nhiều cột cùng một lúc.

Bạn có thể thêm tính năng tìm kiếm toàn văn bản vào dịch vụ của mình. Trước tiên, hãy thêm chỉ thị @searchable vào String trong giản đồ mà bạn muốn tìm kiếm. Ví dụ:

type Movie
  @table {

  # The fields you want to search over
  title: String! @searchable
  genre: String @searchable
  description: String @searchable
  tags: [String]

  # Some other fields that we won't search over
  rating: Float
  imageUrl: String!
  releaseYear: Int
}

Sau khi thêm chỉ thị này, bạn có thể thực hiện tìm kiếm toàn văn bản bằng cách thêm trường <pluralType>_search vào một truy vấn. Trong trường hợp này, đó sẽ là movies_search:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
  }
}

Tinh chỉnh kết quả tìm kiếm toàn văn

Bạn có thể tinh chỉnh kết quả tìm kiếm toàn văn bản bằng cách thêm các đối số vào chỉ thị @searchable và trường _search;

Đối số dùng chung

Bạn có thể kiểm soát kết quả tìm kiếm bằng nhiều đối số tương tự được dùng cho các trường danh sách cơ bản <pluralType>:

  • order cho phép bạn thay đổi thứ tự kết quả. Nếu bạn bỏ qua, kết quả sẽ được sắp xếp theo mức độ liên quan giảm dần.
  • where cho phép bạn thêm bộ lọc để tìm kiếm (ví dụ: chỉ tìm kiếm phim thuộc một thể loại cụ thể).
  • limit khiến truy vấn chỉ trả về X kết quả hàng đầu.
  • offset khiến truy vấn bỏ qua X kết quả đầu tiên.
  • distinct thêm toán tử DISTINCT vào SQL đã tạo.

Chọn ngôn ngữ

Theo mặc định, tính năng tìm kiếm toàn bộ văn bản sẽ phân tích cú pháp các tài liệu bằng tiếng Anh. Bạn có thể thay đổi chế độ này bằng đối số ngôn ngữ trên chỉ thị @searchable:

type Movie
  @table {
  title: String! @searchable(language: "french")
  ...
}

Việc chỉ định đúng ngôn ngữ sẽ cho phép PostgreSQL thực hiện việc phân tích từ vựng chính xác và giúp đảm bảo rằng cụm từ tìm kiếm của bạn không bỏ lỡ kết quả có liên quan. Nếu bạn đang tìm kiếm trên nhiều cột, thì tất cả các cột đó phải được đặt thành cùng một ngôn ngữ.

Ngôn ngữ
  • đơn giản
  • Tiếng Ả Rập
  • Tiếng Armenia
  • basque
  • catalan
  • danish
  • dutch
  • english
  • tiếng Phần Lan
  • Tiếng Pháp
  • german
  • greek
  • tiếng hindi
  • hungarian
  • indonesian
  • irish
  • italian
  • Tiếng Lithuania
  • nepali
  • Tiếng Na Uy

Bạn có thể sử dụng psql để lấy danh sách đầy đủ bằng truy vấn sau.

SELECT cfgname FROM pg_ts_config;

Định dạng truy vấn

Theo mặc định, tính năng tìm kiếm toàn văn sử dụng ngữ nghĩa web cho các cụm từ tìm kiếm (tương tự như tính năng tìm kiếm của Google). Bạn có thể thay đổi hành vi này bằng đối số queryFormat trên trường <pluralType>_search.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, queryFormat: PHRASE) {
    ...
  }
}

Có 4 lựa chọn về định dạng truy vấn:

  • QUERY cung cấp ngữ nghĩa quen thuộc cho các công cụ tìm kiếm trên web (ví dụ: chuỗi được trích dẫn, AND và OR). Đây là chế độ mặc định.
  • PLAIN khớp với tất cả các từ, nhưng không nhất thiết phải khớp cùng nhau ("brown dog" sẽ khớp với "the brown and white dog" hoặc "the white and brown dog").
  • CỤM TỪ khớp với một cụm từ chính xác ( "chó nâu" sẽ khớp với "chó trắng và nâu", nhưng sẽ không khớp với "chó nâu và trắng").
  • NÂNG CAO cho phép bạn tạo các truy vấn phức tạp bằng cách sử dụng toàn bộ các toán tử tsquery.

Ngưỡng mức độ liên quan

Việc đặt ngưỡng mức độ liên quan có nghĩa là kết quả tìm kiếm của bạn sẽ chỉ trả về những kết quả có giá trị mức độ liên quan cao hơn một giá trị nhất định. Trong nhiều trường hợp, bạn không cần đặt giá trị này – mọi kết quả có độ phù hợp lớn hơn 0 đều sẽ là kết quả phù hợp.

Tuy nhiên, nếu bạn nhận thấy cụm từ tìm kiếm của mình trả về những kết quả không liên quan, thì ngưỡng mức độ liên quan có thể lọc những kết quả đó cho bạn.

Để xác định giá trị phù hợp cho ngưỡng liên quan, bạn nên thực hiện một vài lượt tìm kiếm thử nghiệm và xem _metadata.relevance:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    _metadata {
      relevance
    }
    ...
  }
}

Chọn một ngưỡng loại bỏ những kết quả mà bạn cho là không liên quan. Cách làm như sau:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, relevanceThreshold: 0.05) {
    id
    title
    ...
  }
}

Lựa chọn giữa tìm kiếm toàn văn bản, tìm kiếm tương tự theo vectơ và bộ lọc mẫu chuỗi

Data Connect cung cấp một số cách để tìm kiếm trong cơ sở dữ liệu của bạn.

Hãy sử dụng bảng này để chọn một giải pháp phù hợp cho trường hợp sử dụng của bạn.

Tìm kiếm toàn văn Tìm kiếm dựa trên độ tương tự của vectơ Bộ lọc mẫu chuỗi
Phù hợp để triển khai chức năng tìm kiếm chung Phù hợp để tìm các hàng tương tự về mặt ngữ nghĩa (ví dụ: đề xuất hoặc "Nội dung tương tự") Phù hợp với các cụm từ khớp chính xác hoặc tìm kiếm theo biểu thức chính quy
Thực hiện việc rút gọn từ vựng, giúp so khớp các dạng hoặc thì khác nhau của cùng một từ Cần có Vertex AI Sử dụng ít bộ nhớ và dung lượng ổ đĩa nhất, vì không yêu cầu bất kỳ chỉ mục hoặc cột nào được tạo
Có thể thực hiện trên nhiều cột trong một bảng Mỗi lần chỉ hoạt động cho một cột Có thể thực hiện trên nhiều cột trong bảng bằng cách sử dụng bộ lọc HOẶC
Hiệu suất cao trên các tài liệu lớn hơn Hiệu suất cao đối với các tài liệu lớn Hiệu suất kém hơn khi tìm kiếm trong các tài liệu lớn hơn
Thêm bộ nhớ và dung lượng lưu trữ để lưu trữ một cột đã tạo và một chỉ mục cho mỗi lượt tìm kiếm