Tôi đã bắt gặp tìm kiếm toàn văn bản trong các bài đăng trong vài ngày qua và tôi hơi bối rối về việc lập chỉ mục khi tìm kiếm trên nhiều cột.
Các tài liệu postgres nói về việc tạo một ts_vector
chỉ mục trên các cột được nối, như vậy:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
mà tôi có thể tìm kiếm như vậy:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Tuy nhiên, nếu tôi muốn đôi khi chỉ tìm kiếm tiêu đề, đôi khi chỉ là phần thân và đôi khi cả hai, tôi sẽ cần 3 chỉ mục riêng biệt. Và nếu tôi thêm vào cột thứ ba, đó có thể là 6 chỉ mục, v.v.
Một cách khác mà tôi chưa thấy trong các tài liệu chỉ là lập chỉ mục hai cột riêng biệt, và sau đó chỉ sử dụng một WHERE...OR
truy vấn bình thường :
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
Điểm chuẩn của hai hàng trên ~ 1 triệu dường như về cơ bản không có sự khác biệt về hiệu suất.
Vì vậy, câu hỏi của tôi là:
Tại sao tôi muốn nối các chỉ mục như thế này, thay vì chỉ lập các cột riêng lẻ? Những lợi thế / bất lợi của cả hai là gì?
Dự đoán tốt nhất của tôi là nếu tôi biết trước tôi sẽ chỉ muốn tìm kiếm cả hai cột (không bao giờ một cột), tôi sẽ chỉ cần một chỉ mục bằng cách ghép mà sử dụng ít bộ nhớ hơn.
title
vàobody
và sau đó lập chỉ mục sẽ mang lại nhiều giá trị, mặc dù tôi sẵn sàng điều chỉnh. Tôi có lẽ sẽ chỉ gắn bó với việc lập chỉ mục chúng một cách riêng biệt. Ngoài ra, nếu đó là một lần lập dị mà bằng cách nào đó yêu cầu bạn ghép nối, thì tôi đoán bạn chỉ có thể chạy truy vấn đặc biệt.