Pencarian teks penuh sederhana di PostgreSQL
Mulai pencarian teks yang lebih relevan daripada LIKE menggunakan tsvector dan tsquery.
Keterbatasan LIKE untuk pencarian
LIKE '%kata%' bekerja untuk pencocokan sederhana, tetapi tidak memahami bentuk kata, tidak bisa mengurutkan berdasarkan relevansi, dan sulit dioptimalkan dengan indeks pada teks panjang.
Menyiapkan kolom pencarian
ALTER TABLE artikel ADD COLUMN pencarian tsvector
GENERATED ALWAYS AS (to_tsvector('indonesian', judul || ' ' || isi)) STORED;
CREATE INDEX idx_artikel_pencarian ON artikel USING GIN (pencarian);
Kolom pencarian otomatis terisi dari gabungan judul dan isi setiap kali baris berubah, karena memakai GENERATED ALWAYS AS ... STORED.
Menjalankan pencarian
SELECT judul
FROM artikel
WHERE pencarian @@ to_tsquery('indonesian', 'database & indeks')
ORDER BY ts_rank(pencarian, to_tsquery('indonesian', 'database & indeks')) DESC;
to_tsquery menerima operator seperti & (dan), | (atau), dan ! (bukan) untuk menyusun kondisi pencarian. ts_rank memberi skor relevansi yang bisa dipakai untuk mengurutkan hasil.
Konfigurasi bahasa memengaruhi hasil
Konfigurasi indonesian menentukan cara kata dasar dikenali. Kata berimbuhan seperti "pencarian" dan "mencari" bisa dianggap serupa tergantung kamus yang dipakai konfigurasi tersebut.
Kapan butuh solusi lebih lengkap
Untuk kebutuhan pencarian yang lebih kompleks, seperti typo tolerance atau pencarian lintas bahasa dalam skala besar, mesin pencarian khusus seperti Elasticsearch atau Meilisearch biasanya lebih sesuai dibanding full text search bawaan database.
Latihan
Tambahkan bobot berbeda antara judul dan isi artikel memakai setweight, lalu perhatikan bagaimana urutan hasil pencarian berubah.
