Sunday, December 16, 2018

Elasticsearch Part 1: Konfigurasi Spring Data Elasticsearch

Sebenarnya sudah banyak tulisan pada blog nostra yang menjelaskan tentang elasticsearh, tetapi pada tulisan ini saya akan menjelaskan kembali beberapa hal mengenai elasticsearch. Kemudian saya akan menjelaskan konfigurasi sederhana untuk mengimplementasikan elasticsearch pada spring framework.
Secara khusus konfigurasi akan dilakukan pada maven project dengan spring boot versi 2.1.1 RELEASE, elasticsearch versi 6.4.3, spring data elasticsearch versi 3.1.3 RELEASE, dan sistem operasi Windows 10.

Elasticsearch?
Elasticsearch merupakan RESTful service yang fungsi utamanya sebagai search engine untuk data yang telah disimpan pada suatu database. Elasticsearch dikembangkan dengan menggunakan lucene library yang merupakan library terkenal untuk search engine pada big data. Selain itu elastisearch juga memiliki fungsi untuk menyimpan data dalam NoSQL JSON-based database. Data yang disimpan pada database ini lah, yang nantinya akan dioperasikan dengan search engine service pada elasticsearh.

Kapan Elasticsearch Perlu Digunakan?
Setelah menelusuri dan mencoba langsung elasticsearch, saya mendaftarkan 4 kondisi yang menyebabkan kita perlu menggunakan elasticsearch. Jika salah satu kondisi terpenuhi, maka kita boleh mempertimbangkan untuk menggunakan elasticsearch. Jika seluruh kondisi terpenuhi, sebaiknya kita perlu menggunakan elasticsearch. Keempat kondisi tersebut dijelaskan sebagai berikut.
  • Search query yang kompleks
    Misalnya kita perlu membuat service untuk melakukan pencarian kata yang cukup toleran terhadap typo (fuzziness dan sloppiness), atau service yang perlu mengurutkan data berdasarkan urutan yang kita definisikan secara langsung, atau service yang melibatkan operasi pada latitude dan longitude, atau service pencarian kata pada multiple field atau multiple parameter, dan lain sebagainya.
    Semua contoh diatas dapat diimplementasikan dengan lebih mudah dengan elasticsearch, yang memang dibuat untuk melakukan hal-hal tersebut.
  • Terdapat search query yang diterapkan pada data yang banyak atau besar
    Misalnya pada service yang akan kita buat melibatkan proses pencarian sebuah data atau sekelompok data, dimana data ini terdiri dari kolom yang banyak dan baris data yang banyak pula.
    Elasticsearch secara umum memang dirancang untuk kasus dataset yang berat. Hal ini terlihat dari lucene library yang digunakannya, yang memang sebanarnya biasa diterapkan pada big data.
  • Service yang dibuat tidak terlalu memperdulikan transactional
    Transactional yang dimaksud lebih khususnya adalah proses rollback ketika melakukan penambahan data atau pengubahan data. Untuk saat ini elasticsearch belum memiliki support terhadap fitur rollback ini. Oleh karena itu data transaksi, misalnya data booking, tidak sebaiknya disimpan dalam elasticsearch. Namun data yang jarang ditambah dan diubah, misalnya data directories, cenderung lebih baik disimpan pada elasticsearch.
  • Diperlukan struktur data yang flexible
    Seperti yang banyak kita ketahui NoSQL JSON-based merupakan database yang schemaless. Sehingga suatu data dapat kita tambahkan informasi lain atau kita kurangi informasi di dalamnya secara bebas, baik hanya pada satu baris data atau lebih. Dengan kata lain semua data dalam kelompok yang sama (table/type) tidak terikat untuk memiliki bentuk yang sama.
Konfigurasi Elasticsearch pada Spring
Melakukan konfigurasi spring data elasticsearch sebenarnya tidak sulit. Secara umum kita hanya perlu mengatur agar spring dapat berkomunikasi dengan salah satu port yang digunakan elasticsearch, yaitu 9200 atau 9300. 
Port 9200 merupakan RESTful service yang dimiliki elasticsearch, sehingga untuk berkomunikasi dengan port ini kita perlu memanggil API elasticsearch, misalnya menggunakan RestTemplate pada spring. Sedangkan port 9300 merupakan service node elasticsearch, sehingga untuk berkomunikasi dengan port ini kita perlu menggunakan tools yang telah disediakan spring, yaitu transport client.
Konfigurasi yang akan saya jelaskan adalah konfigurasi spring yang menggunakan service node elasticsearch (port 9300). Saya membagi proses konfigurasi kedalam proses-proses berikut.
  • Download elasticsearch
  • Penambahan dependency elasticsearch pada Spring
  • Konfigurasi cluster name
  • Konfigurasi transport client dan elasticsearch template
Download Elasticsearch
Elasticsearch service dapat kita download pada official websitenya. Jika kita menggunakan sistem operasi windows, file yang akan didownload adalah compresed file (rar) atau msi file. Kedua akan menghasilkan folder service elasticsearch.
Elasticsearch Download Page

Setelah mendownload ealsticsearch service, selanjutnya kita tinggal menuju ke directory bin pada elasticsearch untuk menjalankan elasaticsearch.bat.
Run Elasticsearch from CMD
Untuk mengecek apakah elasticsearch berhasil run atau tidak, cukup mengirim GET request ke localhost:9200. 
Elasticsearch Successfully Running

Penambahan Dependency Elasticsearch pada Spring 
Penambahan dependency elasticsearch sangat sederhana. Pada saat kita akan menginisialisasi maven project dengan spring framework versi 2.1.1 RELEASE, kita dapat menambah elasticsearch pada spring initializr.
Adding Elasticsearch Dependency in Spring Initializr

Atau kita cukup menambahkan dependency pada pom file hasil inisialisasi project.
Spring data elasticsearch in pom file

Namun saya menyarankan menggunakan versioning yang sama dengan yang saya gunakan. Hal ini dikarenakan dokumentasi dan contoh implementasi spring data elasticsearch belum banyak yang menurut saya sangat jelas. Selain itu perbedaan versi menyebabkan perbedaan bentuk konfigurasi dan hal ini dapat sangat membingungkan.

Konfigurasi Cluster Name
Untuk mengestablish komunikasi antara spring dan elasticsearch node salah satu hal yang perlu diperhatikan adalah cluster name. Cluster name yang akan didefinisikan pada konfigurasi spring harus sama dengan cluster name yang berjalan pada elasticsearch node.
Pada elasticsearch node, cluster name dapat dilihat pada file elasticsearch.yml di directory config pada folder elasticsearch.
elasticsearch.yml location
cluster name testelasticsearch in elasticsearch folder
Pada spring cluster name dapat kita definisikan di application.properties atau application,yaml, tergantung yang mana yang kita gunakan.
cluster name testelasticsearch in spring application properties

Konfigurasi Transport Client dan Elasticsearch Template
Konfigrausi transport client dan elasticsearch template dapat dilakukan dalam satu java class yang diberi annotation Configuration dan EnableElasticsearchRepositories. Jika kita menggunakan database lain misal JPA dengan database h2 atau JPA dengan database MySQL, maka kita perlu menambahkan lagi annotation EnableJpaRepositories dan mendeklarasikan basePackagesnya (letak interface repositories yang meng-extend masing2 JpaRepositories atau ElasticsearchRepositories).
ElasticsearchConfig in Spring
Gambar di atas merupakan contoh konfigurasi elasticsearch yang juga menggunakan JpaRepositories. Pada Gambar di atas juga dapat dilihat bahwa bean Client merupakan konfigurasi transport client ke elasticsearch dengan cluster name "testelasticsearch", host "localhost", dan port "9300". Kemudian terdapat konfigurasi ElasticsearchOperations, yang tidak lain merupakan konfigurasi elasticsearch template yang akan digunakan untuk melakukan operasi search query yang akan dijelaskan pada "Elasticserach part 2".
Repository dapat dilihat di sini.

No comments:

Post a Comment