Maksimalkan Efisiensi Pencarian Data dengan Full Text Search di PostgreSQL

Sammi Aldhi Yanto
6 min readJul 19, 2023

--

Photo by Veri Ivanova on Unsplash

Pencarian data adalah fitur umum yang dimiliki banyak aplikasi, seperti Facebook, Instagram, Twitter, Threads, atau media sosial lainnya, yang memungkinkan pengguna untuk menemukan seseorang berdasarkan nama pengguna akun, nama depan, atau nama belakang mereka. Tidak hanya untuk media sosial, fitur pencarian teks juga dapat diterapkan pada aplikasi lain, seperti aplikasi e-commerce, aplikasi berita, dan lain-lain.

Efisiensi dalam pencarian data menjadi hal yang sangat penting untuk mengimplementasikan fitur pencarian ini dengan baik. Pencarian data yang lambat dapat berdampak negatif pada kinerja aplikasi, menyebabkan waktu respons yang lama, dan mengakibatkan user experience yang buruk.

PostgreSQL
PostgreSQL adalah DBMS Relational OpenSource yang sangat populer, terutama di perusahaan enterprise. PostgreSQL juga gratis untuk digunakan. Proyek PostgreSQL dimulai sejak tahun 1986, dibawah arahan Professor Michael Stonebreaker di Universitas California, Berkeley. PostgreSQL sangat populer sekali dikalangan perusahaan Enterprise, lebih lengkapnya mengenai database postgresql bisa dilihat di https://www.postgresql.org

Like Operator
Operator LIKE adalah salah satu fitur yang disediakan oleh PostgreSQL dan juga oleh DBMS lainnya seperti MySQL, Oracle, dan sebagainya. Fitur ini memungkinkan kita untuk melakukan pencarian data berdasarkan pola tertentu menggunakan wildcard.

Dalam operasi LIKE, kita dapat menggunakan wildcard seperti % untuk mencocokkan nol atau lebih karakter, atau _ untuk mencocokkan tepat satu karakter. Namun, perlu diperhatikan bahwa operasi LIKE bersifat case sensitive, artinya perbedaan huruf besar dan kecil akan berpengaruh pada hasil pencarian. Jika ingin melakukan pencarian tanpa memperdulikan huruf besar atau kecil, kita dapat menggunakan operator ILIKE.

Meskipun fitur LIKE/ILIKE dapat membantu kita dalam melakukan pencarian berbasis pola, namun perlu diingat bahwa operasi LIKE/ILIKE dapat menjadi sangat lambat ketika diterapkan pada dataset yang besar 🐌. Menambah index di tabel juga tidak akan membantu, karena LIKE operator tidak menggunakan index.

Oleh karena itu, jika data yang akan diolah sudah terlalu besar, disarankan untuk mencari alternatif lain, seperti menggunakan Full Text Search (FTS) yang disediakan oleh PostgreSQL untuk meningkatkan efisiensi dan kinerja pencarian data.

Berikut contoh penggunaan operator LIKE untuk mencari data

Full Text Search
Full-Text Search memungkinkan kita bisa mencari sebagian kata di kolom dengan tipe data String. Ini sangat cocok ketika pada kasus kita memang membutuhkan pencarian yang tidak hanya sekedar operasi = (equals, sama dengan). Di PostgreSQL, Full-Text Search menggunakan function to_tsvector(text) dan to_tsquery(query). Bahkan kita bisa menggunakan function tersebut tanpa membuat index, namun performanya akan sama saja dengan LIKE, lambat karena harus di cek satu-satu. Operator Full-Text Search menggunakan @@, bukan = seperti pada operator LIKE.

Contoh penggunaan Full Text Search (tanpa index)

Untuk membuat index full text search kita bisa menggunakan perintah

CREATE INDEX idx_name_search ON instructors USING GIN(to_tsvector('indonesian', name));

Tapi sebelum itu, kita harus cek cfg_ts_config apakah sudah ada bahasa indonesia atau belum

Apa itu ts_vector?
Tsvector (Text Search Vector) adalah tipe data khusus yang digunakan dalam PostgreSQL untuk mengoptimalkan operasi pencarian teks dalam fitur Full Text Search (FTS). Tsvector menyimpan hasil pengindeksan teks dari kolom yang ingin dicari, dan memetakan teks menjadi daftar kata-kata yang diurutkan dan diindeks.

Proses transformasi data ke dalam tsvector melibatkan beberapa tahapan. Berikut adalah penjelasan lengkap tentang transformasi data ke dalam tsvector:

  • Pengindeksan Teks
    Pertama, teks yang akan dicari (misalnya, data dalam kolom “name”, “occupation”, atau “email”) diindeks menggunakan aturan-aturan linguistik tertentu. Pengindeksan ini memperhitungkan stop words (kata-kata umum yang diabaikan dalam pencarian), stemming (penghilangan imbuhan kata), dan lainnya untuk memastikan hasil pencarian yang lebih relevan.
  • Normalisasi Teks
    Setelah pengindeksan, teks dinormalisasi dengan mengubahnya menjadi huruf kecil semua, sehingga pencarian menjadi case-insensitive (tidak memperdulikan huruf besar atau kecil).
  • Pembentukan tsvector
    Tsvector dibentuk dari teks yang telah diindeks dan dinormalisasi. Tsvector berfungsi sebagai struktur data yang menyimpan daftar kata-kata yang diurutkan dan diindeks dari teks yang telah diolah sebelumnya. Setiap kata dalam tsvector memiliki posisi dan bobot (weight) yang menunjukkan kepentingan kata tersebut dalam proses pencarian.

Contoh Transformasi Data ke dalam tsvector:

Misalkan kita memiliki data instruktur berikut:
Nama: “John Doe”, Email: “john.doe@example.com”, Pekerjaan: “Software Engineer”

Proses transformasi data untuk tsvector:

Pengindeksan Teks

Nama: “john”, “doe”
Email: “john.doe”, “example”, “com”
Pekerjaan: “software”, “engineer”

Normalisasi Teks

Nama: “john”, “doe”
Email: “john.doe”, “example”, “com”
Pekerjaan: “software”, “engineer”

Pembentukan tsvector

Tsvector untuk Nama: ‘john’ ‘doe’
Tsvector untuk Email: ‘john.doe’ ‘example’ ‘com’
Tsvector untuk Pekerjaan: ‘software’ ‘engineer’

Hasil dari proses transformasi data di atas akan menghasilkan tsvector yang menyimpan daftar kata-kata yang telah diindeks dan dinormalisasi dari teks asli. Tsvector ini akan digunakan dalam operasi pencarian Full Text Search untuk mencari data instruktur dengan lebih cepat dan efisien. Dengan menggunakan tsvector, pencarian teks dalam PostgreSQL dapat dioptimalkan, dan penggunaan indeks GIN pada kolom tsvector akan mempercepat proses pencarian data dalam aplikasi.

Query Operator
to_tsquery() ini mendukung banyak operator, diantaranya:

& untuk AND
| untuk OR
! untuk NOT
“” untuk semua data

Berikut contoh penggunaan operator to_tsquery()

Implementing Full Text Search in Go
Nah sekarang, kita akan membahas cara mengimplementasikan Full Text Search di Go untuk mencari data instruktur dalam tabel instructors. Kita akan membuat sebuah aplikasi sederhana yang memungkinkan pengguna untuk mencari instruktur berdasarkan nama, pekerjaan, atau email, dan menampilkan hasil pencarian tersebut.

Supaya lebih menarik, kita juga akan membuat live search di bagian frontend aplikasi. Fitur ini akan memungkinkan hasil pencarian ditampilkan secara real-time ketika pengguna sedang mengetikkan query di kolom pencarian.

Creating Application
Berikut struktur folder dari aplikasi yang akan kita buat

File docker-compose.yml digunakan untuk menjalankan instance PostgreSQL, berikut isi dari file tersebut

File init.sql digunakan untuk membuat tabel instructors, beserta index full text search-nya.

Pada perintah DDL diatas, kita membuat kolom name_tsvector, email_tsvector, dan occupation_tsvector dengan tipe data tsvector. Kolom-kolom tersebut akan menyimpan hasil transformasi data dari kolom name, email, dan occupation ke dalam tsvector, supaya ketika query dijalankan, kita bisa langsung mencari data di kolom tsvector, tanpa harus transformasi data terlebih dahulu.

File dummy-data.csv berisi 1000 data dummy yang akan kita masukkan ke tabel instructors.

name,email,occupation
Dion Enticott,denticott0@google.com.br,Financial Advisor
Brit Dehm,bdehm1@photobucket.com,Data Coordinator
Bradford Dungay,bdungay2@blogger.com,Pharmacist
Nicol Scrinage,nscrinage3@bandcamp.com,Engineer II
Ophelie Palffrey,opalffrey4@wordpress.com,Graphic Designer
Adore Willson,awillson5@weibo.com,Marketing Manager
Charmion Wealthall,cwealthall6@ovh.net,Electrical Engineer
Thomasine Plover,tplover7@berkeley.edu,VP Sales
Peggie Scolland,pscolland8@dyndns.org,Accounting Assistant IV
...

File instructor.go berisi model dan repository untuk tabel instructors.

File main.go berisi kode untuk handler, http server, db connection, parse csv file, dan menjalankan aplikasi.

Dan yang terakhir index.html berisi kode HTML dan JavaScript untuk menampilkan halaman web dan melakukan live search.

Demo
Berikut tampilan dan video demo aplikasi yang telah kita buat

Referensi
https://www.postgresql.org/docs/current/datatype-textsearch.html
https://www.postgresql.org/docs/current/gin-intro.html
https://medium.com/govtech-edu/fast-text-search-to-boost-user-experience-in-kampus-merdeka-platform-a3a444522754
https://blog.jetbrains.com/go/2022/11/08/build-a-blog-with-go-templates
https://docs.google.com/presentation/d/1OEkr3TlSUwMPSw5g-KjE55nA9H-Y66lo-jKv4QbzlpM/edit#slide=id.g24634f0ad98_0_17

--

--