Java High Level REST クライアント 6.7.x を使用して、Java アプリケーションから Elasticsearch API を呼び出すことができます。このガイドでは、クライアントをセットアップし、Alibaba Cloud Elasticsearch クラスターでインデックスおよびドキュメント操作を実行する方法を説明します。
前提条件
開始する前に、以下をご確認ください:
-
JDK 1.8 以降。 詳細については、「JDK のインストール」をご参照ください。
-
V6.7.0 以降の Alibaba Cloud Elasticsearch クラスター。 詳細については、「Alibaba Cloud Elasticsearch クラスターの作成」をご参照ください。
-
クラスターで自動インデックス作成が有効になっていること。 詳細については、「YML ファイルの設定」をご参照ください。 自動インデックス作成が有効でない場合、次のエラーが表示されます:
IndexNotFoundException[no such index and [action.auto_create_index] contains [-*] which forbids automatic creation of the index] -
Java Maven プロジェクト
Java High Level REST クライアント には前方互換性があります。 たとえば、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 リファレンス」をご参照ください。
例
「完全なサンプルコード」をダウンロードしてください。
以下の例では、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("{Endpoint of the Elasticsearch cluster}", 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 クライアントの完全な API リファレンスについては、「公式の Elasticsearch Java High Level REST Client ドキュメント」をご参照ください。