Pendahuluan awal mengenai Elastic Search bisa dilihat di Apa itu elastic search ?

Agar bisa menggunakan fungsi dari pencarian Elastic Search, maka harus ada

  • Elastic Search Server yang berjalan di JVM Java
  • Elastic Search Client yang akan terkoneksi untuk bisa mengirimkan request HTTP berbentuk JSON ke Elastic Search Server.

Untuk kali ini kita akan fokus kepada Elastic Search Client dari aplikasi berbasis Java.


Bagaimana kita connect ke Elastic Search Server dari aplikasi Java ?

Permasalahan koneksi dari Elastic Search Client Java ke Elastic Search Server ini memang menjadi permasalahan dari sejak dulu.

Logika sederhananya adalah dengan menggunakan HTTP Rest Client yang sudah ada di Java.

Tetapi selama bertahun-tahun tidak ada HTTP Rest Client resmi dari Java sendiri.

Dari Java versi 1.1 sampai JDK 11, Java hanya menyediakan library HttpURLConnection dan URL yang merupakan fungsi dasar dari koneksi Http.

Akan tetapi didalamnya tidak banyak fitur yang disediakan secara otomatis. Akan banyak modifikasi dan alur logis yang mesti ditambahkan untuk melakukan request REST API kalau hanya menggunakan library diatas, seperti serialization, security, error handling, caching, marshalling, dll.

Akibatnya HTTP Rest Client yang mempunyai fitur lebih dari sekedar HttpConnection dan URL diatas banyak disediakan oleh organisasi atau perusahaan lain, seperti :

  • Apache HTTP Client.
  • Spring RestTemplate.
  • OkHttp
  • Apache CXF.
  • JBoss RESTEasy
  • Google Resting.
  • dll.

Elastic Search menggunakan pendekatan berbeda. Daripada menggunakan library HTTP Rest Client dari Java yang belum ada pada saat itu, mereka membuat sendiri Elastic Search Client native library menggunakan protokol TCP yang langsung connect ke Node-node yang ada ada dalam cluster Elastic Search.

Namanya TransportClient.

Boleh dibilang ini adalah tahapan pertama dari ElasticSearch Java API yang dibuat oleh Elastic.

Itu sejarah awalnya..

Ok, kalau begitu, sebenarnya ada berapa cara sih kita bisa connect ke Elastic Search Server ?

Secara umum, ada 5 cara :

  • menggunakan TransportClient (deprecated)–> yang kita bahas diatas, sering disebut Elastic Search Client Native Library.
  • menggunakan JEST library.
  • menggunakan REST Client (deprecated) –> terdiri dari Low Level RestClient (LLRC) dan High Level RestClient (HLRC).
  • menggunakan API Client –> merupakan ElasticSearch Java API client, cara terbaru dalam koneksi ke Elastic Search Server.
  • menggunakan HTTP Rest Client umum seperti Apache HTTP Client, RestTemplate, Feign, dll.

Ada beberapa framework yang berada diatasnya, seperti Spring Boot membungkus library-library diatas dalam library mereka.

Tetapi secara umum 5 cara diatas yang biasanya dilakukan oleh developer Java.

Coba kita kulik satu persatu…



1. Transport Client


Koneksi Elastic Search Client menggunakan TransportClient adalah rekomendasi awal dan default dari ElasticSearch semenjak Elastic Search diperkenalkan.

Beroperasi di level TCP layer, membuat koneksi dengan TransportClient ini berarti langsung melakukan koneksi ke node dan portnya dari sekumpulan node yang ada dalam sebuah cluster server Elastic Search.

Benar-benar koneksi secara low level.

Akan tetapi cara koneksi dengan Transport Client ini sudah deprecated semenjak Elastic Search client versi 7.0.0.

Jadi kalau kita mau bikin koneksi baru untuk Elastic Search, maka jangan pakai cara ini lagi.

Dan library TransportClient ini benar-benar diremove dari Elastic Search client versi 8.0.

Tapi tidak apa-apa, kita akan melihat fitur-fitur yang ditawarkan oleh Elastic Search dengan Transport Client ini.


Bagaimana cara beroperasinya Transport Client ini ?

TransportClient ini Beroperasi di level TCP layer, memakai alamat IP/hostname dan port nya.

Melakukan koneksi langsung dengan tiap-tiap node yang dibutuhkan, dan melakukan internal routing.

Port yang dibuka untuk koneksi internal ini adalah port 9300.

Awalnya transport client akan menginisiasi koneksi ke daftar inisial IP/hostname nya.

Mungkin mirip-mirip dengan koneksi ke bootstrap server seperti yang kita lihat di Kafka.

contoh :

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));

Pada code diatas, ada 2 hostname sebagai daftar server/node awal yang Client perlu akses koneksi kesana.

Referensi : TransportClient

Ketika telah berhasil mendapatkan koneksi, kemudian akan dilakukan pengecekan status dari data node yang tersedia.

kemudian daftar node sebelumnya akan digantikan dengan daftar data node yang tersedia tersebut.

Tiap 5 detik, akan dilakukan pengecekan mengenai ketersediaan data node yang bisa dipanggil untuk melakukan pencarian.


Bagaimana TransportClient ini bisa mengecek apakah sebuah node mati atau bertambah ?

Nah misalkan ada 3 data node/server yang tersedia, lalu bagaimana cara mengecek kalau salah satu nodenya mati atau tidak available.?

Atau kalau misalnya ada tambahan node lagi, sehingga menjadi 4 data node/server.

Dengan library Transport Client, maka ada fungsi tambahan namanya Sniffing. Sniffing kalau diartikan artinya “mengendus”.

Mengendus setiap 5 detik sekali atau beberapa menit sekali ke server, untuk mengupdate daftar koneksi yang bisa dilakukan ke server dari client untuk melakukan searching.



2. JEST Library


Kebutuhan untuk melakukan koneksi dari program Java ke Elastic Search Server, tetapi dengan cara HTTP REST Client, membuat munculnya library baru HTTP Rest Client khusus untuk Elastic Search yang versi 1.0.0 direlease tahun 2015 sumber

Namanya Jest.

(jangan dicampuradukkan dengan Jest JavaScript library, itu 2 hal yang berbeda, dengan nama yang sama).

Cukup menambahkan librarynya ini pakai maven :

<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest</artifactId>
    <version>6.3.1</version>
</dependency>

Kemudian melakukan inisiasi koneksi ke alamat URL Elastic Search Server di port 9200.

Di Elastic Search, port yang dibuka untuk TCP adalah 9300, sementara untuk HTTP adalah 9200.

Kalau sebelumnya di TransportClient kita menggunakan port 9300, dengan protokol TCP, maka di JEST ini menggunakan port 9200 dengan protokol HTTP.

Koneksi Elastic Search Client ke Elastic Search Server dengan menggunakan Jest ini dirasakan lebih mudah dan lebih intutive, karena mereka menggunakan lebih banyak konsep Fluent interface dalam settingan koneksinya.

Hal yang sama kita lihat nantinya juga di library RestClient dan HighLevelRestClient yang dibuat kemudian oleh Elastic Searchnya sendiri.

JEST ini menjadi pilihan bagi developer Java ketika saat itu cuma ada TransportClient sebagai pilihan library client untuk terhubung dengan Elastic Search Server.

Kita akan lanjut di part 3