Đây có thể là một câu hỏi rất đơn giản, vì vậy xin lỗi trước, nhưng tôi rất mới sử dụng cơ sở dữ liệu.Postgres tìm kiếm toàn văn trên nhiều bảng liên quan
Tôi muốn Postgres chạy tìm kiếm văn bản đầy đủ trên nhiều bảng được nối. Hãy tưởng tượng một cái gì đó giống như một người dùng mô hình, với các mô hình liên quan UserProfile và UserInfo. Tìm kiếm sẽ chỉ dành cho Người dùng, nhưng sẽ bao gồm thông tin từ UserProfile và UserInfo.
Tôi đang lập kế hoạch sử dụng chỉ mục gin cho tìm kiếm. Tuy nhiên, tôi không rõ ràng về việc liệu tôi có cần cột tsvector riêng trong bảng Người dùng để giữ các tập hợp tsvectors từ các bảng và thiết lập trình kích hoạt để cập nhật nó hay không. Hoặc nếu có thể tạo chỉ mục mà không có cột tsvector sẽ tự cập nhật bất cứ khi nào bất kỳ trường nào có liên quan trong bất kỳ bảng nào có liên quan thay đổi. Ngoài ra, bất kỳ lời khuyên về cú pháp của lệnh để tạo ra tất cả điều này sẽ được nhiều đánh giá là tốt.
Bạn có thể đi vào chi tiết về cách truy vấn đọc sẽ hoạt động không? Tôi đang cố gắng tìm tài liệu về cách tốt nhất để thực hiện tìm kiếm toàn văn bản postgresql trên nhiều bảng và tôi không tìm thấy nhiều. Một vấn đề tôi gặp phải là nếu tôi thiết lập một chỉ mục trên mỗi bảng mà tôi đã truy vấn, postgresql không thể sử dụng tất cả các chỉ mục khi tôi đã thực hiện một truy vấn. Giống như: chọn * từ các đơn đặt hàng còn lại tham gia trên người dùng ... tham gia trái vào line_items ... trong đó ts_vector ('english', orders.id) @@ ... hoặc ts_vector ('english', users.name) @@. .. –
Tôi cũng thấy rằng truy vấn tìm kiếm trong hai bảng thực hiện quét tuần tự ('SELECT COUNT (*) FROM sản phẩm WHERE to_tsvector ('simple', products.name::text) @@ to_tsquery ('đơn giản', 'foo '; văn bản); '), trong khi truy vấn tìm kiếm một bảng chỉ thực hiện quét chỉ mục bitmap bằng cách sử dụng chỉ mục (' SELECT COUNT (*) FROM sản phẩm LEFT JOIN nhãn hiệu ON products.brand_id = brands.id WHERE to_tsvector (' simple ' , products.name::text) @@ to_tsquery ('đơn giản', 'foo' :: văn bản) HOẶC to_tsvector ('đơn giản', brands.name::text) @@ to_tsquery ('đơn giản', 'foo' :: văn bản); '). – wvengen