Fuzzy Searching

Achieving Better Answers with Fuzzy Searching di PostgreSQL

📌 1. Latar Belakang

Pengguna modern tidak puas hanya dengan pencarian exact match (WHERE name = 'Sammi'). Mereka terbiasa dengan Google-like search:

  • Toleransi terhadap typo / kesalahan ketik.

  • Menemukan hasil meski query salah.

  • Mendapat saran mirip “Did you mean … ?”.

Untuk mencapai hal itu di PostgreSQL → kita gunakan fuzzy searching dengan ekstensi pg_trgm.


📌 2. Apa itu pg_trgm?

pg_trgm (PostgreSQL Trigram) adalah ekstensi untuk fuzzy string matching.

  • Membagi string menjadi trigram = potongan substring sepanjang 3 karakter.

  • Kemiripan dihitung berdasarkan jumlah trigram yang sama.

  • PostgreSQL menyediakan operator khusus untuk fuzzy search:

Operator
Fungsi

<->

Jarak antar string (0..1, lebih kecil lebih mirip)

<#>

Mirip <-> tapi berbasis word similarity

%

Boolean: true jika string mirip dengan threshold tertentu

ILIKE / LIKE

Didukung penuh dengan trigram index

~

Regex search (juga bisa dioptimalkan dengan trigram index)


📌 3. Instalasi & Setup

Aktifkan ekstensi:

Contoh data:


📌 4. Cara Kerja Trigram

Contoh string: "abcdef"

Trigram yang dihasilkan:

👉 {" a"," ab",abc,bcd,cde,def,"ef "}

Jadi string diubah jadi potongan-potongan 3 karakter (dengan padding spasi di awal/akhir). Kemiripan string dihitung dari jumlah trigram yang overlap.


Misalnya user salah ketik "Kramertneusiedel" padahal nama yang benar "Gramatneusiedl":

Hasil:

👉 PostgreSQL otomatis menemukan yang paling mirip, bukan exact match.


📌 6. Indexing untuk Performa

Tanpa index → pencarian fuzzy butuh full scan → lambat di dataset besar. Solusinya: buat index khusus trigram.

GiST index:

GIN index (lebih efisien untuk dataset besar):


📌 7. Fuzzy Search vs LIKE

Normal LIKE sangat lambat:

👉 Biasanya menyebabkan sequential scan.

Tapi dengan trigram index:

Query plan akan menunjukkan penggunaan Bitmap Index Scan → jauh lebih cepat.


📌 8. Fuzzy Search dengan Regex

Bahkan regex bisa dipercepat oleh trigram index:

Query plan:

👉 PostgreSQL memahami pola regex dan menggunakan trigram index untuk mempercepatnya.


📌 9. Threshold & Fine-Tuning

Kita bisa atur threshold kemiripan (0..1) untuk operator %.


📌 10. Use Cases Real World

  1. Search bar aplikasi User salah ketik "Jakrta" → hasil "Jakarta".

  2. Autocomplete User ketik "Ban" → saran "Bandung", "Banjarmasin".

  3. Did you mean …? User ketik "gramatneusid" → rekomendasi "Gramatneusiedl".

  4. Fuzzy matching data duplikat Cleaning dataset alamat, nama user, atau entitas bisnis.

  5. Percepat LIKE / ILIKE Query ILIKE '%keyword%' di tabel besar bisa jadi super cepat dengan trigram index.


📌 11. Ringkasan Kelebihan pg_trgm

✅ Menyediakan fuzzy search (did you mean, typo tolerance). ✅ Bisa digunakan dengan LIKE, ILIKE, Regex. ✅ Bisa diindeks dengan GiST / GIN → performa tinggi. ✅ Sangat cocok untuk search bar modern.

⚠️ Kekurangan:

  • Index trigram lumayan besar (karena menyimpan banyak kombinasi trigram).

  • Bisa salah memberi hasil “mirip” (false positive) → harus di-tuning dengan threshold.


👉 Jadi, dengan pg_trgm + GIN/GiST index, PostgreSQL bisa berubah dari sekadar RDBMS biasa → menjadi mesin pencarian mirip Google untuk teks, lengkap dengan fuzzy search, LIKE acceleration, dan regex optimization.

Contoh Program

Last updated