Mesin pencari 80 baris yang dibuat dengan Python
- September lalu, penulis bergabung sebagai data scientist pencarian di Wallapop dan bekerja dengan mesin pencari open source bernama Solr.
- Untuk memahami prinsip dasar mesin pencari, penulis memutuskan membuat mesin pencari dari nol menggunakan Python.
- Tujuannya adalah menyelesaikan "krisis keterlihatan situs web kecil", yaitu mengembalikan kejayaan situs-situs kecil yang tidak dapat ditemukan dengan mesin pencari seperti Google.
- Tulisan ini memandu proses membuat mesin pencari dengan Python, dan semua kode yang ditulis dapat dilihat di repositori GitHub
microsearch.
- Mesin pencari yang diimplementasikan bukan mesin pencari siap produksi, melainkan contoh mainan yang tetap bisa digunakan untuk menunjukkan cara kerja internal mesin pencari.
microsearch
- Tulisan ini membahas komponen-komponen yang menyusun microsearch dan mengeksplorasi bagaimana masing-masing dibuat: (1) crawler, (2) inverted index, (3) ranking, (4) antarmuka.
Crawler
- Langkah pertama untuk membuat mesin pencari adalah memperoleh data yang akan dicari.
- Dengan tujuan membuat "Google lokal", penulis membangun mesin pencari menggunakan data dari blog-blog yang diikuti.
- Proses crawling mencakup mengunduh dan merapikan semua posting dari daftar blog tertentu.
- Agar lebih cepat, penulis menggunakan library Python
asyncio untuk memangkas waktu crawling dari 20 menit menjadi 20 detik.
- Sebanyak 642 feed RSS digunakan; sekitar 100 di antaranya adalah blog yang sering dibaca, dan 500 sisanya diambil dari proyek blog surprisetalk.
Inverted index
- Inverted index adalah struktur data yang memetakan kata kunci ke dokumen, sehingga memudahkan pencarian dokumen tempat kata tertentu muncul.
- Saat pengguna menjalankan kueri, inverted index digunakan untuk mengambil semua dokumen yang cocok dengan kata kunci dalam kueri.
- Logika inverted index didefinisikan di dalam kelas bernama
SearchEngine, dan diimplementasikan dengan menginisialisasi dua dictionary.
Ranking
- Setelah ada sekumpulan dokumen yang cocok untuk kueri tertentu, diperlukan cara untuk mengurutkannya.
- Metode ranking yang paling terkenal adalah PageRank milik Google, tetapi ada juga opsi lain seperti BM25 yang memberi peringkat dokumen berdasarkan isi.
- Penulis mengimplementasikan bagian yang sebelumnya belum ada di kelas
SearchEngine, termasuk cara menghitung skor BM25.
Antarmuka
- Setelah membangun mesin pencari, penulis ingin memublikasikannya dalam suatu bentuk.
- Penulis membangun aplikasi FastAPI untuk menyediakan endpoint yang mengekspos mesin pencari, sekaligus merender halaman web sederhana untuk melakukan pencarian.
- Agar hasil mudah dibaca, diputuskan untuk hanya memilih N URL teratas.
Fitur yang belum ada
- Pembaca yang sering bekerja dengan mesin pencari mungkin akan segera menyadari bahwa banyak fitur belum diimplementasikan.
- Yang belum ada antara lain operator kueri, pengindeksan n-gram, perluasan kueri atau dokumen, serta kemampuan melakukan crawling dan indexing secara bersamaan.
Kesimpulan
- Melalui proyek ini, penulis jadi lebih memahami cara kerja internal Solr dan mempelajari kehebatan menulis kode asinkron.
- Sebagai langkah berikutnya untuk membuat mesin pencari pribadi, penulis berencana mengimplementasikan fitur semantic search pada mesin pencari tersebut.
Opini GN⁺
- Hal terpenting dari tulisan ini adalah bahwa individu dapat membuat mesin pencari sendiri untuk meningkatkan keterlihatan situs web kecil.
- Pengalaman menyederhanakan dan mengimplementasikan mesin pencari dengan fitur kompleks menggunakan Python dan library open source dapat menjadi inspirasi bahkan bagi software engineer pemula.
- Dengan menunjukkan efisiensi pemrograman asinkron dan pentingnya struktur data melalui contoh nyata, tulisan ini menawarkan wawasan teknis sekaligus peluang belajar yang praktis.
1 komentar
Komentar Hacker News
Membangun mesin pencari BM25 dengan Pandas
Ulasan kode: kelas
SearchEnginek1danb, dan tidak ada komentar sama sekali di dalam kode._documentsdiduga menggunakan URL sebagai kunci, dan isi URL tersebut sebagai nilainya.Kompleksitas mesin pencari
Pendapat tentang jumlah baris kode
Lelucon tentang ekspresi dalam kode
chunk for chunk in chunks if chunkdi dalam kode membuat orang teringat pada lelucon tentang penebang kayu.Contoh kode mesin rekomendasi
Perbandingan performa library parsing
lxml.htmldanlxml.html.cleanbisa jauh lebih cepat daripadaBeautifulSoup.Saran penggunaan kata kunci
Pendapat tentang proyek edukatif
Keraguan tentang pemrosesan data skala besar dengan Python