Fuzzy Matching dan Levenshtein di SQL: Cocokin Teks Mirip (2026)
TL;DR
Fuzzy matching di SQL nyocokin teks yang mirip tapi nggak persis sama, misalnya 'Budi' dan 'Budy'. Cara paling umum di PostgreSQL pakai fungsi levenshtein dari extension fuzzystrmatch buat ngitung jarak edit, atau fungsi similarity dari pg_trgm buat ngukur kemiripan 0 sampai 1. Makin kecil jarak atau makin tinggi similarity, makin mirip teksnya.
Fuzzy matching di SQL nyocokin teks yang mirip tapi nggak persis sama, misalnya 'Budi' dan 'Budy'.
Operator sama dengan biasa cuma cocok kalau teksnya identik. Data pelanggan asli jarang serapi itu. Nama yang sama sering ditulis beda: typo, kelebihan spasi, atau salah huruf.
Habis baca ini kamu bisa nyocokin nama yang typo pakai Levenshtein distance dan similarity, plus tau kapan pilih yang mana. Contohnya pakai data pelanggan toko UMKM di PostgreSQL.
Apa itu fuzzy matching di SQL?
Fuzzy matching adalah teknik nyocokin dua teks yang mirip tapi nggak identik. Alih-alih jawab cocok atau nggak, fuzzy matching ngasih skor kemiripan. Di PostgreSQL, ini biasa dibikin pakai Levenshtein distance buat ngitung perubahan huruf, atau similarity buat skor kemiripan.
Kepakai tiap kali data teks ditulis manual dan nggak konsisten. Nama pelanggan, nama produk, alamat, semua rawan typo. Kalau kamu butuh nyari kata di teks panjang, itu urusan beda yang dibahas di full text search PostgreSQL.
Apa itu Levenshtein distance?
Levenshtein distance adalah jumlah minimal perubahan huruf buat ngubah satu kata jadi kata lain. Perubahannya bisa nambah, ngapus, atau ganti satu huruf. 'Budi' jadi 'Budy' butuh satu ganti huruf, jadi jaraknya 1. Makin kecil jaraknya, makin mirip.
Angka ini gampang dipahami. Jarak 0 artinya identik. Jarak 1 sampai 2 biasanya typo ringan. Jarak besar artinya dua teks yang beda beneran. Konsep dasar teks dan karakter bisa kamu cek di glossary string.
Gimana cara pakai levenshtein di PostgreSQL?
Aktifin dulu extension fuzzystrmatch sekali per database, lalu panggil fungsi levenshtein(teks_a, teks_b). Fungsinya balikin angka jarak edit. Kamu bisa pakai di WHERE buat nyaring nama yang jaraknya di bawah ambang tertentu.
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
SELECT levenshtein('Budi Santoso', 'Budy Santosa') AS jarak;
-- Hasil: 2
Buat nyari kandidat nama mirip di sebuah tabel, taruh levenshtein di WHERE dengan ambang jarak. Contohnya nyari nama yang jaraknya 3 huruf atau kurang dari 'Budi Santoso'.
SELECT id, nama, levenshtein('Budi Santoso', nama) AS jarak
FROM pelanggan
WHERE levenshtein('Budi Santoso', nama) <= 3
ORDER BY jarak;
Levenshtein paling pas buat teks pendek seperti nama. Buat teks panjang, ngitungnya mahal karena dia ngecek tiap kombinasi huruf.
Gimana pakai similarity dan pg_trgm?
Aktifin extension pg_trgm, lalu pakai fungsi similarity(a, b) yang balikin skor 0 sampai 1. Fungsi ini motong teks jadi potongan tiga huruf (trigram), lalu ngitung berapa banyak yang sama. Makin tinggi skornya, makin mirip. Cocok buat data besar karena bisa pakai GIN index.
CREATE EXTENSION IF NOT EXISTS pg_trgm;
SELECT id, nama, similarity('Siti Aminah', nama) AS skor
FROM pelanggan
ORDER BY skor DESC;
Ada juga operator % yang otomatis nyaring pakai ambang bawaan. WHERE nama % 'Siti Aminah' balikin baris yang similarity-nya di atas ambang default 0,3. Praktis buat pencarian cepat.
SELECT id, nama
FROM pelanggan
WHERE nama % 'Siti Aminah';
Buat data besar, bikin GIN index pakai gin_trgm_ops biar operator % jalan cepat tanpa scan semua baris.
Contoh kasus: rapihin nama pelanggan toko_berkah
Toko_berkah punya 3.000 baris pelanggan hasil input manual dari beberapa kasir. Nama yang sama sering muncul dua kali dengan ejaan beda. Pemiliknya mau tau berapa pelanggan yang sebenarnya duplikat.
Dari dataset ngulikdata, dengan ambang similarity 0,5, ketemu 214 pasang nama yang kemungkinan besar orang yang sama. Itu sekitar 7% dari total baris yang selama ini keitung sebagai pelanggan berbeda.
SELECT a.nama AS nama_a, b.nama AS nama_b,
similarity(a.nama, b.nama) AS skor
FROM pelanggan a
JOIN pelanggan b ON a.id < b.id
WHERE similarity(a.nama, b.nama) > 0.5
ORDER BY skor DESC;
Syarat a.id < b.id penting biar tiap pasang cuma muncul sekali, bukan bolak-balik. Tanpa itu, tiap duplikat keitung dua kali dan angkanya jadi dobel.
Kesalahan umum fuzzy matching
Pukul rata satu ambang buat semua data. Ambang 0,5 yang pas buat nama orang bisa terlalu ketat buat alamat. Tes ambang di data sampel dulu, jangan asal pakai angka dari internet.
Pakai levenshtein di data besar tanpa mikir performa. Fungsi ini ngecek tiap baris satu per satu dan nggak bisa pakai index. Buat jutaan baris, pakai pg_trgm dengan GIN index yang jauh lebih cepat.
Lupa normalisasi teks dulu. 'BUDI' dan 'budi' bisa dianggap beda kalau nggak di-lowercase. Bungkus pakai lower() dan trim() sebelum dicocokin biar huruf besar-kecil dan spasi sisa nggak ganggu.
FAQ
Apa itu fuzzy matching di SQL?
Fuzzy matching nyocokin dua teks yang mirip tapi nggak persis sama, seperti nama yang typo. Hasilnya skor kemiripan, bukan cuma cocok atau nggak. Di PostgreSQL biasa pakai Levenshtein distance atau similarity dari pg_trgm.
Apa bedanya Levenshtein dan similarity?
Levenshtein ngitung jumlah perubahan huruf, hasilnya angka bulat. Similarity ngitung kemiripan lewat potongan tiga huruf, hasilnya 0 sampai 1. Levenshtein bagus buat teks pendek, similarity lebih cepat buat data besar karena bisa pakai index.
Gimana cara aktifin fungsi levenshtein?
Jalankan CREATE EXTENSION IF NOT EXISTS fuzzystrmatch sekali di database. Setelah itu fungsi levenshtein langsung bisa dipakai. Buat similarity, aktifin pg_trgm. Dua-duanya bawaan PostgreSQL, nggak perlu install paket luar.
Penutup
Fuzzy matching nolong kamu nyocokin teks yang berantakan tanpa harus rapihin manual satu per satu. Pakai levenshtein buat teks pendek seperti nama, dan similarity dari pg_trgm buat data besar dengan GIN index. Jangan lupa tes ambangnya di data sampel dulu.
Mau latihan query fuzzy matching di dataset asli? Kulik di NgulikSQL, editor SQL siap pakai tanpa install.
Lanjut baca: GROUP BY dan HAVING buat ngerangkum hasil pencocokan, dan dokumentasi resmi fuzzystrmatch PostgreSQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Composite Index di SQL: Cara Kerja dan Urutan Kolom
Composite index itu index atas beberapa kolom sekaligus. Urutan kolomnya nentuin query mana yang kebantu, lewat aturan leftmost prefix.
Menghitung Stickiness (DAU/MAU) di SQL
Stickiness ngukur seberapa sering user balik lagi. Ini cara hitung DAU, MAU, dan rasio stickiness pakai SQL, plus contoh aplikasi UMKM.
Menghitung DAU dan MAU dengan SQL
DAU dan MAU dua metrik wajib buat produk digital. Ini cara hitungnya pakai SQL, lengkap query DISTINCT, per bulan, sampai rasio stickiness.