このトピックでは、Java High Level REST Client 6.3.x を使用して Elasticsearch Java API を呼び出す方法について説明します。
準備
JDK をインストールします。 JDK のバージョンは 1.8 以降である必要があります。
詳細については、「JDK のインストール」をご参照ください。
Alibaba Cloud Elasticsearch クラスタを作成します。 クラスタのバージョンが、使用する Java High Level REST Client のバージョン以降であることを確認してください。
この例では、Alibaba Cloud Elasticsearch V6.3.2 クラスタが作成されます。 クラスタの作成方法の詳細については、「Alibaba Cloud Elasticsearch クラスタの作成」をご参照ください。
重要Java High Level REST Client は上位互換性があります。 たとえば、Java High Level REST Client 6.3.2 は、V6.3.2 以降の Elasticsearch クラスタと通信できます。 新しいクライアントの機能を使用できるように、使用する Java High Level REST Client のバージョンをクラスタのバージョンと同じにすることをお勧めします。
Elasticsearch クラスタの自動インデックス作成機能を有効にします。
詳細については、「YML ファイルの構成」をご参照ください。
自動インデックス作成機能が有効になっていない場合、次のエラーが報告されます。
ネットワーク間の正常な通信を確保するために、Elasticsearch クラスタの IP アドレスホワイトリストを構成します。
Java コードを実行するサーバーがインターネット環境にある場合は、パブリックエンドポイントを使用してクラスタにアクセスできます。 クラスタにアクセスする前に、クラスタのパブリックネットワークアクセス機能を有効にし、サーバーのパブリック IP アドレスをクラスタのパブリック IP アドレスホワイトリストに追加する必要があります。 詳細については、「Elasticsearch クラスタのパブリックまたはプライベート IP アドレスホワイトリストの構成」をご参照ください。
重要クライアントがホームネットワークまたはオフィスの LAN にある場合は、クライアントのプライベート IP アドレスではなく、インターネット出口の IP アドレスをホワイトリストに追加する必要があります。
すべての IPv4 アドレスからのリクエストを許可するために、ホワイトリストに 0.0.0.0/0 を追加することもできます。 この構成を行うと、すべてのパブリック IP アドレスを使用してクラスタにアクセスできます。 これにより、セキュリティリスクが発生します。 この構成を行う前に、リスクを評価することをお勧めします。
IP アドレスホワイトリストが構成されていないか、IP アドレスホワイトリストが正しく構成されていない場合、システムは「接続タイムアウト」エラーメッセージを報告して、接続タイムアウトエラーを示します。
クライアントからクラスタ内の 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</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.3.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.3.2</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 脆弱性」をご参照ください。
例
サンプルコード全体をダウンロードできます。
次のコードは、index API を呼び出してインデックスを作成し、delete API を呼び出してインデックスを削除します。
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.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class RestClientTest63 {
public static void main(String[] args) {
// Elasticsearch クラスタに対して Basic 認証を使用します。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
// Elasticsearch クラスタの作成時に指定したユーザー名とパスワードを使用します。 ユーザー名とパスワードを使用して、クラスタの Kibana コンソールにログオンすることもできます。
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{Username}", "{Password}"));
// ビルダーを使用して Java REST クライアントを作成し、HTTP クライアントの HttpClientConfigCallback を構成します。
// Elasticsearch クラスタのパブリックエンドポイントを指定します。 エンドポイントは、クラスタの [基本情報] ページから取得できます。
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);
}
});
// REST low-level クライアントビルダーを使用して、RestHighLevelClient インスタンスを作成します。
RestHighLevelClient highClient = new RestHighLevelClient(builder);
try {
// リクエストを作成します。
Map<String, Object> jsonMap = new HashMap<>();
// field_01 と field_02 はフィールド名、value_01 と value_02 は field_01 と field_02 の値です。
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);
// 次のコードを並列で実行します。
IndexResponse indexResponse = highClient.index(indexRequest);
long version = indexResponse.getVersion();
System.out.println("ドキュメントのインデックス作成に成功しました! " + version);
// index_name はインデックス名、type_name はタイプ名、doc_id はドキュメント ID です。 インデックス名、タイプ名、およびドキュメント ID は、インデックスの作成時に指定したものと同じです。
DeleteRequest request = new DeleteRequest("{index_name}", "{type_name}", "{doc_id}");
DeleteResponse deleteResponse = highClient.delete(request);
System.out.println("ドキュメントの削除に成功しました!");
highClient.close();
} catch (IOException ioException) {
// 例外を処理します。
}
}
}上記のサンプルコードで中括弧 {} で囲まれたパラメータを、サービス固有のパラメータに置き換えることができます。 詳細については、コードコメントを参照してください。
Java High Level REST Client の機能の詳細については、Java High Level REST Client の公式ドキュメントをご参照ください。