Câu trả lời của sp_BlitzErik đạt được rất nhiều điểm hay, nhưng tôi không nghĩ đó là lý do tại sao bạn không nên sử dụng Tìm kiếm toàn văn. Tìm kiếm toàn văn không có ở đó để làm những gì bạn nghĩ nó làm. Nó không ở đó để tìm kiếm nhiều lĩnh vực. Nó ở đó để vector hóa nội dung từ và sử dụng từ điển, stubbing, lexers, gazetteers, loại bỏ từ dừng, và một loạt các thủ thuật khác không áp dụng. Hoặc, chưa được hiển thị để áp dụng.
Tôi cũng không đồng ý với giải pháp này, mặc dù tôi không chắc làm thế nào để làm điều này tốt hơn trong SQL Server. Hãy tạo lại dữ liệu của anh ấy cho PostgreSQL - nó cũng dễ tạo ra hơn trong PostgreQuery.
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
Bây giờ những gì bạn muốn là một loại enum,
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
Bây giờ bạn đã thu gọn các chuỗi thành biểu diễn số nguyên. Nhưng thậm chí tốt hơn bạn có thể truy vấn chúng như trước đây.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
Điều này có tác dụng.
- che giấu sự thật rằng các danh mục của bạn là một loại liệt kê. Sự phức tạp đó được gói gọn trong loại và ẩn khỏi người dùng.
- nó cũng đặt bảo trì trên các loại trên loại.
- nó được chuẩn hóa.
- nó không tăng kích thước hàng.
Không có những lợi ích này, về cơ bản, bạn chỉ đang cố gắng tối ưu hóa việc so sánh chuỗi. Nhưng than ôi, tôi thậm chí không chắc làm thế nào sp_BlitzErik nhận được câu trả lời được cung cấp mã trong đề xuất,
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Bạn có thể thu gọn mã thông báo xuống số nguyên bằng cách sử dụng enum hoặc phương pháp cuộn bằng tay được đề xuất bởi sp_BlitzErik nhưng nếu bạn có thể thực hiện việc thu gọn thì tại sao bạn cũng làm như vậy? Tức là, nếu bạn biết '% pasta%' là mã thông báo 'pasta' tại sao bạn có %
cả hai mặt của nó. Nếu không có '%' thì đây là một kiểm tra bình đẳng và nó sẽ khá nhanh ngay cả dưới dạng văn bản.