Ringkasan
API Elasticsearch mendukung pencarian dan analitik dalam skala besar. Anda mengindeks dokumen sebagai JSON, melakukan kueri dengan DSL yang canggih, dan mengagregasi hasil untuk analitik. Otentikasi menggunakan kunci API atau otentikasi dasar. Untuk pengujian, gunakan Apidog untuk memvalidasi pemetaan indeks, menguji kueri pencarian, dan men-debug agregasi sebelum menerapkan ke klaster produksi.
Pendahuluan
Elasticsearch adalah mesin pencarian dan analitik terdistribusi. Ini menangani teks terstruktur, log, metrik, dan lainnya. Perusahaan menggunakannya untuk pencarian teks lengkap di aplikasi, analisis log untuk debugging, dan dasbor analitik real-time.
Elasticsearch berada di jantung tumpukan ELK (Elasticsearch, Logstash, Kibana). Namun Anda dapat menggunakannya secara langsung melalui API tanpa Logstash.
Uji API Elasticsearch dengan Apidog - gratis
Pada akhir panduan ini, Anda akan dapat:
- 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 memerlukan otentikasi secara default:
curl -X GET "http://localhost:9200/_cluster/health" \
-u elastic:your_password
Atau gunakan kunci API (dibuat di Kibana atau melalui 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 secara efisien:
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"
}
}
}
Nama bidang dengan ^2 mendapatkan bobot dua kali lipat dalam penilaian.
Pencarian frasa
Temukan frasa yang 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 menghitung statistik ringkasan dari data Anda.
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, penyaringan, pengurutan |
integer, float |
Angka |
boolean |
Benar/salah |
date |
Tanggal dan waktu |
object |
Objek JSON bersarang |
nested |
Array objek (mempertahankan hubungan) |
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 bisa rumit. 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 memadai.
Perbaikan: Verifikasi kredensial. Periksa apakah kunci API memiliki izin indeks yang benar.
404 index_not_found_exception
Penyebab: Indeks tidak ada.
Perbaikan: Buat indeks terlebih dahulu, atau gunakan pembuatan otomatis (diaktifkan secara default tetapi tidak direkomendasikan untuk produksi).
circuit_breaking_exception
Penyebab: Kueri menggunakan terlalu banyak memori.
Perbaikan: Kurangi parameter size, sederhanakan kueri, tambahkan filter untuk mengurangi set hasil.
search_phase_execution_exception
Penyebab: Kesalahan sintaks kueri.
Perbaikan: Periksa JSON Anda. Masalah umum: tanda kutip hilang, jalur bidang 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 memiliki fitur dan komunitas terbanyak. Meilisearch dan Typesense lebih sederhana untuk pencarian dasar.
Kasus penggunaan dunia nyata
Pencarian e-commerce. Sebuah situs ritel mengindeks 100.000 produk. Pengguna mencari berdasarkan nama, deskripsi, kategori, dan rentang harga. Pelengkapan otomatis menyarankan produk saat mereka mengetik. Filter mempersempit hasil berdasarkan kategori dan ketersediaan.
Log aplikasi. Tim DevOps mengirimkan log ke Elasticsearch melalui Filebeat. Insinyur mencari log berdasarkan layanan, tingkat keparahan, dan rentang waktu. Dasbor menampilkan tingkat kesalahan dan waktu respons.
Analitik keamanan. Tim keamanan mengindeks log jaringan. Mereka mencari alamat IP yang mencurigakan, memvisualisasikan pola lalu lintas, dan memberikan peringatan tentang anomali yang terdeteksi melalui agregasi.
Mengakhiri
Berikut adalah apa yang telah Anda pelajari:
- Mengindeks dokumen sebagai JSON
- Melakukan kueri dengan DSL Elasticsearch
- Menggunakan agregasi untuk analitik
- Mengonfigurasi pemetaan untuk pencarian optimal
- Memantau kesehatan klaster
Langkah Anda selanjutnya:
- Jalankan Elasticsearch secara lokal
- Buat indeks dengan pemetaan
- Indeks beberapa dokumen pengujian
- Tulis kueri pencarian
- Coba agregasi
Uji API Elasticsearch dengan Apidog - gratis
FAQ
Apa perbedaan antara Elasticsearch dan Solr?Keduanya adalah mesin pencari berbasis Lucene. Elasticsearch memiliki desain terdistribusi dan API yang lebih baik. Solr memiliki lebih banyak fitur enterprise. Sebagian besar proyek baru memilih Elasticsearch.
Bagaimana cara menangani karakter khusus dalam pencarian?Escape karakter khusus: ()[]{}:^\"\\+-!~*?| dengan garis miring terbalik. Atau gunakan simple_query_string yang lebih fleksibel.
Apa itu shard?Shard adalah bagian dari sebuah indeks. Setiap shard adalah indeks Lucene. Shard primer untuk penulisan, shard replika adalah salinan untuk skalabilitas baca dan toleransi kesalahan.
Berapa banyak shard yang harus saya buat?Aturan praktis: 20-50GB per shard. Mulai dengan 1 shard primer, tambahkan replika. Hanya tingkatkan shard primer saat dibutuhkan (tidak dapat dikurangi).
Dapatkah saya mengubah pemetaan setelah pengindeksan?Sebagian. Tambahkan bidang baru dengan bebas. Untuk mengubah tipe bidang yang ada, indeks ulang data. Gunakan templat indeks untuk mengelola pemetaan secara konsisten.
Apa parameter _routing?Merutekan dokumen ke shard tertentu berdasarkan nilai bidang. Defaultnya adalah _id. Gunakan routing ketika kueri selalu memfilter berdasarkan bidang tertentu (seperti user_id) untuk kinerja yang lebih baik.
Bagaimana cara menangani data berbasis waktu?Gunakan indeks berbasis tanggal: logs-2026.03.24. Ini memungkinkan Anda menghapus data lama dengan menghapus indeks dan meningkatkan kinerja kueri dengan mencari lebih sedikit indeks.
