Java Low Level REST Client は、Elasticsearch によって提供される基本的な REST クライアントです。 その API 操作は、データのエンコードまたはデコードを行いません。 LindormSearch は、Elasticsearch 7.10 以前のバージョンと互換性があります。 LindormSearch に接続するときにリクエストとレスポンスをカスタマイズするには、Java Low Level REST Client を使用できます。
前提条件
JDK 1.8 以降の Java 環境がインストールされている必要があります。
Lindorm インスタンスに対して LindormSearch がアクティブ化されている。 詳細については、「LindormSearch のアクティブ化」をご参照ください。
クライアントの IP アドレスが Lindorm インスタンスのホワイトリストに追加されている。 詳細については、「ホワイトリストの設定」をご参照ください。
手順
Java Low Level REST Client をインストールします。Maven プロジェクトの場合、
pom.xmlファイルのdependenciesセクションに以下の依存関係を追加します。<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>7.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.7</version> </dependency>接続パラメーターを構成します。
// Elasticsearch 用の LindormSearch エンドポイントを指定します。 String search_url = "ld-t4n5668xk31ui****-proxy-search-public.lindorm.rds.aliyuncs.com"; int search_port = 30070; // LindormSearch への接続に使用するユーザー名とパスワードを指定します。 String username = "user"; String password = "test"; final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(search_url, search_port)); restClientBuilder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() { @Override public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } });パラメーター
パラメーター
説明
search_url
[elasticsearch 用の Lindormsearch エンドポイント]。 エンドポイントの取得方法の詳細については、「エンドポイントの表示」をご参照ください。
重要アプリケーションが ECS インスタンスにデプロイされている場合は、セキュリティの向上とネットワークレイテンシの低減のために、VPC を使用して Lindorm インスタンスに接続することをお勧めします。
アプリケーションがローカル環境にデプロイされており、パブリックネットワーク経由で Lindorm インスタンスに接続する場合は、コンソールで事前にパブリックエンドポイントを有効にする必要があります。左側のナビゲーションウィンドウで Database Connections をクリックします。Search Engine タブをクリックし、右上隅の Enable Public Endpoint をクリックします。
VPC 経由で接続する場合は、search_url に VPC エンドポイントを設定します。パブリックネットワーク経由で接続する場合は、search_url に Internet エンドポイントを設定します。
search_port
[Elasticsearch 用 LindormSearch エンドポイント] にアクセスするために使用されるポートです。このパラメーターの値は 30070 に固定されています。
username
検索エンジンにアクセスするためのユーザー名とパスワードです。
デフォルトのユーザー名とパスワードを取得するには、コンソールにアクセスします。左側のナビゲーションウィンドウで Database Connections をクリックします。認証情報は Search Engine タブに表示されます。
password
Java Low Level REST Client オブジェクトを使用して検索エンジンにアクセスできます。
サンプルコードには以下の処理が含まれています。
検索インデックスの作成: lindorm_index という名前の検索インデックスが作成されます。
データ書き込み:5,000 件のドキュメントをバッチで書き込みます。
データのクエリ: 更新リクエストを開始して、LindormSearch に書き込まれたデータを表示します。 サンプルコードでは、2 つのリクエストが送信され、インデックス内のすべてのドキュメントと、インデックス内の指定された ID を持つドキュメントが個別にクエリされます。
データの削除: ID が test のドキュメントを削除し、lindorm_index インデックスを削除します。
try (RestClient restClient = restClientBuilder.build()) { String indexName = "lindorm_index"; // 検索インデックスを作成します。 Request indexRequest = new Request("PUT", "/" + indexName); indexRequest.setJsonEntity("{" + " \"settings\":{" + " \"index.number_of_shards\": 1" + " }," + " \"mappings\":{" + " \"properties\":{" + " \"name\":{" + " \"type\":\"text\"" + " }" + " }" + " }" + "}"); Response response = restClient.performRequest(indexRequest); String responseBody = EntityUtils.toString(response.getEntity()); System.out.println("responseBody = " + responseBody); // 複数のドキュメントをバッチで LindormSearch に書き込みます。 Random random = new Random(); Request bulkRequest = new Request("POST", "/_bulk"); StringBuilder bulkJsonBuilder = new StringBuilder(); for (int i = 0; i < 5000; i++) { // コード内のフィールドと値を、ビジネスの実際の値に置き換えます。 bulkJsonBuilder.append("{\"index\":{\"_index\":\"").append(indexName).append("\",\"_id\":\"").append(i).append("\"}}").append("\n"); String value = random.nextInt() + ""; bulkJsonBuilder.append("{\"field1\":\"").append(value).append("\",\"field2\":\"").append(value).append("\"}").append("\n"); } bulkRequest.setJsonEntity(bulkJsonBuilder.toString()); response = restClient.performRequest(bulkRequest); // LindormSearch に書き込まれたデータを表示するためにリフレッシュリクエストを開始します。 response = restClient.performRequest(new Request("POST", "/" + indexName + "/_refresh")); responseBody = EntityUtils.toString(response.getEntity()); System.out.println("responseBody = " + responseBody); // インデックス内のすべてのデータをクエリします。 デフォルトでは、最大 10 件の結果が返されます。 response = restClient.performRequest(new Request("GET", "/" + indexName + "/_search")); responseBody = EntityUtils.toString(response.getEntity()); System.out.println("responseBody = " + responseBody); // インデックス内で ID が 0 のドキュメントをクエリします。 response = restClient.performRequest(new Request("GET", "/" + indexName + "/_doc/0")); responseBody = EntityUtils.toString(response.getEntity()); System.out.println("responseBody = " + responseBody); // インデックスを削除します。 response = restClient.performRequest(new Request("DELETE", "/" + indexName)); responseBody = EntityUtils.toString(response.getEntity()); System.out.println("responseBody = " + responseBody); } catch (Exception e) { System.out.println("msg: " + e.getMessage()); }
完全なサンプルコード
完全なサンプルコードは以下のとおりです。
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.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.Response;
import java.util.Random;
public class RestLClientTest {
public static void main(String[] args) {
// Elasticsearch 用の LindormSearch エンドポイントを指定します。
String search_url = "ld-t4n5668xk31ui****-proxy-search-public.lindorm.rds.aliyuncs.com";
int search_port = 30070;
// LindormSearch に接続するために使用するユーザー名とパスワードを指定します。
String username = "user";
String password = "test";
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(search_url, search_port));
restClientBuilder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
try (RestClient restClient = restClientBuilder.build()) {
String indexName = "lindorm_index";
// 検索インデックスを作成します。
Request indexRequest = new Request("PUT", "/" + indexName);
indexRequest.setJsonEntity("{" +
" \"settings\":{" +
" \"index.number_of_shards\": 1" +
" }," +
" \"mappings\":{" +
" \"properties\":{" +
" \"name\":{" +
" \"type\":\"text\"" +
" }" +
" }" +
" }" +
"}");
Response response = restClient.performRequest(indexRequest);
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// 複数のドキュメントをバッチで LindormSearch に書き込みます。
Random random = new Random();
Request bulkRequest = new Request("POST", "/_bulk");
StringBuilder bulkJsonBuilder = new StringBuilder();
for (int i = 0; i < 5000; i++) {
// コード内のフィールドと値を、実際のビジネスのものに置き換えてください。
bulkJsonBuilder.append("{\"index\":{\"_index\":\"").append(indexName).append("\",\"_id\":\"").append(i).append("\"}}").append("\n");
String value = random.nextInt() + "";
bulkJsonBuilder.append("{\"field1\":\"").append(value).append("\",\"field2\":\"").append(value).append("\"}").append("\n");
}
bulkRequest.setJsonEntity(bulkJsonBuilder.toString());
response = restClient.performRequest(bulkRequest);
// LindormSearch に書き込まれたデータを表示するためのリフレッシュリクエストを開始します。
response = restClient.performRequest(new Request("POST", "/" + indexName + "/_refresh"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// インデックス内のすべてのデータを照会します。デフォルトでは、最大 10 件の結果が返されます。
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_search"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// インデックス内で ID が 0 のドキュメントを照会します。
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_doc/0"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// インデックスを削除します。
response = restClient.performRequest(new Request("DELETE", "/" + indexName));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
} catch (Exception e) {
System.out.println("msg: " + e.getMessage());
}
}
}次の結果が返されます。
responseBody = {"acknowledged":true,"shards_acknowledged":true,"index":"lindorm_index"}
responseBody = {"_shards":{"total":1,"successful":1,"failed":0}}
responseBody = {"took":6,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":5000,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"lindorm_index","_id":"0","_score":1.0,"_source":{"field1":"2127821774","field2":"2127821774"}},{"_index":"lindorm_index","_id":"1","_score":1.0,"_source":{"field1":"1820331840","field2":"1820331840"}},{"_index":"lindorm_index","_id":"2","_score":1.0,"_source":{"field1":"-388903172","field2":"-388903172"}},{"_index":"lindorm_index","_id":"3","_score":1.0,"_source":{"field1":"-68048869","field2":"-68048869"}},{"_index":"lindorm_index","_id":"4","_score":1.0,"_source":{"field1":"1865955199","field2":"1865955199"}},{"_index":"lindorm_index","_id":"5","_score":1.0,"_source":{"field1":"1088273523","field2":"1088273523"}},{"_index":"lindorm_index","_id":"6","_score":1.0,"_source":{"field1":"-1529281106","field2":"-1529281106"}},{"_index":"lindorm_index","_id":"7","_score":1.0,"_source":{"field1":"-1185412160","field2":"-1185412160"}},{"_index":"lindorm_index","_id":"8","_score":1.0,"_source":{"field1":"-1243760053","field2":"-1243760053"}},{"_index":"lindorm_index","_id":"9","_score":1.0,"_source":{"field1":"1066058716","field2":"1066058716"}}]}}
responseBody = {"_index":"lindorm_index","_id":"0","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"field1":"2127821774","field2":"2127821774"}}
responseBody = {"acknowledged":true}