DEV Community

Cover image for Cara Menggunakan Elasticsearch API: Panduan Lengkap
Walse
Walse

Posted on • Originally published at apidog.com

Cara Menggunakan Elasticsearch API: Panduan Lengkap

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.

Coba Apidog hari ini

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
Enter fullscreen mode Exit fullscreen mode

Verifikasi instalasi

curl -X GET "http://localhost:9200"
Enter fullscreen mode Exit fullscreen mode

Respons:

{
  "name": "elasticsearch-1",
  "cluster_name": "elasticsearch",
  "cluster_uuid": "abc123",
  "version": {
    "number": "8.11.0",
    "build_flavor": "default"
  },
  "tagline": "You know, for search"
}
Enter fullscreen mode Exit fullscreen mode

Otentikasi

Elasticsearch 8.x selalu membutuhkan otentikasi:

curl -X GET "http://localhost:9200/_cluster/health" \
  -u elastic:your_password
Enter fullscreen mode Exit fullscreen mode

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" }
      }
    }
  }'
Enter fullscreen mode Exit fullscreen mode

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"
  }'
Enter fullscreen mode Exit fullscreen mode

Respons:

{
  "_index": "products",
  "_id": "abc123",
  "_version": 1,
  "result": "created",
  "_seq_no": 0,
  "_primary_term": 1
}
Enter fullscreen mode Exit fullscreen mode

Dapatkan dokumen

curl -X GET "http://localhost:9200/products/_doc/abc123" \
  -u elastic:your_password
Enter fullscreen mode Exit fullscreen mode

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"
  }'
Enter fullscreen mode Exit fullscreen mode

Hapus dokumen

curl -X DELETE "http://localhost:9200/products/_doc/abc123" \
  -u elastic:your_password
Enter fullscreen mode Exit fullscreen mode

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}
'
Enter fullscreen mode Exit fullscreen mode

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"
      }
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Kueri Boolean

Gabungkan beberapa kondisi:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "headphones" } }
      ],
      "filter": [
        { "term": { "category": "electronics" } },
        { "range": { "price": { "lte": 100 } } },
        { "term": { "in_stock": true } }
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Pencarian teks lengkap dengan penilaian

{
  "query": {
    "multi_match": {
      "query": "wireless audio headphones",
      "fields": ["name^2", "description"],
      "type": "best_fields",
      "fuzziness": "AUTO"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Field dengan ^2 memiliki bobot lebih tinggi dalam penilaian.

Pencarian frasa

Cari frasa tepat:

{
  "query": {
    "match_phrase": {
      "description": "noise canceling"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Wildcard dan regex

{
  "query": {
    "wildcard": {
      "name": "*headphone*"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Penyortiran

{
  "query": { "match_all": {} },
  "sort": [
    { "price": "asc" },
    { "_score": "desc" }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Paginasi

{
  "from": 20,
  "size": 10,
  "query": { "match_all": {} }
}
Enter fullscreen mode Exit fullscreen mode

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" } }
        }
      }
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Histogram harga

{
  "size": 0,
  "aggs": {
    "price_histogram": {
      "histogram": {
        "field": "price",
        "interval": 25
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Histogram tanggal

{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "created_at",
        "calendar_interval": "month"
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Kardinalitas (jumlah unik)

{
  "size": 0,
  "aggs": {
    "unique_categories": {
      "cardinality": { "field": "category" }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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"
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Manajemen Klaster

Kesehatan klaster

curl -X GET "http://localhost:9200/_cluster/health"
Enter fullscreen mode Exit fullscreen mode

Respons:

{
  "cluster_name": "elasticsearch",
  "status": "green",
  "number_of_nodes": 3,
  "active_primary_shards": 25
}
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

Statistik node

curl -X GET "http://localhost:9200/_nodes/stats"
Enter fullscreen mode Exit fullscreen mode

Hapus cache

curl -X POST "http://localhost:9200/_cache/clear"
Enter fullscreen mode Exit fullscreen mode

Pengujian dengan Apidog

Kueri Elasticsearch sering kompleks. Uji secara menyeluruh.

Elasticsearch Apidog

1. Simpan kueri umum

Simpan templat pencarian di Apidog:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "{{search_field}}": "{{search_term}}" } }
      ],
      "filter": [
        { "range": { "{{price_field}}": { "lte": "{{max_price}}" } } }
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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
})
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. Jalankan Elasticsearch lokal
  2. Buat indeks dan pemetaan
  3. Indeks beberapa dokumen pengujian
  4. Tulis kueri pencarian
  5. 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)