このトピックでは、Java 低レベル REST クライアント 5.x を使用して Elasticsearch Java API を呼び出す方法について説明します。
注意事項
低レベル REST クライアント 5.x は、Alibaba Cloud Elasticsearch V5.5.3 のみに対応しています。 Java REST クライアントを使用して Elasticsearch V6.3.2 クラスタにアクセスする方法の詳細については、「Java REST Client 6.3.2」をご参照ください。
Java REST クライアントのバージョンは、Elasticsearch クラスタのバージョンと同じである必要があります。
準備
JDK をインストールします。 JDK バージョンは 1.8 以降である必要があります。
詳細については、「JDK のインストール」をご参照ください。
Alibaba Cloud Elasticsearch V5.5.3 クラスタを作成します。
詳細については、「Alibaba Cloud Elasticsearch クラスタの作成」をご参照ください。
Elasticsearch クラスタの自動インデックス作成機能を有効にします。
詳細については、「YML ファイルの設定」をご参照ください。
自動インデックス作成機能が有効になっていない場合は、次のエラーが報告されます。
ネットワーク間の正常な通信を確保するために、Elasticsearch クラスタの IP アドレスホワイトリストを設定します。
Java コードを実行するサーバーがインターネット環境にある場合は、パブリックエンドポイントを使用してクラスタにアクセスできます。 クラスタにアクセスする前に、クラスタのパブリックネットワークアクセス機能を有効にし、サーバーのパブリック IP アドレスをクラスタのパブリック IP アドレスホワイトリストに追加する必要があります。 詳細については、「Elasticsearch クラスタのパブリックまたはプライベート IP アドレスホワイトリストの設定」をご参照ください。
重要クライアントがホームネットワークまたはオフィスの LAN にある場合は、クライアントのプライベート IP アドレスではなく、インターネット出口の IP アドレスをホワイトリストに追加する必要があります。
すべての IPv4 アドレスからのリクエストを許可するために、ホワイトリストに 0.0.0.0/0 を追加することもできます。 この設定を行うと、すべてのパブリック IP アドレスを使用してクラスタにアクセスできます。 これにより、セキュリティリスクが発生します。 この設定を行う前に、リスクを評価することをお勧めします。
IP アドレスホワイトリストが設定されていないか、IP アドレスホワイトリストが正しく設定されていない場合、システムは「Timeout connecting」エラーメッセージを報告して、接続タイムアウトエラーを示します。
クライアントからクラスタ内の Kibana ノードにアクセスする場合は、Kibana の IP アドレスホワイトリストを設定する必要があります。 詳細については、「Kibana のパブリックまたはプライベート IP アドレスホワイトリストの設定」をご参照ください。
Java コードを実行するサーバーが Elasticsearch クラスタと同じ仮想プライベートクラウド (VPC) にある場合は、内部エンドポイントを使用してクラスタにアクセスできます。 Elasticsearch クラスタにアクセスする前に、サーバーのプライベート IP アドレスがクラスタのプライベート IP アドレスホワイトリストに追加されていることを確認してください。 デフォルトでは、0.0.0.0/0 がホワイトリストに追加されます。
Java Maven プロジェクトを作成し、次の プロジェクトオブジェクトモデル (POM) 依存関係 をプロジェクトの pom.xml ファイルに追加します。
POM 依存関係
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7.1</version>
</dependency>
Apache Log4j にリモートコード実行 (RCE) の脆弱性が存在する可能性があります。 詳細については、「脆弱性に関するお知らせ | Apache Log4j 2 の RCE 脆弱性」をご参照ください。
例
完全なサンプルコードをダウンロードできます。
次のサンプルコードでは、Java REST クライアントはポート 9200 経由で Elasticsearch クラスタに接続されています。
import org.apache.http.HttpEntity;
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.entity.ContentType;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import java.io.IOException;
import java.util.Collections;
public class RestClientTest55 {
public static void main(String[]args){
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("USER NAME", "PASSWORD"));
// HOST を Elasticsearch クラスタのパブリックエンドポイントに設定します。 エンドポイントは、クラスタの [基本情報] ページから取得できます。
RestClient restClient = RestClient.builder(new HttpHost("HOST", 9200))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
}).build();
try {
// field_01 と field_02 はフィールド名、value_01 と value_02 は field_01 と field_02 の値です。
HttpEntity entity = new NStringEntity("{\n\"field_01\" : \"value_01\"\n,\n\"field_02\" : \"value_02\"\n}", ContentType.APPLICATION_JSON);
// index_name はインデックス名、type_name はタイプ名、doc_id はドキュメント ID です。
Response indexResponse = restClient.performRequest(
"PUT",
"/index_name/type_name/doc_id",
Collections.<String, String>emptyMap(),
entity);
// index_name はインデックス名、type_name はタイプ名、doc_id はドキュメント ID です。 インデックス名、タイプ名、およびドキュメント ID は、インデックスの作成時に指定したものと同じです。
Response response = restClient.performRequest("GET", "/index_name/type_name/doc_id",
Collections.singletonMap("pretty", "true"));
System.out.println(EntityUtils.toString(response.getEntity()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
パラメータ | 説明 |
| Elasticsearch クラスタのユーザー名に置き換えます。 |
| Elasticsearch クラスタのパスワードに置き換えます。 |
| Elasticsearch クラスタのパブリックエンドポイントまたは内部エンドポイントに置き換えます。 エンドポイントは、クラスタの [基本情報] ページから取得できます。 詳細については、「クラスタの基本情報の表示」をご参照ください。 |