Anda tidak menggunakan kelas operator yang disediakan oleh pg_trgm
modul. Saya akan membuat indeks seperti ini:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Awalnya, saya memiliki indeks GIN di sini, tetapi kemudian saya mengetahui bahwa GiST mungkin lebih cocok untuk kueri semacam ini karena dapat mengembalikan nilai yang diurutkan berdasarkan kesamaan. Selengkapnya:
- Postgresql:Mencocokkan Pola antara Dua Kolom
- Menemukan string serupa dengan PostgreSQL dengan cepat
Kueri Anda harus cocok dengan ekspresi indeks agar dapat menggunakannya.
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
Namun, "filbert" dan "filé powder" sebenarnya tidak terlalu mirip dengan "fil" menurut operator %. Saya menduga apa yang Anda inginkan adalah ini:
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
Ini akan menemukan semua string yang berisi string pencarian, dan mengurutkan yang paling cocok menurut %
operator terlebih dahulu.
Dan bagian yang menarik:ekspresi dapat menggunakan indeks GIN atau GiST sejak PostgreSQL 9.1 ! Saya mengutip manual di pg_trgm moule:
Mulai dari PostgreSQL 9.1, jenis indeks ini juga mendukung pencarian indeks untuk LIKE dan ILIKE, misalnya
Jika Anda benar-benar bermaksud menggunakan %
operator:
Sudahkah Anda mencoba menurunkan ambang untuk operator kesamaan %
dengan set_limit()
:
SELECT set_limit(0.1);
atau bahkan lebih rendah? Standarnya adalah 0,3. Hanya untuk melihat apakah ambang batas yang memfilter kecocokan tambahan.