Ringkasan
API Elasticsearch mendukung pencarian dan analitik berskala besar. Anda dapat mengindeks dokumen sebagai JSON, melakukan kueri menggunakan DSL yang canggih, serta mengagregasi hasil untuk kebutuhan analitik. Otentikasi didukung lewat API key atau basic auth. Untuk pengujian, gunakan Apidog untuk validasi pemetaan indeks, pengujian kueri pencarian, dan debug agregasi sebelum ke klaster produksi.
Pendahuluan
Elasticsearch adalah mesin pencari dan analitik terdistribusi yang bisa dipakai untuk teks terstruktur, log, metrik, dan data lainnya. Perusahaan menggunakannya untuk pencarian teks aplikasi, analisis log debugging, serta dasbor analitik real-time.
Elasticsearch adalah inti dari stack ELK (Elasticsearch, Logstash, Kibana), namun bisa digunakan langsung via API tanpa Logstash.
💡 Jika Anda membangun fitur pencarian atau analisis log, Apidog membantu menguji kueri, validasi pemetaan, dan debug agregasi. Templat pencarian dapat disimpan dan dibagikan ke tim.
Uji API Elasticsearch dengan Apidog – gratis
Pada akhir panduan ini, Anda akan bisa:
- Mengindeks dan mengelola dokumen
- Menulis kueri pencarian dengan DSL Elasticsearch
- Menggunakan agregasi untuk analitik
- Mengonfigurasi pemetaan dan penganalisis
- Memantau kesehatan klaster
Memulai
Jalankan Elasticsearch secara lokal
# Docker
docker run -p 9200:9200 \
-e "discovery.type=single-node" \
elasticsearch:8.11.0
# Atau unduh dari elastic.co
Verifikasi instalasi
curl -X GET "http://localhost:9200"
Respons:
{
"name": "elasticsearch-1",
"cluster_name": "elasticsearch",
"cluster_uuid": "abc123",
"version": {
"number": "8.11.0",
"build_flavor": "default"
},
"tagline": "You know, for search"
}
Otentikasi
Elasticsearch 8.x selalu membutuhkan otentikasi:
curl -X GET "http://localhost:9200/_cluster/health" \
-u elastic:your_password
Atau gunakan API key (buat di Kibana atau lewat API).
Indeks dan Dokumen
Buat indeks
curl -X PUT "http://localhost:9200/products" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"name": { "type": "text" },
"price": { "type": "float" },
"category": { "type": "keyword" },
"in_stock": { "type": "boolean" },
"created_at": { "type": "date" }
}
}
}'
Indeks dokumen
curl -X POST "http://localhost:9200/products/_doc" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"name": "Wireless Headphones",
"price": 79.99,
"category": "electronics",
"in_stock": true,
"created_at": "2026-03-24T10:00:00Z"
}'
Respons:
{
"_index": "products",
"_id": "abc123",
"_version": 1,
"result": "created",
"_seq_no": 0,
"_primary_term": 1
}
Dapatkan dokumen
curl -X GET "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password
Perbarui dokumen
curl -X PUT "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"name": "Wireless Headphones Pro",
"price": 99.99,
"category": "electronics",
"in_stock": true,
"created_at": "2026-03-24T10:00:00Z"
}'
Hapus dokumen
curl -X DELETE "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password
Operasi massal
Indeks beberapa dokumen sekaligus:
curl -X POST "http://localhost:9200/products/_bulk" \
-u elastic:your_password \
-H "Content-Type: application/x-ndjson" \
-d '{"index":{"_id":"1"}}
{"name":"Product A","price":10.99,"category":"books","in_stock":true}
{"index":{"_id":"2"}}
{"name":"Product B","price":20.99,"category":"electronics","in_stock":false}
'
Kueri Pencarian
Pencarian dasar
curl -X GET "http://localhost:9200/products/_search" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"query": {
"match": {
"name": "headphones"
}
}
}'
Kueri Boolean
Gabungkan beberapa kondisi:
{
"query": {
"bool": {
"must": [
{ "match": { "name": "headphones" } }
],
"filter": [
{ "term": { "category": "electronics" } },
{ "range": { "price": { "lte": 100 } } },
{ "term": { "in_stock": true } }
]
}
}
}
Pencarian teks lengkap dengan penilaian
{
"query": {
"multi_match": {
"query": "wireless audio headphones",
"fields": ["name^2", "description"],
"type": "best_fields",
"fuzziness": "AUTO"
}
}
}
Field dengan ^2 memiliki bobot lebih tinggi dalam penilaian.
Pencarian frasa
Cari frasa tepat:
{
"query": {
"match_phrase": {
"description": "noise canceling"
}
}
}
Wildcard dan regex
{
"query": {
"wildcard": {
"name": "*headphone*"
}
}
}
Penyortiran
{
"query": { "match_all": {} },
"sort": [
{ "price": "asc" },
{ "_score": "desc" }
]
}
Paginasi
{
"from": 20,
"size": 10,
"query": { "match_all": {} }
}
Agregasi
Agregasi digunakan untuk menghitung statistik ringkasan dari data.
Harga rata-rata berdasarkan kategori
curl -X GET "http://localhost:9200/products/_search" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"size": 0,
"aggs": {
"by_category": {
"terms": { "field": "category" },
"aggs": {
"avg_price": { "avg": { "field": "price" } },
"min_price": { "min": { "field": "price" } },
"max_price": { "max": { "field": "price" } }
}
}
}
}'
Histogram harga
{
"size": 0,
"aggs": {
"price_histogram": {
"histogram": {
"field": "price",
"interval": 25
}
}
}
}
Histogram tanggal
{
"size": 0,
"aggs": {
"sales_over_time": {
"date_histogram": {
"field": "created_at",
"calendar_interval": "month"
}
}
}
}
Kardinalitas (jumlah unik)
{
"size": 0,
"aggs": {
"unique_categories": {
"cardinality": { "field": "category" }
}
}
}
Pemetaan dan Penganalisis
Tipe bidang
| Tipe | Digunakan untuk |
|---|---|
text |
Pencarian teks lengkap, dianalisis |
keyword |
Nilai tepat, filter, urut |
integer, float
|
Angka |
boolean |
Benar/salah |
date |
Tanggal dan waktu |
object |
Objek JSON bersarang |
nested |
Array objek (mempertahankan relasi) |
geo_point |
Koordinat lat/lon |
Penganalisis kustom
Untuk pemrosesan teks khusus:
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "autocomplete_filter"]
}
},
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
Manajemen Klaster
Kesehatan klaster
curl -X GET "http://localhost:9200/_cluster/health"
Respons:
{
"cluster_name": "elasticsearch",
"status": "green",
"number_of_nodes": 3,
"active_primary_shards": 25
}
Status:
- green: Semua shard dialokasikan
- yellow: Replika tidak dialokasikan (node tunggal)
- red: Shard primer hilang
Statistik indeks
curl -X GET "http://localhost:9200/_cat/indices?v"
Statistik node
curl -X GET "http://localhost:9200/_nodes/stats"
Hapus cache
curl -X POST "http://localhost:9200/_cache/clear"
Pengujian dengan Apidog
Kueri Elasticsearch sering kompleks. Uji secara menyeluruh.
1. Simpan kueri umum
Simpan templat pencarian di Apidog:
{
"query": {
"bool": {
"must": [
{ "match": { "{{search_field}}": "{{search_term}}" } }
],
"filter": [
{ "range": { "{{price_field}}": { "lte": "{{max_price}}" } } }
]
}
}
}
2. Validasi respons
pm.test('Search returns results', () => {
const response = pm.response.json()
pm.expect(response.hits.total.value).to.be.above(0)
})
pm.test('Aggregations present', () => {
const response = pm.response.json()
pm.expect(response.aggregations).to.exist
})
3. Pemisahan lingkungan
# Lokal
ES_HOST: http://localhost:9200
ES_USER: elastic
ES_PASSWORD: your_password
# Produksi
ES_HOST: https://search.yourcompany.com
ES_API_KEY: prod_api_key
Uji API Elasticsearch dengan Apidog – gratis
Kesalahan Umum dan Perbaikan
403 Terlarang
Penyebab: Otentikasi gagal atau izin tidak cukup.
Perbaikan: Cek kredensial. Pastikan API key punya izin indeks yang benar.
404 index_not_found_exception
Penyebab: Indeks belum ada.
Perbaikan: Buat indeks dulu, atau aktifkan auto-creation (default aktif, tapi tidak disarankan produksi).
circuit_breaking_exception
Penyebab: Kueri memakai memori terlalu banyak.
Perbaikan: Kurangi parameter size, sederhanakan kueri, atau tambah filter.
search_phase_execution_exception
Penyebab: Error sintaks kueri.
Perbaikan: Cek JSON. Masalah umum: tanda kutip hilang, jalur field salah.
Alternatif dan Perbandingan
| Fitur | Elasticsearch | OpenSearch | Meilisearch | Typesense |
|---|---|---|---|---|
| Pengaturan | Dihosting sendiri | Dihosting sendiri | Biner tunggal | Biner tunggal |
| Kualitas pencarian | Sangat Baik | Baik | Sangat Baik | Baik |
| Kurva pembelajaran | Curam | Curam | Mudah | Mudah |
| Skalabilitas | Sangat Baik | Sangat Baik | Baik | Baik |
| Penawaran cloud | Elastic Cloud | OpenSearch Serverless | Meilisearch Cloud | Typesense Cloud |
Elasticsearch punya fitur terbanyak dan komunitas besar. Meilisearch dan Typesense cocok untuk pencarian dasar.
Kasus Penggunaan Dunia Nyata
Pencarian e-commerce:
Situs ritel mengindeks 100.000 produk. Pengguna dapat mencari berdasarkan nama, deskripsi, kategori, atau rentang harga. Pelengkapan otomatis menyarankan produk saat diketik. Filter mempersempit hasil berdasarkan kategori & ketersediaan.
Log aplikasi:
Tim DevOps mengirim log ke Elasticsearch lewat Filebeat. Engineer mencari log berdasarkan layanan, severity, dan waktu. Dasbor menampilkan tingkat error dan waktu respons.
Analitik keamanan:
Tim keamanan mengindeks log jaringan, mencari IP mencurigakan, memvisualisasikan pola traffic, dan mengaktifkan alert anomali via agregasi.
Mengakhiri
Berikut yang sudah Anda pelajari:
- Mengindeks dokumen sebagai JSON
- Kueri pencarian dengan DSL Elasticsearch
- Agregasi untuk analitik
- Konfigurasi pemetaan untuk pencarian optimal
- Monitoring kesehatan klaster
Langkah selanjutnya:
- Jalankan Elasticsearch lokal
- Buat indeks dan pemetaan
- Indeks beberapa dokumen pengujian
- Tulis kueri pencarian
- Coba agregasi
Uji API Elasticsearch dengan Apidog – gratis
FAQ
Apa perbedaan antara Elasticsearch dan Solr?
Keduanya berbasis Lucene. Elasticsearch lebih unggul dalam distribusi & API. Solr punya fitur enterprise lebih banyak. Proyek baru umumnya memilih Elasticsearch.
Bagaimana cara menangani karakter khusus dalam pencarian?
Escape karakter: ()[]{}:^\"\+-!~*?| dengan backslash. Atau gunakan simple_query_string yang lebih fleksibel.
Apa itu shard?
Shard adalah bagian dari indeks. Tiap shard = satu indeks Lucene. Shard primer untuk tulis, shard replika sebagai salinan untuk skalabilitas baca & tolerance error.
Berapa banyak shard yang ideal?
Best practice: 20-50GB/shard. Mulai dengan 1 shard primer, tambah replika. Hanya tambah primer jika perlu (tidak bisa dikurangi).
Bisa ubah pemetaan setelah data diindeks?
Sebagian. Tambah field baru bisa. Untuk ubah tipe field, reindex data. Untuk konsistensi, pakai template indeks.
Apa parameter _routing?
Untuk mengarahkan dokumen ke shard tertentu berdasar nilai field. Default: _id. Gunakan routing jika selalu query berdasar field tertentu (misal user_id) demi performa.
Bagaimana menangani data berbasis waktu?
Gunakan indeks berbasis tanggal: logs-2026.03.24. Ini agar mudah hapus data lama (dengan hapus indeks) dan kueri lebih cepat (cari di indeks lebih sedikit).

Top comments (0)