Setup Elasticsearch
Jalankan Elasticsearch menggunakan Docker:
docker run -d -p 9200:9200 -e "discovery.type=single-node" elasticsearch:8.11.0
Install Elasticsearch client untuk Node.js:
npm install @elastic/elasticsearch
Setelah berjalan, aplikasi dapat terhubung ke Elasticsearch melalui endpoint localhost:9200.
Membuat Index dan Mapping
Mapping digunakan untuk menentukan tipe data setiap field dalam index.
Beberapa tipe yang umum digunakan:
-
text — full-text search dengan analyzer
-
keyword — exact match dan filtering
-
integer — data angka
-
date — data tanggal
Untuk aplikasi berbahasa Indonesia, gunakan analyzer yang sesuai agar proses pencarian dan relevansi hasil lebih optimal.
Indexing Data
Untuk memasukkan data dalam jumlah besar, gunakan Bulk API daripada melakukan indexing satu per satu.
Jika data Elasticsearch harus tetap sinkron dengan database utama, gunakan pendekatan seperti Change Data Capture (CDC) dengan Debezium atau trigger dari aplikasi ketika terjadi perubahan data.
Query Full-Text Search
Untuk pencarian di beberapa field sekaligus, gunakan multi-match query.
Sementara itu, bool query dapat digunakan untuk menggabungkan beberapa kondisi seperti:
-
mustuntuk kondisi yang wajib terpenuhi -
shoulduntuk kondisi yang meningkatkan relevansi -
must_notuntuk mengecualikan data tertentu
Field penting seperti title juga dapat diberikan boost lebih tinggi dibandingkan description agar hasil pencarian lebih relevan.
Fuzzy Search dan Autocomplete
Fuzzy search membantu menemukan hasil meskipun pengguna melakukan typo. Pengaturan fuzziness: "AUTO" dapat digunakan untuk menangani variasi kesalahan penulisan secara otomatis.
Untuk fitur autocomplete, gunakan edge n-gram tokenizer sehingga Elasticsearch dapat mencari berdasarkan prefix kata saat pengguna mulai mengetik.
Highlight dan Pagination
Elasticsearch dapat menampilkan highlight pada bagian teks yang sesuai dengan keyword pencarian sehingga pengguna lebih mudah memahami alasan sebuah hasil muncul.
Untuk dataset besar, gunakan search_after sebagai metode pagination. Pendekatan ini lebih efisien dibandingkan from/offset ketika harus mengambil data dari halaman yang sangat jauh.
Kesimpulan
Elasticsearch cocok untuk membangun fitur pencarian yang cepat dan fleksibel, terutama ketika aplikasi membutuhkan full-text search, fuzzy search, autocomplete, filtering, dan relevansi hasil pada data dalam jumlah besar.