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

PolarDB:クライアントを使用した PolarSearch への接続

最終更新日:Apr 21, 2026

PolarSearch は、公式の OpenSearch クライアントと完全な互換性があります。Java や Python などの一般的なプログラミング言語を使用して、インデックスの管理、ドキュメント操作 (作成、読み取り、更新、削除を含む)、複雑な検索の実行、および検索機能のアプリケーションへのシームレスな統合が可能です。

前提条件

  1. PolarSearch ノードを持つクラスターが作成され、ノードの管理者アカウントが設定されていること。

  2. エンドポイントの取得:クラスターの データベースノード セクションで、検索ノード にカーソルを合わせ、ビジネス環境に基づいて PolarSearch ノードの非公開またはパブリックアドレスを取得します。

クラスターへの接続

OpenSearch Java クライアント

OpenSearch Java クライアントを使用すると、HTTP メソッドや生の JSON の代わりに、Java のメソッドとデータ構造を使用して OpenSearch クラスターと対話できます。例えば、リクエストをオブジェクトとして送信し、クライアントの組み込みメソッドを使用してインデックスを作成したり、ドキュメントをインデックスしたり、その他の操作を実行したりできます。完全な API リファレンスとその他の例については、javadoc をご参照ください。

1. トランスポートの選択と依存関係の追加

OpenSearch Java クライアントは、HTTP リクエストを処理するためにトランスポートフレームワークが必要です。

  • PolarSearch 1.x:Java クライアントは RestClient トランスポートのみをサポートします。

  • PolarSearch 3.x:Java クライアントは Apache HttpClient 5 トランスポートまたは RestClient トランスポートのいずれかを使用できます。

PolarSearch 1.x

Maven の例:次の依存関係を pom.xml ファイルに追加します。

<!-- OpenSearch Java client core library -->
<dependency>
    <groupId>org.opensearch.client</groupId>
    <artifactId>opensearch-java</artifactId>
    <version>1.0.0</version>
</dependency>
<!-- RestClient Transport -->
<dependency>
    <groupId>org.opensearch.client</groupId>
    <artifactId>opensearch-rest-client</artifactId>
    <version>1.3.20</version>
</dependency>

PolarSearch 3.x

Apache HttpClient 5 トランスポートの Maven の例:次の依存関係を pom.xml ファイルに追加します。

<!-- OpenSearch Java client core library -->
<dependency>
    <groupId>org.opensearch.client</groupId>
    <artifactId>opensearch-java</artifactId>
    <version>3.3.0</version>
</dependency>
<!-- Apache HttpClient 5 transport -->
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.4.3</version>
</dependency>

2. データクラスの定義

以下の PolarSearch の例で使用するテストデータクラスを作成します。

static class IndexData {
    private String title;
    private String text;

    public IndexData() {}

    public IndexData(String title, String text) {
        this.title = title;
        this.text = text;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    @Override
    public String toString() {
        return String.format("IndexData{title='%s', text='%s'}", title, text);
    }
}

3. クライアントの初期化

選択したトランスポートに基づき、PolarSearch の接続詳細を使用してクライアントを初期化します。本番環境では、これらの詳細を環境変数として設定できます。テスト目的では、デフォルトのパラメーター値として割り当てることもできます。

PolarSearch 1.x

次の例は、RestClient トランスポートを使用してクライアントを初期化する方法を示しています。この例では SSL を無効にしています。

public static OpenSearchTransport createTransport() throws Exception {
    var env = System.getenv();
    var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
    var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
    var scheme = env.getOrDefault("SCHEME", "http");
    var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
    var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

    final HttpHost host = new HttpHost(hostname, port, scheme);
    final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY,
            new UsernamePasswordCredentials(user, pass));

    final SSLContext sslContext = SSLContextBuilder.create()
            .loadTrustMaterial(null, (chains, authType) -> true)
            .build();

    RestClientBuilder builder = RestClient.builder(host)
            .setHttpClientConfigCallback(httpClientBuilder ->
                    httpClientBuilder
                            .setDefaultCredentialsProvider(credentialsProvider)
                            .setSSLContext(sslContext));

    final RestClient restClient = builder.build();
    return new RestClientTransport(restClient, new JacksonJsonpMapper());
}

transport = createTransport();
var client = new OpenSearchClient(transport);

PolarSearch 3.x

次の例は、Apache HttpClient 5 トランスポートを使用してクライアントを初期化する方法を示しています。この例では SSL を無効にしています。

public static OpenSearchTransport createTransport() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
    var env = System.getenv();
    var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
    var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
    var scheme = env.getOrDefault("SCHEME", "http");
    var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
    var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

    final HttpHost host = new HttpHost(scheme, hostname, port);
    final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(new AuthScope(host), new UsernamePasswordCredentials(user, pass.toCharArray()));

    final SSLContext sslContext = SSLContextBuilder
            .create()
            .loadTrustMaterial(null, (chains, authType) -> true)
            .build();

    final ApacheHttpClient5TransportBuilder builder = ApacheHttpClient5TransportBuilder.builder(host);
    builder.setHttpClientConfigCallback(httpClientBuilder -> {
        final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
                .setSslContext(sslContext)
                .setTlsDetailsFactory(new Factory<SSLEngine, TlsDetails>() {
                    @Override
                    public TlsDetails create(final SSLEngine sslEngine) {
                        return new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol());
                    }
                })
                .build();

        final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder
                .create()
                .setTlsStrategy(tlsStrategy)
                .build();

        return httpClientBuilder
                .setDefaultCredentialsProvider(credentialsProvider)
                .setConnectionManager(connectionManager);
    });

    final OpenSearchTransport transport = builder.build();
    return transport;
}

transport = createTransport();
var client = new OpenSearchClient(transport);

4. 基本操作の実行

以下のコードスニペットは、一般的なインデックスおよびドキュメント操作の実行方法を示しています。

インデックスの作成

// 1. インデックスの作成
final var index = "my-index";
if (!client.indices().exists(r -> r.index(index)).value()) {
    CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(index)
            .build();
    client.indices().create(createIndexRequest);
}

ドキュメントのインデックス作成

// 2. データのインデックス作成
IndexData indexData = new IndexData("first_name", "Bruce");
IndexRequest<IndexData> indexRequest = new IndexRequest.Builder<IndexData>().index(index).id("1").document(indexData).build();
client.index(indexRequest);

ドキュメントの検索

// 3. ドキュメントの検索
SearchResponse<IndexData> searchResponse = client.search(s -> s.index(index), IndexData.class);
for (int i = 0; i< searchResponse.hits().hits().size(); i++) {
    LOGGER.info(searchResponse.hits().hits().get(i).source());
}        

ドキュメントの削除

// 4. ドキュメントの削除
client.delete(b -> b.index(index).id("1"));

インデックスの削除

// 5. インデックスの削除
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest.Builder().index(index).build();
DeleteIndexResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest);

OpenSearch Java 高レベル REST クライアント

OpenSearch Java クライアントの使用を推奨します。Java 高レベル REST クライアントは OpenSearch では非推奨となっており、将来のバージョンで削除される予定です。

1. 依存関係の追加

次の依存関係を pom.xml ファイルに追加します。

PolarSearch 1.x

<!-- OpenSearch Java rest high-level client core library -->
<dependency>
    <groupId>org.opensearch.client</groupId>
    <artifactId>opensearch-rest-high-level-client</artifactId>
    <version>1.3.20</version>
</dependency>

PolarSearch 3.x

<!-- OpenSearch Java rest high-level client core library -->
<dependency>
    <groupId>org.opensearch.client</groupId>
    <artifactId>opensearch-rest-high-level-client</artifactId>
    <version>3.3.2</version>
</dependency>

2. クライアントの初期化

本番環境では、これらの詳細を環境変数として設定できます。テスト目的では、デフォルトのパラメーター値として割り当てることもできます。

PolarSearch 1.x

次の例は、バージョン 1.x のクライアントを初期化する方法を示しています。この例では SSL を無効にしています。

public static RestHighLevelClient createClient() throws Exception {
    var env = System.getenv();
    var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
    var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
    var scheme = env.getOrDefault("SCHEME", "http");
    var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
    var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

    final HttpHost host = new HttpHost(hostname, port, scheme);
    final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY,
            new UsernamePasswordCredentials(user, pass));

    final SSLContext sslContext = SSLContextBuilder.create()
            .loadTrustMaterial(null, (chains, authType) -> true)
            .build();

    RestClientBuilder builder = RestClient.builder(host)
            .setHttpClientConfigCallback(httpClientBuilder ->
                    httpClientBuilder
                            .setDefaultCredentialsProvider(credentialsProvider)
                            .setSSLContext(sslContext));

    return new RestHighLevelClient(builder);
}

RestHighLevelClient client = createClient();

PolarSearch 3.x

次の例は、バージョン 3.x のクライアントを初期化する方法を示しています。この例では SSL を無効にしています。

public static RestHighLevelClient createClient() throws Exception {
    var env = System.getenv();
    var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
    var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
    var scheme = env.getOrDefault("SCHEME", "http");
    var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
    var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

    final HttpHost host = new HttpHost(scheme, hostname, port);
    final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(new AuthScope(host),
            new UsernamePasswordCredentials(user, pass.toCharArray()));

    final SSLContext sslContext = SSLContextBuilder.create()
            .loadTrustMaterial(null, (chains, authType) -> true)
            .build();

    final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
            .setSslContext(sslContext)
            .build();

    final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder
            .create()
            .setTlsStrategy(tlsStrategy)
            .build();

    RestClientBuilder builder = RestClient.builder(host)
            .setHttpClientConfigCallback(httpClientBuilder ->
                    httpClientBuilder
                            .setDefaultCredentialsProvider(credentialsProvider)
                            .setConnectionManager(connectionManager));

    return new RestHighLevelClient(builder);
}

RestHighLevelClient client = createClient();

3. 基本操作の実行

以下のコードスニペットは、一般的なインデックスおよびドキュメント操作の実行方法を示しています。

インデックスの作成

// 1. インデックスの作成
final var index = "my-index";
boolean exists = client.indices().exists(new GetIndexRequest(index), RequestOptions.DEFAULT);
if (!exists) {
    CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
    client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
}

ドキュメントのインデックス作成

// 2. データのインデックス作成
IndexData indexData = new IndexData("first_name", "Bruce");
Map<String, Object> document = new HashMap<>();
document.put("title", indexData.getTitle());
document.put("text", indexData.getText());
IndexRequest indexRequest = new IndexRequest(index).id("1").source(document);
client.index(indexRequest, RequestOptions.DEFAULT);

ドキュメントの検索

// 3. ドキュメントの検索
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit hit : searchResponse.getHits().getHits()) {
    Map<String, Object> sourceMap = hit.getSourceAsMap();
    IndexData data = new IndexData((String) sourceMap.get("title"), (String) sourceMap.get("text"));
    LOGGER.info(data);
}

ドキュメントの削除

// 4. ドキュメントの削除
client.delete(new DeleteRequest(index, "1"), RequestOptions.DEFAULT);

インデックスの削除

// 5. インデックスの削除
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);

Elasticsearch Java 高レベル REST クライアント

PolarSearch 1.x は、Elasticsearch Java 高レベル REST クライアントのバージョン 7.0.0 から 7.13.4 と完全な互換性があります。互換性のあるクライアントバージョンを使用している場合、アプリケーションコードを変更することなくエンドポイントを変更できます。

1. 依存関係の追加

次の依存関係を pom.xml ファイルに追加します。

<!-- ElasticSearch Java rest high-level client core library -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.13.4</version>
</dependency>

2. クライアントの初期化

本番環境では、これらの詳細を環境変数として設定できます。テスト目的では、デフォルトのパラメーター値として割り当てることもできます。

次の例は、バージョン 1.x のクライアントを初期化する方法を示しています。この例では SSL を無効にしています。

public static RestHighLevelClient createClient() throws Exception {
    var env = System.getenv();
    var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
    var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
    var scheme = env.getOrDefault("SCHEME", "http");
    var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
    var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

    final HttpHost host = new HttpHost(hostname, port, scheme);
    final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY,
            new UsernamePasswordCredentials(user, pass));

    final SSLContext sslContext = SSLContextBuilder.create()
            .loadTrustMaterial(null, (chains, authType) -> true)
            .build();

    RestClientBuilder builder = RestClient.builder(host)
            .setHttpClientConfigCallback(httpClientBuilder ->
                    httpClientBuilder
                            .setDefaultCredentialsProvider(credentialsProvider)
                            .setSSLContext(sslContext));

    return new RestHighLevelClient(builder);
}

RestHighLevelClient client = createClient();

3. 基本操作の実行

以下のコードスニペットは、一般的なインデックスおよびドキュメント操作の実行方法を示しています。

インデックスの作成

// 1. インデックスの作成
final var index = "my-index";
boolean exists = client.indices().exists(new GetIndexRequest(index), RequestOptions.DEFAULT);
if (!exists) {
    CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
    client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
}

ドキュメントのインデックス作成

// 2. データのインデックス作成
IndexData indexData1 = new IndexData("first_name", "Bruce");
Map<String, Object> document1 = new HashMap<>();
document1.put("title", indexData1.getTitle());
document1.put("text", indexData1.getText());
client.index(new IndexRequest(index).id("1").source(document1), RequestOptions.DEFAULT);

ドキュメントの検索

// 3. ドキュメントの検索
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit hit : searchResponse.getHits().getHits()) {
    Map<String, Object> sourceMap = hit.getSourceAsMap();
    IndexData data = new IndexData((String) sourceMap.get("title"), (String) sourceMap.get("text"));
    LOGGER.info(data);
}

ドキュメントの削除

// 4. ドキュメントの削除
client.delete(new DeleteRequest(index, "1"), RequestOptions.DEFAULT);

インデックスの削除

// 5. インデックスの削除
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);

低レベル Python クライアント

高レベル Python クライアントは OpenSearch 2.1.0 で非推奨となったため、低レベル Python クライアントの使用を推奨します。

1. 環境のセットアップ

  1. プロジェクトディレクトリに移動します。この例では /home/PolarSearchTestPython を使用します。

    mkdir /home/PolarSearchTestPython
    cd /home/PolarSearchTestPython
  2. /home/PolarSearchTestPython ディレクトリで、仮想環境 (venv) を作成してプロジェクトの依存関係を分離し、グローバルパッケージとの競合を防ぎます。

    python3 -m venv myenv
  3. 仮想環境をアクティブ化します。

    source myenv/bin/activate
  4. 必要な Python の依存関係をインストールします。

    pip3 install opensearch-py

2. PolarSearch への接続

Python コードで、OpenSearch クラスをインポートし、PolarSearch の接続詳細を使用してクライアントインスタンスを作成します。本番環境では、これらの詳細を環境変数として設定できます。テスト目的では、デフォルト値として割り当てることもできます。

from opensearchpy import OpenSearch

host = os.getenv("HOST", default="<polarsearch_host>")
port = int(os.getenv("PORT", "<polarsearch_port>"))
auth = (os.getenv("USERNAME", "<polarsearch_username>"), os.getenv("PASSWORD", "<polarsearch_password>"))

client = OpenSearch(
    hosts=[{"host": host, "port": port}],
    http_auth=auth,
    use_ssl=False,
    verify_certs=False,
    ssl_show_warn=False,
)

3. 操作の例

以下のコードスニペットは、一般的なインデックスおよびドキュメント操作の実行方法を示しています。

インデックスの作成

client.indices.create() メソッドを使用して新しいインデックスを作成します。

index_name = 'python-test-index'
index_body = {
  'settings': {
    'index': {
      'number_of_shards': 4
    }
  }
}

response = client.indices.create(index=index_name, body=index_body)

ドキュメントのインデックス作成

client.index() メソッドを使用して、指定されたインデックスにドキュメントを追加します。

document = {
  'title': 'Moneyball',
  'director': 'Bennett Miller',
  'year': '2011'
}

response = client.index(
    index = 'python-test-index',
    body = document,
    id = '1',
    refresh = True
)

ドキュメントの検索

client.search() メソッドを使用して、クエリに基づいてドキュメントを検索します。

q = 'miller'
query = {
  'size': 5,
  'query': {
    'multi_match': {
      'query': q,
      'fields': ['title^2', 'director']
    }
  }
}

response = client.search(
    body = query,
    index = 'python-test-index'
)

ドキュメントの削除

client.delete() メソッドを使用して、ID でドキュメントを削除します。

response = client.delete(
    index = 'python-test-index',
    id = '1'
)

インデックスの削除

client.indices.delete() メソッドを使用して、インデックス全体を削除します。

response = client.indices.delete(
    index = 'python-test-index'
)

完全なサンプルコード

この例では、インデックスの作成から削除までの完全なライフサイクルを示します。

OpenSearch Java クライアント

サンプルコード

PolarSearch 1.x バージョン

依存関係の構成 (pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>OpenSearchJavaClientSample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.opensearch.client</groupId>
            <artifactId>opensearch-java</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.opensearch.client</groupId>
            <artifactId>opensearch-rest-client</artifactId>
            <version>1.3.20</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.21.0</version>
        </dependency>
    </dependencies>
</project>

サンプルプログラム (OpenSearchClientExample.java)

package samples;

import java.io.IOException;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.client.RestClient;
import org.opensearch.client.RestClientBuilder;
import org.opensearch.client.json.jackson.JacksonJsonpMapper;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch.core.IndexRequest;
import org.opensearch.client.opensearch.core.SearchResponse;
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
import org.opensearch.client.opensearch.indices.DeleteIndexRequest;
import org.opensearch.client.opensearch.indices.DeleteIndexResponse;
import org.opensearch.client.transport.OpenSearchTransport;
import org.opensearch.client.transport.rest_client.RestClientTransport;


public class OpenSearchClientExample {
    static class IndexData {
        private String title;
        private String text;
    
        public IndexData() {}
    
        public IndexData(String title, String text) {
            this.title = title;
            this.text = text;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    
        @Override
        public String toString() {
            return String.format("IndexData{title='%s', text='%s'}", title, text);
        }
    }
    
    private static final Logger LOGGER = LogManager.getLogger(OpenSearchClientExample.class);

    public static OpenSearchTransport createTransport() throws Exception {
        var env = System.getenv();
        var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
        var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
        var scheme = env.getOrDefault("SCHEME", "http");
        var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
        var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

        final HttpHost host = new HttpHost(hostname, port, scheme);
        final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(user, pass));

        final SSLContext sslContext = SSLContextBuilder.create()
                .loadTrustMaterial(null, (chains, authType) -> true)
                .build();

        RestClientBuilder builder = RestClient.builder(host)
                .setHttpClientConfigCallback(httpClientBuilder ->
                        httpClientBuilder
                                .setDefaultCredentialsProvider(credentialsProvider)
                                .setSSLContext(sslContext));

        final RestClient restClient = builder.build();
        return new RestClientTransport(restClient, new JacksonJsonpMapper());
    }

    public static void main(String[] args) {
        OpenSearchTransport transport = null;
        try {
            LOGGER.info("start test...");

            transport = createTransport();
            var client = new OpenSearchClient(transport);
            LOGGER.info("client create");
            final var index = "my-index";
            // 1. インデックスを作成します
            LOGGER.info("1. Creating an index {} start", index);
            if (!client.indices().exists(r -> r.index(index)).value()) {
                CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(index)
                        .build();
                client.indices().create(createIndexRequest);
            }
            LOGGER.info("1. Creating an index {} finished", index);
    
            // 2. データをインデックスします
            LOGGER.info("2. Indexing data start");
            IndexData indexData = new IndexData("first_name", "Bruce");
            IndexRequest<IndexData> indexRequest = new IndexRequest.Builder<IndexData>().index(index).id("1").document(indexData).build();
            client.index(indexRequest);
            LOGGER.info("2. Indexing data finished");
    
            Thread.sleep(1500);
    
            // 3. ドキュメントを検索します
            LOGGER.info("3. Searching for documents start");
            SearchResponse<IndexData> searchResponse = client.search(s -> s.index(index), IndexData.class);
            for (int i = 0; i< searchResponse.hits().hits().size(); i++) {
                LOGGER.info(searchResponse.hits().hits().get(i).source());
            }        
            LOGGER.info("3. Searching for documents finished");
            
            // 4. ドキュメントを削除します
            LOGGER.info("4. Deleting a document start");
            client.delete(b -> b.index(index).id("1"));
            LOGGER.info("4. Deleting a document finished");
    
            // 5. インデックスを削除します
            LOGGER.info("5. Deleting an index {} start", index);
            DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest.Builder().index(index).build();
            DeleteIndexResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest);
            LOGGER.info("5. Deleting an index {} finished", index);

            LOGGER.info("end test...");
        } catch (Exception e) {
            LOGGER.error(e.toString());
        } finally {
            if (transport != null) {
                try {
                    transport.close();
                } catch (Exception e) {
                    LOGGER.error("Failed to close transport", e);
                }
            }
        }
    }
}

PolarSearch 3.x バージョン

依存関係の構成 (pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>OpenSearchJavaClientSample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.opensearch.client</groupId>
            <artifactId>opensearch-java</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5</artifactId>
            <version>5.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.21.0</version>
        </dependency>
    </dependencies>
</project>

サンプルプログラム (OpenSearchClientExample.java)

package samples;

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;

import org.apache.hc.client5.http.auth.AuthScope;
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
import org.apache.hc.core5.function.Factory;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
import org.apache.hc.core5.reactor.ssl.TlsDetails;
import org.apache.hc.core5.ssl.SSLContextBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch.core.IndexRequest;
import org.opensearch.client.opensearch.core.SearchResponse;
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
import org.opensearch.client.opensearch.indices.DeleteIndexRequest;
import org.opensearch.client.opensearch.indices.DeleteIndexResponse;
import org.opensearch.client.transport.OpenSearchTransport;
import org.opensearch.client.transport.httpclient5.ApacheHttpClient5TransportBuilder;


public class OpenSearchClientExample {
    static class IndexData {
        private String title;
        private String text;
    
        public IndexData() {}
    
        public IndexData(String title, String text) {
            this.title = title;
            this.text = text;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    
        @Override
        public String toString() {
            return String.format("IndexData{title='%s', text='%s'}", title, text);
        }
    }
    
    private static final Logger LOGGER = LogManager.getLogger(OpenSearchClientExample.class);

    public static OpenSearchTransport createTransport() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        var env = System.getenv();
        var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
        var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
        var scheme = env.getOrDefault("SCHEME", "http");
        var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
        var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

        final HttpHost host = new HttpHost(scheme, hostname, port);
        final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(new AuthScope(host), new UsernamePasswordCredentials(user, pass.toCharArray()));

        final SSLContext sslContext = SSLContextBuilder
                .create()
                .loadTrustMaterial(null, (chains, authType) -> true)
                .build();

        final ApacheHttpClient5TransportBuilder builder = ApacheHttpClient5TransportBuilder.builder(host);
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
                    .setSslContext(sslContext)
                    .setTlsDetailsFactory(new Factory<SSLEngine, TlsDetails>() {
                        @Override
                        public TlsDetails create(final SSLEngine sslEngine) {
                            return new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol());
                        }
                    })
                    .build();

            final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder
                    .create()
                    .setTlsStrategy(tlsStrategy)
                    .build();

            return httpClientBuilder
                    .setDefaultCredentialsProvider(credentialsProvider)
                    .setConnectionManager(connectionManager);
        });

        final OpenSearchTransport transport = builder.build();
        return transport;
    }

    public static void main(String[] args) {
        OpenSearchTransport transport = null;
        try {
            LOGGER.info("start test...");

            transport = createTransport();
            var client = new OpenSearchClient(transport);
            LOGGER.info("client create");
            final var index = "my-index";
            // 1. インデックスを作成します
            LOGGER.info("1. Creating an index {} start", index);
            if (!client.indices().exists(r -> r.index(index)).value()) {
                CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(index)
                        .build();
                client.indices().create(createIndexRequest);
            }
            LOGGER.info("1. Creating an index {} finished", index);
    
            // 2. データをインデックスします
            LOGGER.info("2. Indexing data start");
            IndexData indexData = new IndexData("first_name", "Bruce");
            IndexRequest<IndexData> indexRequest = new IndexRequest.Builder<IndexData>().index(index).id("1").document(indexData).build();
            client.index(indexRequest);
            LOGGER.info("2. Indexing data finished");
    
            Thread.sleep(1500);
    
            // 3. ドキュメントを検索します
            LOGGER.info("3. Searching for documents start");
            SearchResponse<IndexData> searchResponse = client.search(s -> s.index(index), IndexData.class);
            for (int i = 0; i< searchResponse.hits().hits().size(); i++) {
                LOGGER.info(searchResponse.hits().hits().get(i).source());
            }        
            LOGGER.info("3. Searching for documents finished");
            
            // 4. ドキュメントを削除します
            LOGGER.info("4. Deleting a document start");
            client.delete(b -> b.index(index).id("1"));
            LOGGER.info("4. Deleting a document finished");
    
            // 5. インデックスを削除します
            LOGGER.info("5. Deleting an index {} start", index);
            DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest.Builder().index(index).build();
            DeleteIndexResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest);
            LOGGER.info("5. Deleting an index {} finished", index);

            LOGGER.info("end test...");
        } catch (Exception e) {
            LOGGER.error(e.toString());
        } finally {
            if (transport != null) {
                try {
                    transport.close();
                } catch (Exception e) {
                    LOGGER.error("Failed to close transport", e);
                }
            }
        }
    }
}

実行方法

mvn clean compile exec:java -Dexec.mainClass=samples.OpenSearchClientExample

OpenSearch Java 高レベル REST クライアント

サンプルコード

PolarSearch 1.x バージョン

依存関係の構成 (pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>OpenSearchJavaClientSample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.opensearch.client</groupId>
            <artifactId>opensearch-rest-high-level-client</artifactId>
            <version>1.3.20</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.21.0</version>
        </dependency>
    </dependencies>
</project>

サンプルプログラム (OpenSearchClientExample.java)

package samples;

import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.action.delete.DeleteRequest;
import org.opensearch.action.index.IndexRequest;
import org.opensearch.action.admin.indices.delete.DeleteIndexRequest;
import org.opensearch.action.search.SearchRequest;
import org.opensearch.action.search.SearchResponse;
import org.opensearch.action.support.master.AcknowledgedResponse;
import org.opensearch.client.RequestOptions;
import org.opensearch.client.RestClient;
import org.opensearch.client.RestClientBuilder;
import org.opensearch.client.RestHighLevelClient;
import org.opensearch.client.indices.CreateIndexRequest;
import org.opensearch.client.indices.GetIndexRequest;
import org.opensearch.index.query.QueryBuilders;
import org.opensearch.search.SearchHit;
import org.opensearch.search.builder.SearchSourceBuilder;


public class OpenSearchClientExample {

    static class IndexData {
        private String title;
        private String text;

        public IndexData() {}

        public IndexData(String title, String text) {
            this.title = title;
            this.text = text;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        @Override
        public String toString() {
            return String.format("IndexData{title='%s', text='%s'}", title, text);
        }
    }

    private static final Logger LOGGER = LogManager.getLogger(OpenSearchClientExample.class);

    public static RestHighLevelClient createClient() throws Exception {
        var env = System.getenv();
        var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
        var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
        var scheme = env.getOrDefault("SCHEME", "http");
        var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
        var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

        final HttpHost host = new HttpHost(hostname, port, scheme);
        final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(user, pass));

        final SSLContext sslContext = SSLContextBuilder.create()
                .loadTrustMaterial(null, (chains, authType) -> true)
                .build();

        RestClientBuilder builder = RestClient.builder(host)
                .setHttpClientConfigCallback(httpClientBuilder ->
                        httpClientBuilder
                                .setDefaultCredentialsProvider(credentialsProvider)
                                .setSSLContext(sslContext));

        return new RestHighLevelClient(builder);
    }

    public static void main(String[] args) {
        try (RestHighLevelClient client = createClient()) {
            LOGGER.info("start test...");
            LOGGER.info("client create");
            final String index = "my-index";

            // 1. インデックスを作成します
            LOGGER.info("1. Creating an index {} start", index);
            boolean exists = client.indices().exists(new GetIndexRequest(index), RequestOptions.DEFAULT);
            if (!exists) {
                CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
                client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
            }
            LOGGER.info("1. Creating an index {} finished", index);

            // 2. データをインデックスします
            LOGGER.info("2. Indexing data start");
            IndexData indexData = new IndexData("first_name", "Bruce");
            Map<String, Object> document = new HashMap<>();
            document.put("title", indexData.getTitle());
            document.put("text", indexData.getText());
            IndexRequest indexRequest = new IndexRequest(index).id("1").source(document);
            client.index(indexRequest, RequestOptions.DEFAULT);
            LOGGER.info("2. Indexing data finished");

            Thread.sleep(1500);

            // 3. ドキュメントを検索します
            LOGGER.info("3. Searching for documents start");
            SearchRequest searchRequest = new SearchRequest(index);
            searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            for (SearchHit hit : searchResponse.getHits().getHits()) {
                Map<String, Object> sourceMap = hit.getSourceAsMap();
                IndexData data = new IndexData((String) sourceMap.get("title"), (String) sourceMap.get("text"));
                LOGGER.info(data);
            }
            LOGGER.info("3. Searching for documents finished");

            // 4. ドキュメントを削除します
            LOGGER.info("4. Deleting a document start");
            client.delete(new DeleteRequest(index, "1"), RequestOptions.DEFAULT);
            LOGGER.info("4. Deleting a document finished");

            // 5. インデックスを削除します
            LOGGER.info("5. Deleting an index {} start", index);
            DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
            AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
            LOGGER.info("5. Deleting an index {} finished", index);

            LOGGER.info("end test...");
        } catch (Exception e) {
            LOGGER.error(e.toString(), e);
        }
    }
}

PolarSearch 3.x バージョン

依存関係の構成 (pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>OpenSearchJavaClientSample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.opensearch.client</groupId>
            <artifactId>opensearch-rest-high-level-client</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.21.0</version>
        </dependency>
    </dependencies>
</project>

サンプルプログラム (OpenSearchClientExample.java)

package samples;

import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.hc.client5.http.auth.AuthScope;
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
import org.apache.hc.core5.ssl.SSLContextBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.action.delete.DeleteRequest;
import org.opensearch.action.index.IndexRequest;
import org.opensearch.action.search.SearchRequest;
import org.opensearch.action.search.SearchResponse;
import org.opensearch.action.support.clustermanager.AcknowledgedResponse;
import org.opensearch.client.RequestOptions;
import org.opensearch.client.RestClient;
import org.opensearch.client.RestClientBuilder;
import org.opensearch.client.RestHighLevelClient;
import org.opensearch.client.indices.CreateIndexRequest;
import org.opensearch.client.indices.GetIndexRequest;
import org.opensearch.index.query.QueryBuilders;
import org.opensearch.search.SearchHit;
import org.opensearch.search.builder.SearchSourceBuilder;
import org.opensearch.action.admin.indices.delete.DeleteIndexRequest;


public class OpenSearchClientExample {

    static class IndexData {
        private String title;
        private String text;

        public IndexData() {}

        public IndexData(String title, String text) {
            this.title = title;
            this.text = text;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        @Override
        public String toString() {
            return String.format("IndexData{title='%s', text='%s'}", title, text);
        }
    }

    private static final Logger LOGGER = LogManager.getLogger(OpenSearchClientExample.class);

    public static RestHighLevelClient createClient() throws Exception {
        var env = System.getenv();
        var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
        var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
        var scheme = env.getOrDefault("SCHEME", "http");
        var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
        var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

        final HttpHost host = new HttpHost(scheme, hostname, port);
        final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(new AuthScope(host),
                new UsernamePasswordCredentials(user, pass.toCharArray()));

        final SSLContext sslContext = SSLContextBuilder.create()
                .loadTrustMaterial(null, (chains, authType) -> true)
                .build();

        final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
                .setSslContext(sslContext)
                .build();

        final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder
                .create()
                .setTlsStrategy(tlsStrategy)
                .build();

        RestClientBuilder builder = RestClient.builder(host)
                .setHttpClientConfigCallback(httpClientBuilder ->
                        httpClientBuilder
                                .setDefaultCredentialsProvider(credentialsProvider)
                                .setConnectionManager(connectionManager));

        return new RestHighLevelClient(builder);
    }

    public static void main(String[] args) {
        try (RestHighLevelClient client = createClient()) {
            LOGGER.info("start test...");
            LOGGER.info("client create");
            final String index = "my-index";

            // 1. インデックスを作成します
            LOGGER.info("1. Creating an index {} start", index);
            boolean exists = client.indices().exists(new GetIndexRequest(index), RequestOptions.DEFAULT);
            if (!exists) {
                CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
                client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
            }
            LOGGER.info("1. Creating an index {} finished", index);

            // 2. データをインデックスします
            LOGGER.info("2. Indexing data start");
            IndexData indexData = new IndexData("first_name", "Bruce");
            Map<String, Object> document = new HashMap<>();
            document.put("title", indexData.getTitle());
            document.put("text", indexData.getText());
            IndexRequest indexRequest = new IndexRequest(index).id("1").source(document);
            client.index(indexRequest, RequestOptions.DEFAULT);
            LOGGER.info("2. Indexing data finished");

            Thread.sleep(1500);

            // 3. ドキュメントを検索します
            LOGGER.info("3. Searching for documents start");
            SearchRequest searchRequest = new SearchRequest(index);
            searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            for (SearchHit hit : searchResponse.getHits().getHits()) {
                Map<String, Object> sourceMap = hit.getSourceAsMap();
                IndexData data = new IndexData((String) sourceMap.get("title"), (String) sourceMap.get("text"));
                LOGGER.info(data);
            }
            LOGGER.info("3. Searching for documents finished");

            // 4. ドキュメントを削除します
            LOGGER.info("4. Deleting a document start");
            client.delete(new DeleteRequest(index, "1"), RequestOptions.DEFAULT);
            LOGGER.info("4. Deleting a document finished");

            // 5. インデックスを削除します
            LOGGER.info("5. Deleting an index {} start", index);
            DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
            AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
            LOGGER.info("5. Deleting an index {} finished", index);

            LOGGER.info("end test...");
        } catch (Exception e) {
            LOGGER.error(e.toString(), e);
        }
    }
}

実行方法

mvn clean compile exec:java -Dexec.mainClass=samples.OpenSearchClientExample

Elasticsearch Java 高レベル REST クライアント

サンプルコード

依存関係の構成 (pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>OpenSearchJavaSample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.13.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>
    </dependencies>
</project>

サンプルプログラム (ElasticSearchClientExample.java)

package samples;

import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;


public class ElasticSearchClientExample {

    static class IndexData {
        private String title;
        private String text;

        public IndexData() {}

        public IndexData(String title, String text) {
            this.title = title;
            this.text = text;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        @Override
        public String toString() {
            return String.format("IndexData{title='%s', text='%s'}", title, text);
        }
    }

    private static final Logger LOGGER = LogManager.getLogger(ElasticSearchClientExample.class);

    public static RestHighLevelClient createClient() throws Exception {
        var env = System.getenv();
        var hostname = env.getOrDefault("HOST", "<polarsearch_host>");
        var port = Integer.parseInt(env.getOrDefault("PORT", "<polarsearch_port>"));
        var scheme = env.getOrDefault("SCHEME", "http");
        var user = env.getOrDefault("USERNAME", "<polarsearch_username>");
        var pass = env.getOrDefault("PASSWORD", "<polarsearch_password>");

        final HttpHost host = new HttpHost(hostname, port, scheme);
        final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(user, pass));

        final SSLContext sslContext = SSLContextBuilder.create()
                .loadTrustMaterial(null, (chains, authType) -> true)
                .build();

        RestClientBuilder builder = RestClient.builder(host)
                .setHttpClientConfigCallback(httpClientBuilder ->
                        httpClientBuilder
                                .setDefaultCredentialsProvider(credentialsProvider)
                                .setSSLContext(sslContext));

        return new RestHighLevelClient(builder);
    }

    public static void main(String[] args) {
        try (RestHighLevelClient client = createClient()) {
            LOGGER.info("start test...");
            LOGGER.info("client create");
            final String index = "my-index";

            // 0. クラスターに ping を送信します
            LOGGER.info("0. Ping cluster start");
            Response response = client.getLowLevelClient().performRequest(new Request("HEAD", "/"));
            int statusCode = response.getStatusLine().getStatusCode();
            LOGGER.info("Ping status code: {}", statusCode);
            if (statusCode == 200) {
                Response infoResponse = client.getLowLevelClient().performRequest(new Request("GET", "/"));
                String responseBody = EntityUtils.toString(infoResponse.getEntity());
                LOGGER.info("Cluster info: {}", responseBody);
            }
            LOGGER.info("0. Ping cluster finished");

            // 1. インデックスを作成します
            LOGGER.info("1. Creating an index {} start", index);
            boolean exists = client.indices().exists(new GetIndexRequest(index), RequestOptions.DEFAULT);
            if (!exists) {
                CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
                client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
            }
            LOGGER.info("1. Creating an index {} finished", index);

            // 2. データをインデックスします
            LOGGER.info("2. Indexing data start");
            IndexData indexData1 = new IndexData("first_name", "Bruce");
            Map<String, Object> document1 = new HashMap<>();
            document1.put("title", indexData1.getTitle());
            document1.put("text", indexData1.getText());
            client.index(new IndexRequest(index).id("1").source(document1), RequestOptions.DEFAULT);

            IndexData indexData2 = new IndexData("last_name", "Wayne");
            Map<String, Object> document2 = new HashMap<>();
            document2.put("title", indexData2.getTitle());
            document2.put("text", indexData2.getText());
            client.index(new IndexRequest(index).id("2").source(document2), RequestOptions.DEFAULT);
            LOGGER.info("2. Indexing data finished");

            Thread.sleep(1500);

            // 3. ID でドキュメントを取得します
            LOGGER.info("3. Getting a document by ID start");
            GetResponse getResponse = client.get(new GetRequest(index, "1"), RequestOptions.DEFAULT);
            if (getResponse.isExists()) {
                Map<String, Object> sourceMap = getResponse.getSourceAsMap();
                IndexData data = new IndexData((String) sourceMap.get("title"), (String) sourceMap.get("text"));
                LOGGER.info(data);
            }
            LOGGER.info("3. Getting a document by ID finished");

            // 4. ドキュメントを検索します
            LOGGER.info("4. Searching for documents start");
            SearchRequest searchRequest = new SearchRequest(index);
            searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            for (SearchHit hit : searchResponse.getHits().getHits()) {
                Map<String, Object> sourceMap = hit.getSourceAsMap();
                IndexData data = new IndexData((String) sourceMap.get("title"), (String) sourceMap.get("text"));
                LOGGER.info(data);
            }
            LOGGER.info("4. Searching for documents finished");

            // 5. ドキュメントを削除します
            LOGGER.info("5. Deleting a document start");
            client.delete(new DeleteRequest(index, "1"), RequestOptions.DEFAULT);
            LOGGER.info("5. Deleting a document finished");

            // 6. インデックスを削除します
            LOGGER.info("6. Deleting an index {} start", index);
            DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
            AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
            LOGGER.info("6. Deleting an index {} finished", index);

            LOGGER.info("end test...");
        } catch (Exception e) {
            LOGGER.error(e.toString(), e);
        }
    }
}

低レベル Python クライアント

依存関係の構成

pip3 install opensearch-py

サンプルコード

import os
from opensearchpy import OpenSearch

host = os.getenv("HOST", default="<polarsearch_host>")
port = int(os.getenv("PORT", '<polarsearch_port>'))
auth = (os.getenv("USERNAME", "<polarsearch_username>"), os.getenv("PASSWORD", "<polarsearch_password>"))


client = OpenSearch(
    hosts=[{"host": host, "port": port}],
    http_auth=auth,
    use_ssl=False,
    verify_certs=False,
    ssl_show_warn=False,
)

# デフォルト以外の設定でインデックスを作成します。
index_name = 'python-test-index'
index_body = {
  'settings': {
    'index': {
      'number_of_shards': 4
    }
  }
}

response = client.indices.create(index=index_name, body=index_body)
print('\nCreating index:')
print(response)

# インデックスにドキュメントを追加します。
document = {
  'title': 'Moneyball',
  'director': 'Bennett Miller',
  'year': '2011'
}
id = '1'

response = client.index(
    index = index_name,
    body = document,
    id = id,
    refresh = True
)

print('\nAdding document:')
print(response)

# 一括操作を実行します

movies = '{ "index" : { "_index" : "my-dsl-index", "_id" : "2" } } \n { "title" : "Interstellar", "director" : "Christopher Nolan", "year" : "2014"} \n { "create" : { "_index" : "my-dsl-index", "_id" : "3" } } \n { "title" : "Star Trek Beyond", "director" : "Justin Lin", "year" : "2015"} \n { "update" : {"_id" : "3", "_index" : "my-dsl-index" } } \n { "doc" : {"year" : "2016"} }'

client.bulk(body=movies)

# ドキュメントを検索します。
q = 'miller'
query = {
  'size': 5,
  'query': {
    'multi_match': {
      'query': q,
      'fields': ['title^2', 'director']
    }
  }
}

response = client.search(
    body = query,
    index = index_name
)
print('\nSearch results:')
print(response)

# ドキュメントを削除します。
response = client.delete(
    index = index_name,
    id = id
)

print('\nDeleting document:')
print(response)

# インデックスを削除します。
response = client.indices.delete(
    index = index_name
)

print('\nDeleting index:')
print(response)

関連ドキュメント