FTS không hỗ trợ LIKE
Các câu trả lời được chấp nhận trước đây là không chính xác. Tìm kiếm toàn văn bản với các chỉ mục văn bản đầy đủ của nó hoàn toàn không dành cho LIKE
toán tử, nó có các toán tử riêng và không hoạt động với các chuỗi tùy ý. Nó hoạt động dựa trên các từ dựa trên từ điển và gốc. Nó không hỗ trợ phù hợp với tiền tố cho lời , nhưng không phải với các LIKE
nhà điều hành:
Chỉ mục Trigram cho LIKE
Cài đặt mô-đun bổ sung pg_trgm
cung cấp các lớp toán tử cho các chỉ mục GIN và GiST trigram để hỗ trợ tất cả LIKE
và ILIKE
các mẫu , không chỉ các mẫu được neo bên trái:
Chỉ mục ví dụ:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
Hoặc là:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
Truy vấn mẫu:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Hình bát quái? Còn về các chuỗi ngắn hơn?
Các từ có ít hơn 3 chữ cái trong các giá trị được lập chỉ mục vẫn hoạt động. Hướng dẫn sử dụng:
Mỗi từ được coi là có hai dấu cách được đặt trước và một dấu cách được đặt trước khi xác định bộ bát quái có trong chuỗi.
Và các mẫu tìm kiếm có ít hơn 3 chữ cái? Hướng dẫn sử dụng:
Đối với cả LIKE
tìm kiếm biểu thức chính quy và tìm kiếm biểu thức chính quy, hãy nhớ rằng một mẫu không có bát quái có thể trích xuất sẽ chuyển thành quét toàn bộ chỉ mục.
Có nghĩa là, việc quét chỉ mục index / bitmap vẫn hoạt động (các kế hoạch truy vấn cho câu lệnh đã chuẩn bị sẽ không bị hỏng), nó sẽ không giúp bạn có hiệu suất tốt hơn. Thông thường, không có tổn thất lớn nào, vì các chuỗi 1 hoặc 2 chữ cái hầu như không được chọn lọc (hơn một vài phần trăm các kết quả phù hợp với bảng bên dưới) và hỗ trợ chỉ mục sẽ không cải thiện hiệu suất ngay từ đầu, vì quá trình quét toàn bộ bảng nhanh hơn.
text_pattern_ops
để đối sánh tiền tố
Đối với chỉ các mẫu được neo bên trái (không có ký tự đại diện ở đầu), bạn sẽ có được giá trị tối ưu với lớp toán tử phù hợp cho chỉ mục btree: text_pattern_ops
hoặc varchar_pattern_ops
. Cả hai tính năng tích hợp của Postgres tiêu chuẩn, không cần mô-đun bổ sung. Hiệu suất tương tự, nhưng chỉ số nhỏ hơn nhiều.
Chỉ mục ví dụ:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
Truy vấn mẫu:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
Hoặc , nếu bạn nên chạy cơ sở dữ liệu của mình với ngôn ngữ 'C' (thực sự không có ngôn ngữ), thì mọi thứ vẫn được sắp xếp theo thứ tự byte và chỉ mục btree thuần túy với lớp toán tử mặc định sẽ thực hiện công việc.
Thêm chi tiết, giải thích, ví dụ và liên kết trong các câu trả lời liên quan này trên dba.SE: