Pendekatan PostgreSQL untuk Carian Tidak Sensitif Aksen
Tidak seperti sesetengah pangkalan data (seperti Microsoft SQL Server), PostgreSQL tidak menyokong himpunan tidak sensitif aksen secara asli. Walaupun PostgreSQL 12 memperkenalkan himpunan ICU bukan deterministik yang menawarkan ketidakpekaan kes dan aksen, ini disertakan dengan pertukaran prestasi dan sekatan operasi.
Strategi untuk Pertanyaan Tidak Sensitif Aksen dalam PostgreSQL
Beberapa kaedah wujud untuk mencapai carian tidak sensitif aksen dalam PostgreSQL:
1. Modul unaccent
:
Modul ini menyediakan fungsi unaccent()
, mengalih keluar aksen daripada rentetan. Ini membenarkan pertanyaan seperti:
<code class="language-sql">SELECT * FROM users WHERE unaccent(name) = unaccent('João');</code>
Walau bagaimanapun, unaccent()
tidak BOLEH UBAH, menghalang penggunaannya dalam indeks ungkapan dan ia tidak mengembangkan ligatur (cth., 'Œ').
2. Pembalut Fungsi C Dioptimumkan:
Untuk menangani batasan unaccent()
, penyelesaian yang lebih cekap melibatkan mencipta pembungkus fungsi C TIDAK BOLEH:
<code class="language-sql">CREATE OR REPLACE FUNCTION public.f_unaccent(text) RETURNS text LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT RETURN public.immutable_unaccent(regdictionary 'public.unaccent', );</code>
Ini membolehkan penciptaan indeks ekspresi:
<code class="language-sql">CREATE INDEX users_unaccent_name_idx ON users(public.f_unaccent(name));</code>
Pertanyaan kemudian gunakan fungsi yang dibalut:
<code class="language-sql">SELECT * FROM users WHERE f_unaccent(name) = f_unaccent('João');</code>
3. Memanfaatkan pg_trgm
untuk Padanan Corak dan Pengikat:
Untuk padanan corak dan pengendalian ligatur yang lebih fleksibel, modul pg_trgm
dengan indeks trigram menawarkan penyelesaian yang berkuasa. Indeks GIN trigram membolehkan carian tidak sensitif huruf besar dan pengesanan persamaan:
<code class="language-sql">CREATE INDEX users_unaccent_name_trgm_idx ON users USING gin (f_unaccent(name) gin_trgm_ops); SELECT * FROM users WHERE f_unaccent(name) LIKE ('%' || f_unaccent('João') || '%');</code>
Perhatikan bahawa pg_trgm
indeks lebih intensif sumber berbanding indeks B-tree standard.
Memilih pendekatan optimum bergantung pada keperluan khusus aplikasi anda, mengimbangi prestasi pertanyaan dengan kos penyelenggaraan indeks dan keperluan untuk pengendalian ligatur.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Carian Tidak Sensitif Aksen dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!