Database 12 Oct 2026 7 views 0 komentar

Elasticsearch untuk Pemula - Search Engine Full-Text yang Super Cepat dari Nol

Elasticsearch untuk Pemula - Search Engine Full-Text yang Super Cepat dari Nol

Pernahkah kamu mencari sesuatu di sebuah website dan hasilnya keluar lambat banget? Atau searching di aplikasi kamu cuma pake LIKE %% di SQL dan ternyata gak relevant hasilnya? Saya dulu juga kayak gitu. Pas bikin fitur search di aplikasi e-commerce, query SQL makin lama makin nge-lag karena data produk udah ratusan ribu. Until saya nemu Elasticsearch.

Elasticsearch itu search engine yang dibangun di atas Apache Lucene. Dia bukan database tradisional kayak MySQL atau PostgreSQL. Elasticsearch dirancang khusus buat full-text search yang super cepat, scalable, dan bisa handle jutaan dokumen tanpa berkeringat. Di artikel ini saya mau sharing pengalaman setup Elasticsearch dari nol sampai bisa dipake buat searching di aplikasi kamu.

Apa Itu Elasticsearch dan Kenapa Kamu Butuh Ini?

Bayangkan kamu punya toko online dengan 500 ribu produk. Kalau user cari "laptop gaming murah", MySQL dengan LIKE %% harus scan seluruh row satu per satu. Hasilnya? Loading 3-5 detik, dan relevansinya gak akurat karena LIKE %% cuma match substring, gak ngerti konteks.

Elasticsearch solve masalah ini dengan konsep yang namanya inverted index. Sederhananya, dia bikin index kayak index buku - bukan scan semua halaman, tapi langsung liat index buat nemuin halaman yang mengandung kata tertentu. Makanya search di Elasticsearch bisa kiloips faster dari SQL LIKE.

Beberapa use case Elasticsearch yang udah saya pake sendiri:

  • E-commerce product search - cari produk dengan filter, sorting, dan fuzzy matching
  • Log aggregation - kumpulkan dan search log dari multiple servers (biasanya bareng Kibana)
  • Autocomplete/suggestion - kayak saat kamu ngetik di Google dan muncul suggestion
  • Full-text search - search artikel/blog/konten dengan highlight hasilnya

Install Elasticsearch di Local Development

Cara termudah install Elasticsearch adalah pake Docker. Kalau kamu belum punya Docker, install dulu. Kemudian jalankan command ini:

# Pull dan jalankan Elasticsearch versi 8.x
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:8.13.0

Tunggu sekitar 30 detik sampai Elasticsearch start. Verifikasi dengan curl:

curl http://localhost:9200

# Output:
# {
# "name" : "elasticsearch",
# "cluster_name" : "docker-cluster",
# "version" : { "number" : "8.13.0", ... },
# "tagline" : "You Know, for Search"
# }

Kalau kamu liat "You Know, for Search", berarti Elasticsearch udah jalan. Mantap!

Konsep Dasar: Index, Document, dan Mapping

Sebelum mulai coding, kamu perlu ngerti tiga konsep utama di Elasticsearch:

  • Index - kayak "table" di MySQL. Tempat menyimpan dokumen-dokumen kamu. Contoh: "products", "articles", "logs".
  • Document - kayak "row" di MySQL. Data dalam format JSON. Satu document = satu produk, satu artikel, dll.
  • Mapping - kayak "schema" di SQL. Define tipe data tiap field (text, keyword, integer, date, dll).

Buat index pertama kamu dengan mapping yang proper:

curl -X PUT "http://localhost:9200/products" -H 'Content-Type: application/json' -d'
{
 "mappings": {
 "properties": {
 "name": { "type": "text" },
 "description": { "type": "text" },
 "price": { "type": "integer" },
 "category": { "type": "keyword" },
 "stock": { "type": "integer" },
 "created_at": { "type": "date" }
 }
 }
}'

Perbedaan text dan keyword itu penting banget. text di-tokenize (dipecah jadi kata-kata) buat full-text search. keyword di-simpan exact match, cocok buat filter dan sorting. Kalau kamu salah milih, search kamu gak akan akurat.

Insert Data ke Elasticsearch

Insert document di Elasticsearch tinggal POST JSON:

curl -X POST "http://localhost:9200/products/_doc" -H 'Content-Type: application/json' -d'
{
 "name": "Laptop Gaming ASUS ROG",
 "description": "Laptop gaming dengan RTX 4060, RAM 16GB, SSD 512GB, layar 15.6 inch 144Hz",
 "price": 18000000,
 "category": "laptop",
 "stock": 5,
 "created_at": "2026-10-12T00:00:00Z"
}'

Untuk insert banyak data sekaligus, pake _bulk API:

curl -X POST "http://localhost:9200/products/_bulk" -H 'Content-Type: application/json' -d'
{"index": {}}
{"name": "Mouse Logitech G502", "description": "Wireless gaming mouse dengan 25k DPI", "price": 850000, "category": "mouse", "stock": 20}
{"index": {}}
{"name": "Keyboard Mechanical Keychron K2", "description": "Mechanical keyboard wireless dengan hot-swappable switch", "price": 1200000, "category": "keyboard", "stock": 10}
{"index": {}}
{"name": "Monitor LG UltraGear 27 inch", "description": "IPS 1440p 144Hz gaming monitor dengan G-Sync", "price": 4500000, "category": "monitor", "stock": 8}
'

Full-Text Search dengan Query DSL

Sekarang bagian seriusnya - searching. Elasticsearch punya Query DSL (Domain Specific Language) berbasis JSON yang super flexible.

Basic match query - cari produk yang mengandung kata "gaming":

curl -X GET "http://localhost:9200/products/_search" -H 'Content-Type: application/json' -d'
{
 "query": {
 "match": {
 "description": "gaming"
 }
 }
}'

Multi-match - cari di multiple field sekaligus:

curl -X GET "http://localhost:9200/products/_search" -H 'Content-Type: application/json' -d'
{
 "query": {
 "multi_match": {
 "query": "gaming wireless",
 "fields": ["name", "description"],
 "type": "cross_fields"
 }
 }
}'

Bool query dengan filter - kombinasi search + filter price:

curl -X GET "http://localhost:9200/products/_search" -H 'Content-Type: application/json' -d'
{
 "query": {
 "bool": {
 "must": [
 { "match": { "description": "gaming" } }
 ],
 "filter": [
 { "range": { "price": { "gte": 500000, "lte": 5000000 } } },
 { "term": { "category": "mouse" } }
 ]
 }
 },
 "sort": [
 { "price": { "order": "asc" } }
 ]
}'

Perhatikan beda must (harus match, contribution ke score) dan filter (harus match tapi gak ngaruh score). Filter lebih cepat karena hasilnya bisa di-cache.

Fuzzy Search untuk Typo Tolerance

Salah satu fitur Elasticsearch yang paling keren adalah fuzzy search. User ngetik "gamng" tetep ketemu produk "gaming":

curl -X GET "http://localhost:9200/products/_search" -H 'Content-Type: application/json' -d'
{
 "query": {
 "match": {
 "description": {
 "query": "gamng wireles",
 "fuzziness": "AUTO"
 }
 }
 }
}'

fuzziness: AUTO bakal otomatis determine berapa edit distance yang reasonable based on panjang kata. Buat "gaming" yang 6 huruf, dia allow 2 edit distance jadi "gamng" (missing 1 huruf) tetep match.

Highlight Hasil Search

Biar user tau kenapa hasil tertentu muncul, Elasticsearch bisa highlight kata yang match:

curl -X GET "http://localhost:9200/products/_search" -H 'Content-Type: application/json' -d'
{
 "query": {
 "match": { "description": "gaming" }
 },
 "highlight": {
 "fields": {
 "description": {
 "pre_tags": ["<mark>"],
 "post_tags": ["</mark>"]
 }
 }
 }
}'

Hasilnya kata "gaming" di description bakal dibungkus tag <mark>. Tinggal style dengan CSS di frontend kamu.

Integrasi dengan PHP (CodeIgniter atau Laravel)

Buat integrasi Elasticsearch ke aplikasi PHP, library yang paling recommended adalah elasticsearch/elasticsearch official client. Install via Composer:

composer require elasticsearch/elasticsearch:^8.0

Setup client dan lakuin search:

use Elasticsearch\ClientBuilder;

$client = ClientBuilder::create()
 ->setHosts(['http://localhost:9200'])
 ->build();

// Search produk
$params = [
 'index' => 'products',
 'body' => [
 'query' => [
 'bool' => [
 'must' => [
 ['multi_match' => [
 'query' => $searchKeyword,
 'fields' => ['name^3', 'description'],
 'fuzziness' => 'AUTO'
 ]]
 ],
 'filter' => [
 ['range' => ['price' => ['gte' => $minPrice, 'lte' => $maxPrice]]]
 ]
 ]
 ],
 'highlight' => [
 'fields' => [
 'description' => ['pre_tags' => ['<mark>'], 'post_tags' => ['</mark>']]
 ]
 ],
 'from' => ($page - 1) * $perPage,
 'size' => $perPage
 ]
];

$response = $client->search($params);

// Process results
foreach ($response['hits']['hits'] as $hit) {
 echo $hit['_source']['name'] . " - " . $hit['_score'] . "\n";
 if (isset($hit['highlight']['description'][0])) {
 echo $hit['highlight']['description'][0] . "\n";
 }
}

Field name^3 artinya match di field "name" dikali 3x scorenya. Jadi kalau keyword muncul di nama produk, relevansinya lebih tinggi dari muncul di description. Simple trick tapi powerful banget buat improve search quality.

Performance Tips yang Saya Pelajari

Setelah pake Elasticsearch di production selama beberapa bulan, ini tips yang gampang-gampang susah didapat dari pengalaman:

  • Pakai filter bukan must buat exact match - filter di-cache dan gak hitung score. Kalau kamu filter by category atau price range, selalu pake filter clause.
  • Mapping jangan auto-detect - Elasticsearch bisa auto-detect mapping, tapi ini sering bikin masalah. Always define mapping explicitly sebelum insert data.
  • Pagination jangan pake from + size buat deep page - kalau kamu paginasi sampai page 1000, dari + size jadi lambat banget. Pakai search_after dengan sorting point.
  • Refresh interval - default 1 detik. Kalau kamu bulk import, set refresh_interval ke -1 dulu, import data, lalu set balik ke 1s. Speedup import 10x.
  • Heap size - set JVM heap ke 50% dari RAM, maksimal 30GB. Jangan lebih dari 30GB karena Java gak optimal dengan pointer compression diatas 30GB.

When NOT to Use Elasticsearch

Jujur, Elasticsearch bukan jawaban buat semua masalah search. Kalau data kamu cuma sedikit (di bawah 50 ribu row), SQL LIKE atau PostgreSQL full-text search udah cukup. Elasticsearch butuh resource yang lumayan - minimum 2GB RAM buat jalan dengan baik.

Juga, kalau kamu butuh transactional consistency (ACID), Elasticsearch bukan pilihan yang tepat. Dia consistency modelnya eventually consistent. Data yang baru di-insert mungkin butuh 1 detik sampai searchable.

Kesimpulan

Elasticsearch itu game-changer buat aplikasi yang butuh search yang cepat dan relevant. Dari setup dengan Docker sampai integrasi dengan PHP, sebenarnya gak terlalu rumit. Yang penting kamu ngerti konsep index, mapping, dan Query DSL.

Kalau kamu lagi develop aplikasi dengan fitur search yang mulai nge-lag dengan SQL, saatnya coba Elasticsearch. Start small dengan docker, test dengan data sample kamu, dan rasain bedanya speednya.

Sudah pernah pake Elasticsearch di project kamu? Atau masih ragun dengan use case tertentu? Share pengalaman kamu di kolom komentar, saya penasaran denger cerita lain tentang Elasticsearch di production!


Bagikan artikel ini:

Komentar (0)

Belum ada komentar. Jadilah yang pertama memberikan tanggapan!

Tinggalkan Komentar