すべてのプロダクト
Search
ドキュメントセンター

Elasticsearch:High Level REST Client (7.x)

最終更新日:Jan 11, 2025

このトピックでは、Java High Level REST Client 7.x を使用して Elasticsearch Java API を呼び出す方法について説明します。

準備

  • Alibaba Cloud Elasticsearch クラスタを作成します。クラスタのバージョンが、使用する Java High Level REST Client のバージョン以降であることを確認してください。

    この例では、Alibaba Cloud Elasticsearch V7.X クラスタが作成されます。クラスタの作成方法の詳細については、Alibaba Cloud Elasticsearch クラスタの作成をご参照ください。

    説明

    Java High Level REST Client は上位互換性があります。たとえば、Java High Level REST Client 7.10 は、V7.10 以降の Elasticsearch クラスタと通信できます。新しいクライアントの機能を使用できるように、使用する Java High Level REST Client のバージョンをクラスタのバージョンと同じにすることをお勧めします。

  • Elasticsearch クラスタの自動インデックス作成機能を有効にします。

    詳細については、YML ファイルの設定をご参照ください。

    自動インデックス作成機能が有効になっていない場合は、次のエラーが報告されます。Error

  • ネットワーク間の正常な通信を確保するために、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 がホワイトリストに追加されます。

  • JDK をインストールします。 JDK バージョンは 1.8 以降である必要があります。

  • Java Maven プロジェクトを作成し、次の プロジェクトオブジェクトモデル (POM) 依存関係 をプロジェクトの pom.xml ファイルに追加します。

POM 依存関係

次の POM 依存関係を使用する前に、依存関係の 7.x を特定のバージョン番号に変更してください。

<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 脆弱性をご参照ください。

完全なサンプルコードをダウンロードできます。

次のコードは、index API を呼び出してインデックスを作成し、delete API を呼び出してインデックスを削除します。コードは、JVM メモリが制限されたクライアント環境で実行されます。 ResponseConsumer 関連の設定項目を使用して、非同期応答のキャッシュサイズを制限できます。

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();

        // デフォルトのキャッシュサイズは 100 MiB です。 30 MiB に変更します。
        builder.setHttpAsyncResponseConsumerFactory(
                new HttpAsyncResponseConsumerFactory
                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }

    public static void main(String[] args) {
        // Elasticsearch クラスタの基本アクセス認証を使用します。
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        // Elasticsearch クラスタを作成するときに指定したユーザー名とパスワードを使用します。ユーザー名とパスワードを使用して、クラスタの Kibana コンソールにログオンすることもできます。
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{ユーザー名}", "{パスワード}"));

        // ビルダーを使用して Java REST クライアントを作成し、HTTP クライアントの HttpClientConfigCallback を設定します。
        // Elasticsearch クラスタのパブリックエンドポイントを指定します。エンドポイントは、クラスタの [基本情報] ページから取得できます。
        RestClientBuilder builder = RestClient.builder(new HttpHost("{Elasticsearch クラスタのエンドポイント}", 9200, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });

        // REST ハイレベルクライアントビルダーを使用して、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("{フィールド_01}", "{値_01}");
            jsonMap.put("{フィールド_02}", "{値_02}");
            // index_name はインデックス名、type_name はタイプ名、doc_id はドキュメント ID です。 V7.0 以降の Elasticsearch クラスタの場合、タイプ名は _doc である必要があります。
            IndexRequest indexRequest = new IndexRequest("{インデックス名}", "_doc", "{ドキュメント ID}").source(jsonMap);

            // 同期実行を実装し、RequestOptions のカスタム設定 (COMMON_OPTIONS) を使用します。
            IndexResponse indexResponse = highClient.index(indexRequest, COMMON_OPTIONS);

            long version = indexResponse.getVersion();

            System.out.println("ドキュメントのインデックス作成に成功しました! " + version);
            // index_name はインデックス名、type_name はタイプ名、doc_id はドキュメント ID です。 V7.0 以降の Elasticsearch クラスタの場合、タイプ名は _doc である必要があります。インデックス名、タイプ名、およびドキュメント ID は、インデックスを作成するときに指定したものと同じです。
            DeleteRequest request = new DeleteRequest("{インデックス名}", "_doc", "{ドキュメント ID}");
            DeleteResponse deleteResponse = highClient.delete(request, COMMON_OPTIONS);

            System.out.println("ドキュメントの削除に成功しました! \n" + deleteResponse.toString());

            highClient.close();

        } catch (IOException ioException) {
            // 例外を処理します。
        }
    }
}

上記のサンプルコードで中括弧 {} で囲まれたパラメーターを、サービス固有のパラメーターに置き換えることができます。詳細については、コードコメントを参照してください。

高並列シナリオでは、クライアント接続の数を増やす必要があります。次のコードは設定を提供します。

httpClientBuilder.setMaxConnTotal(500);
httpClientBuilder.setMaxConnPerRoute(300);

サンプルコード:

String host = "127.0.0.1";
int port = 9200;
String username = "elastic";
String password = "passwd";
final int max_conn_total = 500;
final int max_conn_per_route = 300;

RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
  RestClient.builder(new HttpHost( host, 9200, "http")).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
      httpClientBuilder.setMaxConnTotal(max_conn_total);
      httpClientBuilder.setMaxConnPerRoute(max_conn_per_route);
      return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
    }
  })
);

Java High Level REST Client の機能の詳細については、Java High Level REST Client の公式ドキュメントをご参照ください。