Elasticsearchへのアクセスにはいくつかの方式があり、それぞれにメリット・デメリットがあるようです。Elasticsearchのドキュメントを参考にJavaプログラムからの接続方法とそれぞれの特徴を調べてみました。
Transport Client
いわゆる通常のクライアント方式で、同時接続数が多い場合、接続・切断を繰り返す場合はこちらが有利。Elasticsearchを使って検索を行うアプリケーションなど、一般的な用途であればNode Clientよりこちらのほうがよさそうです。
// on startup Client client = new TransportClient() .addTransportAddress(new InetSocketTransportAddress("host1", 9300)) .addTransportAddress(new InetSocketTransportAddress("host2", 9300)); // on shutdown client.close();
Node Client
クライアントがクラスタに参加する方式。接続・切断に時間がかかりますが、クライアントがクラスタのレイアウトを把握しているため、永続的な接続が必要な用途の場合はこちらが効率的な可能性があるとのこと。
import static org.elasticsearch.node.NodeBuilder.*; // on startup Node node = nodeBuilder().node(); Client client = node.client(); // on shutdown node.close();
また、ElasticsearchではこのほかにHTTPベースのRESTインターフェースも利用可能です。こちらは一般的なHTTPクライアントで接続可能です。トランスポートクライアントと比べるとオーバーヘッドが大きいと思われますが、言語を選ばず取り回しがしやすいというメリットがあります。また、curlなどでもアクセスできるのでデバッグやちょっとした動作確認にも便利です。
Elasticsearch標準のJavaライブラリではRESTクライアントは提供されていませんが、Scalaであればwabisabiやelastic-scala-httpclientといったライブラリでRESTインターフェースを利用することができます。