2013-01-21 8 views
5

Tôi đang triển khai tìm kiếm toàn văn trong postgres.Có nên lưu trữ bộ tìm kiếm dữ liệu tìm kiếm trong cùng một bảng hoặc bảng ngoài không?

Tôi muốn tìm kiếm tất cả bài đăng trong hệ thống của mình. Chỉ mục toàn văn bài đăng là sự kết hợp của tiêu đề bài đăng và nội dung bài đăng.

Tôi có hai cách để đạt được điều này:

  1. tạo một cột tsvector trong bảng viết, kích hoạt cập nhật với nó.
  2. tạo bảng thứ hai (posts_search) với cột post_id và tsvector chứa dữ liệu chỉ mục.
  3. tạo ra một chỉ số gin đơn giản ... (trong số các câu hỏi, gây ra vấn đề thế giới thực của tôi cần dữ liệu trong nhiều bảng cho chỉ số)

gì đang xảy ra hoạt động tốt hơn, xem xét đôi khi tôi cần phải lọc tìm kiếm theo các thuộc tính khác trong bảng (như deleted_at is null và cứ tiếp tục).

Đây có phải là cách tiếp cận tốt hơn để giữ cột tsvector trong cùng một bảng với dữ liệu (tác dụng phụ chọn * bây giờ hút) hay một bảng riêng (tác dụng phụ, tham gia bắt buộc, lọc chỉ mục phức tạp)?

Trả lời

6

Trong các thử nghiệm của tôi, kích thước điển hình của cột tsvector là khoảng 1% kích thước của trường văn bản mà tsvector này được tính từ việc sử dụng to_tsvector().

Với ý nghĩ này, việc lưu trữ cột tsvector trong một bảng khác sẽ mang lại lợi ích hiệu suất. Ví dụ, ngay cả khi bạn không sử dụng SELECT * (và bạn không nên, thực sự), bất kỳ seqscan nào trong bảng đơn gốc sẽ vẫn phải tải các trang chứa văn bản gốc. Nếu bạn tắt trường tsvector để tách bảng, tải trang sẽ nhanh hơn 100x.

Nói cách khác, tôi sẽ ưu tiên giải pháp thứ hai của việc giảm tải trường tsvector xuống bảng riêng biệt. Hoặc, cách khác, việc tải các bài đăng (văn bản gốc) sâu hơn vào hệ thống phân cấp bảng của bạn (nhưng tôi đoán nó gần như giống nhau).

Lưu ý rằng để tìm kiếm toàn văn bản hoạt động, văn bản gốc không cần thiết. Bạn muốn thậm chí không lưu trữ nó trong cơ sở dữ liệu, hoặc lưu trữ nó ở định dạng nén cao (và không nhất thiết phải dễ dàng truy cập bởi các thường trình SQL). Nó sẽ làm việc miễn là một cái gì đó có thể tạo tsvector dựa trên văn bản gốc, hoặc cập nhật khi nó thay đổi.

+0

một mối quan tâm nhỏ mặc dù là sử dụng lại chỉ mục, không chắc chắn về độ tinh vi của kế hoạch, tôi tự hỏi liệu nó có thể –