Bạn không sử dụng lớp toán tử do pg_trgm
cung cấp mô-đun. Tôi sẽ tạo một chỉ mục như thế này:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Ban đầu, tôi có một chỉ mục GIN ở đây, nhưng sau đó tôi biết rằng một GiST có lẽ thậm chí còn phù hợp hơn cho loại truy vấn này vì nó có thể trả về các giá trị được sắp xếp theo sự giống nhau. Thêm chi tiết:
- Postgresql:Các mẫu đối sánh giữa hai cột
- Tìm các chuỗi tương tự với PostgreSQL một cách nhanh chóng
Truy vấn của bạn phải khớp với biểu thức chỉ mục để có thể sử dụng nó.
SELECT label
FROM the_table
WHERE lower(unaccent_text(label)) % 'fil'
ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
Tuy nhiên, "filbert" và "filé powder" không thực sự giống với "fil" theo toán tử%. Tôi nghi ngờ điều bạn thực sự muốn là cái này:
SELECT label FROM the_table WHERE lower(unaccent_text(label)) ~~ '%fil%' ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
Thao tác này sẽ tìm tất cả các chuỗi có chứa chuỗi tìm kiếm và sắp xếp các kết quả phù hợp nhất theo %
toán tử đầu tiên.
Và phần hấp dẫn:biểu thức có thể sử dụng chỉ mục GIN hoặc GiST kể từ PostgreSQL 9.1 ! Tôi trích dẫn hướng dẫn trên pg_trgm moule:
Bắt đầu từ PostgreSQL 9.1, các loại chỉ mục này cũng hỗ trợ tìm kiếm chỉ mục cho LIKE và ILIKE, chẳng hạn
Nếu bạn thực sự muốn sử dụng %
nhà điều hành:
Bạn đã thử giảm ngưỡng chưa cho toán tử tương tự %
với set_limit()
:
SELECT set_limit(0.1);
hoặc thậm chí thấp hơn? Giá trị mặc định là 0,3. Chỉ để xem liệu ngưỡng đó có lọc các kết quả phù hợp bổ sung hay không.