Di bawah setiap artikel di blog ini ada bagian "Baca Juga" yang menampilkan beberapa artikel lain yang mungkin relevan. Fitur kecil tapi cukup penting — selain membantu pengunjung menemukan konten lain yang mereka mungkin butuhkan, ini juga meningkatkan halaman per sesi yang bisa berpengaruh ke performa SEO.
Tapi bikin "Baca Juga" yang benar-benar relevan itu tidak semudah sekadar tampilkan artikel random. Di artikel ini saya ceritakan bagaimana saya pendekatannya.
Versi Paling Malas: Artikel Random dari Kategori Sama
Versi pertama yang saya buat: ambil beberapa artikel dari kategori yang sama dengan artikel yang sedang dibaca, urutkan random. Sederhana, mudah diimplementasikan, dan sudah lebih baik dari tidak ada sama sekali.
SELECT id, title, slug FROM posts
WHERE category_id = ? AND id != ?
ORDER BY RAND()
LIMIT 4;
Masalahnya: ORDER BY RAND() itu mahal secara performa untuk tabel yang besar — MySQL harus assign nilai random ke setiap baris, lalu sort semuanya. Dan hasilnya memang "dari kategori sama" tapi belum tentu benar-benar relevan.
Versi Lebih Baik: Berbasis Tags atau Kata Kunci
Relevansi yang lebih baik bisa didapat kalau kita tahu topik spesifik setiap artikel, bukan cuma kategori umumnya. Kalau artikel yang sedang dibaca tentang "optimasi MySQL", maka "Baca Juga" yang ideal adalah artikel lain yang juga membahas MySQL atau optimasi database — bukan sebarang artikel dari kategori "Oprek Blog."
Pendekatan yang saya ambil: ekstrak kata kunci dari judul artikel menggunakan teknik sederhana — buang stop words (kata-kata umum seperti "dan", "yang", "di", "ke", "dari"), ambil kata-kata yang tersisa sebagai representasi topik artikel.
Lalu cari artikel lain yang judulnya mengandung satu atau lebih kata kunci yang sama:
// Dari judul "Optimasi Query MySQL yang Bikin Blog Ngebut"
// Setelah buang stop words: ["optimasi", "query", "mysql", "blog", "ngebut"]
// Cari artikel lain yang judulnya mengandung kata-kata ini
Hasilnya lebih relevan. Artikel tentang MySQL akan merekomendasikan artikel MySQL lain, bukan artikel tentang desain tampilan blog.
Menghindari ORDER BY RAND()
Untuk menghindari ORDER BY RAND(), saya pakai pendekatan berbeda untuk randomisasi: ambil semua kandidat artikel (yang lolos filter relevansi), lalu randomisasi di level PHP — bukan di MySQL. Dengan cara ini MySQL cukup filter dan sort berdasarkan kriteria relevansi yang sudah terindeks, sedangkan proses random yang ringan dilakukan di PHP setelah data sudah diambil.
$candidates = query_artikel_relevan($kata_kunci, $exclude_id);
shuffle($candidates); // Random di PHP
$hasil = array_slice($candidates, 0, 4); // Ambil 4 pertama
Fallback Kalau Tidak Ada yang Relevan
Satu hal yang perlu ditangani: bagaimana kalau tidak ada artikel lain yang cukup relevan? Ini bisa terjadi untuk artikel yang topiknya sangat spesifik atau untuk blog yang masih sedikit artikelnya.
Saya tambahkan fallback: kalau hasil pencarian relevansi kurang dari 4 artikel, isi sisa slot dengan artikel terbaru dari kategori yang sama. Kalau masih kurang, isi dengan artikel populer dari seluruh blog.
Dengan begitu bagian "Baca Juga" tidak pernah kosong, dan kalau hasilnya memang tidak sempurna relevansinya, setidaknya tetap menampilkan konten yang menarik.
Hasilnya
Sejak saya perbaiki sistem "Baca Juga" ini, rata-rata halaman per sesi pengunjung meningkat cukup signifikan. Pengunjung yang tadinya baca satu artikel lalu pergi, sekarang lebih sering klik satu dua artikel lagi.
Fitur kecil yang impact-nya lumayan. Dan dibangun dari nol tanpa machine learning — cukup logika string matching sederhana yang sudah cukup untuk kebutuhan blog seperti ini.
Kalau blogmu juga punya fitur "Baca Juga", bagaimana cara kamu menentukannya? Cerita di komentar ya.
Belum ada komentar. Jadilah yang pertama menulis.
Tulis Komentar