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

Elasticsearch:High Level REST Client (6.7.x)

最終更新日:Jan 11, 2025

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

準備

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

    詳細については、「JDK のインストール」をご参照ください。

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

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

    重要

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

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

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

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

  • ネットワーク間の正常な通信を確保するために、Elasticsearch クラスタの IP アドレスホワイトリストを設定します。

    • Java コードを実行するサーバーがインターネット環境にある場合、パブリックエンドポイントを使用してクラスタにアクセスできます。 クラスタにアクセスする前に、クラスタのパブリックネットワークアクセス機能を有効にし、サーバーのパブリック IP アドレスをクラスタのパブリック IP アドレスホワイトリストに追加する必要があります。 詳細については、「Elasticsearch クラスタのパブリックまたはプライベート IP アドレスホワイトリストの設定」をご参照ください。

      重要
      • クライアントがホームネットワークまたはオフィスの LAN にある場合は、クライアントのプライベート IP アドレスではなく、インターネット出口の IP アドレスをホワイトリストに追加する必要があります。

      • 0.0.0.0/0 をホワイトリストに追加して、すべての IPv4 アドレスからのリクエストを許可することもできます。 この設定を行うと、すべてのパブリック 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.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) メモリが制限されているクライアント環境で実行されます。 ResponseConsumer 関連の設定項目を使用して、非同期レスポンスのキャッシュサイズを制限できます。 完全なサンプルコードの詳細については、「」をご参照ください。

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();
}
// 次のコードを並列実行し、RequestOptions のカスタム設定 (COMMON_OPTIONS) を使用します。
IndexResponse indexResponse = highClient.index(indexRequest, COMMON_OPTIONS);

RequestOptions クラスの使用方法の詳細については、「RequestOptions」をご参照ください。

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

次のコードは、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 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) {
        // 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 低レベルクライアントビルダーを使用して、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);

            // 次のコードを並列実行し、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 です。インデックス名、タイプ名、ドキュメント ID は、インデックスの作成時に指定したものと同じです。
            DeleteRequest request = new DeleteRequest("{index_name}", "{type_name}", "{doc_id}");
            DeleteResponse deleteResponse = highClient.delete(request, COMMON_OPTIONS);

            System.out.println("ドキュメントが正常に削除されました! \n" + deleteResponse.toString() + "\n" + deleteResponse.status());

            highClient.close();

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

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

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