Java High Level REST Client 6.7.x を使用すると、Java アプリケーションから Elasticsearch API を呼び出すことができます。このガイドでは、クライアントをセットアップし、Alibaba Cloud Elasticsearch クラスターに対してインデックスおよびドキュメント操作を実行する手順を説明します。
前提条件
開始する前に、以下が準備できていることを確認してください。
JDK 1.8 以降。詳細については、「JDK のインストール」をご参照ください。
V6.7.0 以降の Alibaba Cloud Elasticsearch クラスター。詳細については、「Alibaba Cloud Elasticsearch クラスターの作成」をご参照ください。
クラスターで自動インデックス作成が有効になっていること。詳細については、「YML ファイルの設定」をご参照ください。自動インデックス作成が有効になっていない場合、次のエラーが表示されます:

Java Maven プロジェクト
Java High Level REST Client は上位互換性があります。たとえば、6.7.0 のクライアントは V6.7.0 以降の Elasticsearch クラスターで動作します。最新のクライアント機能を使用するには、クライアントのバージョンをクラスターのバージョンと一致させてください。
ネットワークアクセス
クライアントがクラスターに到達できるように、クラスターの IP アドレスホワイトリストを設定します。
パブリックネットワーク:サーバーがパブリックインターネット上にある場合は、クラスターのパブリックネットワークアクセスを有効にし、サーバーのパブリック IP アドレスをパブリック IP アドレスホワイトリストに追加します。詳細については、「Elasticsearch クラスターのパブリックまたはプライベート IP アドレスホワイトリストの設定」をご参照ください。
重要クライアントが家庭用ネットワークやオフィス LAN の背後にある場合は、クライアントのプライベート IP アドレスではなく、インターネット出口の IP アドレスを追加してください。
0.0.0.0/0を追加すると、すべての IPv4 アドレスが許可され、セキュリティリスクが生じます。この設定を使用する前に、リスクを評価してください。ホワイトリストがないか、設定が間違っている場合、「Timeout connecting」エラーが発生します。
クライアントから Kibana にアクセスするには、Kibana 用に別の IP アドレスホワイトリストを設定します。詳細については、「Kibana のパブリックまたはプライベート IP アドレスホワイトリストの設定」をご参照ください。
VPC (Virtual Private Cloud):サーバーがクラスターと同じ VPC 内にある場合は、クラスターのプライベートエンドポイントを使用します。デフォルトでは、
0.0.0.0/0はすでにプライベート IP アドレスホワイトリストに追加されています。
POM 依存関係の追加
Maven プロジェクトの pom.xml ファイルに、次の依存関係を追加します。
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>Apache Log4j にリモートコード実行 (RCE) の脆弱性が存在する可能性があります。詳細については、「脆弱性のお知らせ | Apache Log4j 2 の RCE 脆弱性」をご参照ください。
RequestOptions の設定
Java REST Client 6.7.0 では、Java REST Client 6.3.2 をベースにした RequestOptions が導入されました。これにより、リクエストの処理に影響を与えることなく、リクエストごとにオプションを設定できます。メモリに制約のある Java 仮想マシン (JVM) 環境では、RequestOptions を使用して非同期レスポンスキャッシュのサイズを制限します。
private static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
// デフォルトのキャッシュサイズは 100 MiB です。これを 30 MiB に変更します。
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}リクエストを実行する際に COMMON_OPTIONS を渡します。
IndexResponse indexResponse = highClient.index(indexRequest, COMMON_OPTIONS);RequestOptions API の詳細については、「Elasticsearch RequestOptions reference」をご参照ください。
例
完全なサンプルコードをダウンロードしてください。
以下の例では、RestHighLevelClient を作成し、ドキュメントをインデックス付けして削除します。この例では COMMON_OPTIONS を使用して、非同期レスポンスキャッシュのサイズを 30 MiB に制限しています。
{} で囲まれた各プレースホルダーを実際の値に置き換えてください。詳細については、インラインコメントをご参照ください。
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class RestClientTest67 {
private static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
// デフォルトのキャッシュサイズは 100 MiB です。これを 30 MiB に変更します。
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
public static void main(String[] args) {
// クラスターの認証情報を使用して Basic 認証を設定します。
// クラスターの作成時に設定したユーザー名とパスワードを使用します。
// 同じ認証情報が Kibana コンソールへのログインにも使用されます。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("{Username}", "{Password}"));
// クライアントをビルドします。「基本情報」ページからクラスターエンドポイントを取得します。
RestClientBuilder builder = RestClient.builder(
new HttpHost("{Elasticsearch クラスターのエンドポイント}", 9200, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// 低レベルのクライアントビルダーから高レベルのクライアントを作成します。
RestHighLevelClient highClient = new RestHighLevelClient(builder);
try {
// インデックスリクエストをビルドします。
// field_01 と field_02 はフィールド名、value_01 と value_02 はその値です。
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("{field_01}", "{value_01}");
jsonMap.put("{field_02}", "{value_02}");
// index_name: インデックス名。type_name: タイプ名。doc_id: ドキュメント ID。
IndexRequest indexRequest =
new IndexRequest("{index_name}", "{type_name}", "{doc_id}").source(jsonMap);
// カスタムの RequestOptions を使用してドキュメントをインデックス付けします。
IndexResponse indexResponse = highClient.index(indexRequest, COMMON_OPTIONS);
long version = indexResponse.getVersion();
System.out.println("Index document successfully! " + version);
// ドキュメントを削除します。同じインデックス名、タイプ名、ドキュメント ID を使用します。
DeleteRequest request =
new DeleteRequest("{index_name}", "{type_name}", "{doc_id}");
DeleteResponse deleteResponse = highClient.delete(request, COMMON_OPTIONS);
System.out.println("Delete document successfully! \n"
+ deleteResponse.toString() + "\n" + deleteResponse.status());
highClient.close();
} catch (IOException ioException) {
// 例外を処理します。
}
}
}次のステップ
Java High Level REST Client の完全な API リファレンスについては、「公式 Elasticsearch Java High Level REST Client ドキュメント」をご参照ください。