ElasticSearch
merupakan search engine full-text yang bisa diakses melalui RESTful
API. Search engine ini berorientasi dokumen (hampir seperti MongoDB)
artinya engine ini akan menyimpan objek atau dokumen daripada menyimpan
data dengan representasi baris dan kolom. Dokumen yang disimpan tersebut
akan di serialisasi sebagai JSON ketika diakses.
Artikel ini hanya akan mengenalkan sedikit dasar dasar dari ElasticSearch.
Instalasi
Download paket ElasticSearch di
sini dan ekstrak. Kemudian jalankan dengan perintah
$ ./bin/elasticsearch
Deafult port search engine ini akan berjalan pada
9200.
Test query bisa dilakukan meskipun data belum ada, yaitu dengan
menjalankan perintah berikut untuk mengetahui informasi engine
ElasticSearch yang sedang berjalan
$ curl localhost:9200
{
"status" : 200,
"name" : "Black Queen",
"version" : {
"number" : "1.1.0",
"build_hash" : "2181e113dea80b4a9e31e58e9686658a2d46e363",
"build_timestamp" : "2014-03-25T15:59:51Z",
"build_snapshot" : false,
"lucene_version" : "4.7"
},
"tagline" : "You Know, for Search"
}
Indexing
Proses memasukkan data ke dalam ElasticSearch dinamakan dengan
indexing.
Karena engine ini memakai RESTful API maka data-data yang akan di
indexing dengan mudah bisa dimasukkan melalui curl dan operasi HTTP
seperti GET, PUT, DELETE.
Di Elasticsearch, dokumen adalah termasuk tipe
dan tipe tersebut termasuk dalam index. Secara paralel bisa dibandingkan
dengan database relasional:
Relational DB ⇒ Database ⇒ Table ⇒ Baris ⇒ Kolom
Elasticsearch ⇒ Index ⇒ Tipe ⇒ Dokumen ⇒ Field
Sebagai contoh:
Untuk memasukkan data index film dengan tipe (kategori) action dan mempunyai id 1.
$ curl -XPUT http://localhost:9200/film/action/1 -d '
{
nama: "The Raid 2: Berandal",
tahun: "2014",rating:"8.9",
imdb: "http://www.imdb.com/title/tt2265171/",
storyline: "Only a short time after the first raid, Rama goes undercover with
the thugs of Jakarta and plans to bring down the syndicate and uncover the corruption
within his police force."
}'
Pada keluaran konsol mungkin akan seperti ini
{
"_index":"film",
"_type":"action",
"_id":"1",
"_version":1,
"created":true
}
Nilai
"created"=true bearti data baru dimasukkan. Jika anda memakai operasi PUT dengan id yang sama maka data akan terupdate dan
"created"=false.
$ curl -XPUT http://localhost:9200/film/action/1 -d '
{
judul: "The Raid 2: Berandal",
tahun:"2014",rating:"8.9",
imdb:"http://www.imdb.com/title/tt2265171/",
storyline:"Only a short time after the first raid, Rama goes undercover with
the thugs of Jakarta and plans to bring down the syndicate and uncover the corruption
within his police force."
}'
Query
Query data sangat mudah dilakukan dengan
operasi sederhana GET. Misalnya untuk mencari film dengan judul kata
mengandung kata "berandal"
curl -XGET http://localhost:9200/film/action/_search?q=judul:berandal
{
"took":7,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"failed":0
},
"hits":{
"total":1,
"max_score":0.15342641,
"hits":[{
"_index":"film",
"_type":"action",
"_id":"1",
"_score":0.15342641,
"_source" : {
judul: "The Raid 2: Berandal",
tahun:"2014",rating:"8.9",
imdb:"http://www.imdb.com/title/tt2265171/",
storyline:"Only a short time after the first raid,
Rama goes undercover with the thugs of Jakarta
and plans to bring down the syndicate and uncover
the corruption within his police force."
}
}]
}
}
Jenis query string diatas termasuk dalam
Search Lite. Untuk query data yang lebih lanjut sebaiknya memakai Query DSL.
Query DSL
Query ini memakai format JSON sebagai parameter query. Sebagai contoh
$ curl -XGET http://localhost:9200/film/action/_search
'{
"query":{
"match": {
"about":"raid"
}
}
}'
Query
match diatas merupakan
full-text search yang akan mencari semua dokumen yang MENGANDUNG kata "raid".
Query DSL lebih fleksibel jika diinginkan query data yang lebih kompleks seperti
filter search, ,
phrase search &
highlighting. Untuk lebih jelasnya silahkan lihat
Guide Query DSL.
Cluster, Node & Shard
Oh ya salah satu kekuatan dari engine ini yaitu
secara alami merupakan sistem terdistribusi artinya dengan mudah sistem
engine ini bisa diperbesar maupun diperkecil jika ada penambahan server
atau istilahnya
horizontal scaling.
Cluster
Untuk mengetahui kesehatan kluster, indikatornya yaitu warna seperti lampu lalu lintas green, yellow atau red
curl -XGET http://localhost:9200/_cluster/health
Contoh hasil keluaran di konsol bisa seperti ini
{
"cluster_name":"elasticsearch",
"status":"yellow",
"timed_out":false,
"number_of_nodes":1,
"number_of_data_nodes":1,
"active_primary_shards":2,
"active_shards":2,
"relocating_shards":0,
"initializing_shards":0,
"unassigned_shards":2
}
yang perlu menjadi perhatian adalah key
status. 3 kemungkinan warna ini mempunyai arti sebagai berikut
green Semua shard primer dan replika aktif.
yellow Semua shard primer arktif tpi replika tidak.
red Tidak semua shard primer & sekunder aktif.
Node
Node yang dimaksud disini adalah instance dari
ElasticSearch. Satu cluster mengandung beberapa node elasticsearch yang
sama sama berbagi data dan beban kerja. Satu master node elastisearch
diperlukan di dalam cluster untuk manajemen node yang lain seperti
penambahan dan penghapusan node. Perlu diingat bahwa klien bisa
mengakses node elasticsearch manapun dalam cluster.
Untuk penambahan node dengan nama
Node-2 anda bisa memakai perintah berikut
$ ./bin/elasticsearch -Des.node.name=Node-2
Shard
Shard yang dimaksud disini adalah kontainer data
yang merupakan instance dari Apache Lucene lengkap dengan search engine
sendiri. Bisa dikatakan merupakan bagian unit kerja terkecil dari
ElasticSearch. Shard terbagi dua yaitu
Shard Primer dan
Shard Replika.
Shard Primer ukurannya terbatasi dengan perangkat keras, kompleksitas
dokumen dll sedangkan Shard Replika merupakan copy dari Shard Primer.
Jika anda ingin lebih mendalami scaling secara horizontal silahkan kunjungi website
ElasticSearch.
Ok. Cukup sekian dulu untuk hari ini...