Java ハイレベル REST クライアント 7.x を使用すると、Java アプリケーションから Elasticsearch API を呼び出すことができます。このガイドでは、クライアントをセットアップし、Alibaba Cloud Elasticsearch クラスターに対してインデックス操作と削除操作を実行する手順を説明します。
前提条件
開始する前に、以下の要件が満たされていることを確認してください。
-
バージョン 7.x を実行している Alibaba Cloud Elasticsearch クラスター。セットアップ手順については、Alibaba Cloud Elasticsearch クラスターの作成をご参照ください。
-
[自動インデックス作成] がクラスターで有効になっています。これを有効にしないと、インデックス操作が失敗します。詳細については、「YML ファイルの設定」をご参照ください。
-
ご利用のクライアントとクラスター間でネットワークアクセスが設定されていること (下記のネットワークアクセスをご参照ください)
-
JDK 1.8 以降がインストールされていること
-
pom.xmlに POM 依存関係が追加された Java Maven プロジェクト
Java ハイレベル REST クライアントは上位互換性があります。たとえば、クライアントバージョン 7.10 は、バージョン 7.10 以降を実行しているクラスターで動作します。最新のクライアント機能にアクセスするには、クラスターのバージョンと一致するクライアントバージョンを使用してください。
ネットワークアクセス
Java アプリケーションが実行される場所に基づいてアクセス方法を選択します。
パブリックネットワークアクセス (インターネット)
アプリケーションがクラスターの VPC の外部で実行される場合:
-
クラスターで [パブリックネットワークアクセス] を有効にします。
-
アプリケーションサーバのパブリック IP アドレスをクラスターのパブリック IP アドレスホワイトリストに追加します。詳細については、「Elasticsearch クラスターのパブリックまたはプライベート IP アドレスホワイトリストを設定する」をご参照ください。
-
ポート 9200 でクラスターのパブリックエンドポイントを使用して接続します。
クライアントが自宅やオフィスのネットワーク上にある場合は、クライアントのプライベート IP アドレスではなく、インターネット出力 IP アドレスをホワイトリストに追加してください。すべての IPv4 アドレスを許可するには 0.0.0.0/0 を追加しますが、これによりクラスターがパブリックインターネットに公開されることに注意してください。
VPC アクセス (内部)
アプリケーションがクラスターと同じ VPC 内で実行される場合:
-
ポート 9200 でクラスターのプライベートエンドポイントを使用して接続します。
-
プライベート IP アドレスホワイトリストのデフォルトは
0.0.0.0/0であるため、セキュリティポリシーで要求されない限り、追加のホワイトリスト設定は不要です。
ホワイトリストが構成されていないか、構成が正しくない場合、接続はエラーTimeout connectingでタイムアウトします。クライアントから Kibana にアクセスするには、Kibana 専用の IP アドレスホワイトリストを構成してください。詳細については、「Kibana のパブリックまたはプライベート IP アドレスホワイトリストを構成する」をご参照ください。
POM (Project Object Model) 依存関係
次の依存関係を pom.xml に追加します。7.x は、ご利用のクラスターに一致する特定のバージョン (例: 7.10.2) に置き換えてください。
Maven
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.x</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) 脆弱性」をご参照ください。
認証
クライアントは Basic 認証を使用します。クラスターの作成時に設定したユーザー名とパスワードを渡します。これらは、Kibana コンソールへのログインに使用される認証情報と同じです。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials("<username>", "<password>")
);
| プレースホルダー | 説明 |
|---|---|
<username> |
Elasticsearch クラスターの作成時に設定したユーザー名 |
<password> |
Elasticsearch クラスターの作成時に設定したパスワード |
ドキュメントのインデックス登録と削除
次の例では、RestHighLevelClient を作成し、Index API を使用してドキュメントをインデックスに登録し、Delete API を使用して削除します。
この例では、非同期応答バッファーを 30 MiB (デフォルトの 100 MiB から削減) に制限しています。これは、JVM メモリが制限されている環境で役立ちます。
完全なサンプルコードをダウンロードしてください。
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 RestClientTest74 {
private static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
// 非同期応答バッファーを 30 MiB に制限します (デフォルトは 100 MiB)。
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
public static void main(String[] args) {
// Basic 認証を設定します。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials("<username>", "<password>")
);
// クライアントをビルドします。インターネットアクセスの場合はパブリックエンドポイントを、
// VPC アクセスの場合はプライベートエンドポイントを使用します。
RestClientBuilder builder = RestClient
.builder(new HttpHost("<cluster-endpoint>", 9200, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
RestHighLevelClient client = new RestHighLevelClient(builder);
try {
// --- ドキュメントのインデックス登録 ---
Map<String, Object> document = new HashMap<>();
document.put("<field_01>", "<value_01>");
document.put("<field_02>", "<value_02>");
// Elasticsearch 7.x クラスターの場合、タイプは _doc である必要があります。
IndexRequest indexRequest = new IndexRequest("<index_name>", "_doc", "<doc_id>")
.source(document);
IndexResponse indexResponse = client.index(indexRequest, COMMON_OPTIONS);
System.out.println("Indexed document. Version: " + indexResponse.getVersion());
// --- ドキュメントの削除 ---
DeleteRequest deleteRequest = new DeleteRequest("<index_name>", "_doc", "<doc_id>");
DeleteResponse deleteResponse = client.delete(deleteRequest, COMMON_OPTIONS);
System.out.println("Deleted document: " + deleteResponse.toString());
} catch (IOException e) {
// 接続または I/O エラーを処理します。
} finally {
try {
client.close();
} catch (IOException e) {
// クローズエラーを処理します。
}
}
}
}
プレースホルダーを実際の値に置き換えてください:
| プレースホルダー | 説明 | 例 |
|---|---|---|
<username> |
クラスターのユーザー名 | elastic |
<password> |
クラスターのパスワード | — |
<cluster-endpoint> |
パブリックエンドポイントまたはプライベートエンドポイント、クラスターの [基本情報] ページから | es-xxx.elasticsearch.aliyuncs.com |
<index_name> |
作成するインデックスの名前 | my-index |
<doc_id> |
ドキュメント ID | 1 |
<field_01>、 <field_02> |
ドキュメント内のフィールド名 | title、 content |
<value_01>、 <value_02> |
対応するフィールド値 | Hello、 World |
高同時実行数の設定
高同時実行数のシナリオでは、リクエストキューイングを回避するために、クライアントの最大接続数を増やしてください:
httpClientBuilder.setMaxConnTotal(500);
httpClientBuilder.setMaxConnPerRoute(300);
接続プール設定を含む完全なクライアント初期化:
String host = "<cluster-endpoint>";
int port = 9200;
String username = "<username>";
String password = "<password>";
final int maxConnTotal = 500;
final int maxConnPerRoute = 300;
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost(host, port, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.setMaxConnTotal(maxConnTotal);
httpClientBuilder.setMaxConnPerRoute(maxConnPerRoute);
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
})
);
次のステップ
-
Java ハイレベル REST クライアント公式ドキュメント — サポートされているすべての操作に関する完全な API リファレンス