Elasticsearchへの接続方式

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であればwabisabielastic-scala-httpclientといったライブラリでRESTインターフェースを利用することができます。