2010-02-09 46 views
12

Đâ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.

Trả lời

8

Câu trả lời hay nhất của bạn có lẽ là có cột tsvector riêng biệt trong mỗi bảng (với chỉ mục trên, tất nhiên). Nếu bạn tổng hợp dữ liệu lên đến một tsvector chia sẻ, điều đó sẽ tạo ra rất nhiều cập nhật trên chia sẻ đó bất cứ khi nào những người cá nhân cập nhật.

Bạn sẽ cần một chỉ mục cho mỗi bảng. Sau đó, khi bạn truy vấn nó, rõ ràng bạn cần nhiều mệnh đề WHERE, một cho mỗi trường. Sau đó, PostgreSQL sẽ tự động tìm ra kết hợp các chỉ mục để sử dụng để cung cấp cho bạn kết quả nhanh nhất - có khả năng sử dụng chức năng quét bitmap. Nó sẽ làm cho các truy vấn của bạn phức tạp hơn một chút để viết (vì bạn cần nhiều cột phù hợp với điều khoản), nhưng điều đó giúp cho sự linh hoạt chỉ truy vấn một số trường trong các trường hợp bạn muốn.

Bạn không thể tạo một chỉ mục theo dõi nhiều bảng. Để làm điều đó, bạn cần cột tsvector riêng biệt và trình kích hoạt trên mỗi bảng để cập nhật nó.

+2

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) @@. .. –

+1

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

Các vấn đề liên quan