このトピックでは、PHP、Python、Java、Go のクライアントを使用してAlibaba Cloud Elasticsearch クラスターに接続するためのサンプルコードと重要な注意事項について説明します。
前提条件
-
Alibaba Cloud Elasticsearch クラスターを作成します。 詳細については、「Alibaba Cloud Elasticsearch クラスターの作成」をご参照ください。
-
目的のプログラミング言語用の Elasticsearch クライアントをインストールします。
互換性の問題を避けるために、お使いの Elasticsearch のバージョンと一致するクライアントバージョンを使用してください。 Elasticsearch とクライアントのバージョン互換性の詳細については、「互換性」をご参照ください。
-
Elasticsearch Go クライアント: Elasticsearch Go Client。
説明Go を使用して Alibaba Cloud Elasticsearch クラスターに接続する前に、Go コンパイル環境をインストールしてください。 詳細については、「The Go Programming Language」をご参照ください。 このトピックの例では、Go 1.19.1 を使用します。
-
Elasticsearch Java クライアント: Elasticsearch Java API Client。
説明-
Java クライアントには、トランスポートクライアント、低レベル REST クライアント、高レベル REST クライアント、Java API クライアントがあります。 各タイプのサンプルコードについては、「Java API」をご参照ください。 このトピックでは、高レベル REST クライアント V6.7 を例として使用します。
-
Java トランスポートクライアントは、TCP を介して Elasticsearch クラスターと通信します。 クライアントを使用して異なるバージョンの Elasticsearch クラスターと通信すると、互換性の問題が発生する可能性があります。 このため、トランスポートクライアントは以降のバージョンでは非推奨となっています。 トランスポートクライアント V5.5 または V5.6 を使用して V5.5 または V5.6 の Elasticsearch クラスターに接続すると、NoNodeAvailableException エラーが発生する可能性があります。 バージョンの互換性を確保するために、トランスポートクライアント V5.3.3 または「Java 低レベル REST クライアント」を使用して Elasticsearch クラスターに接続してください。
-
-
Elasticsearch PHP クライアント: Elasticsearch PHP Client。
説明Elasticsearch PHP クライアントが提供するデフォルトの接続プールは、クラウド環境には適していません。 Alibaba Cloud Elasticsearch は、負荷分散ドメイン名サービスを提供します。 したがって、PHP アプリケーションでは、接続プールとして SimpleConnectionPool を使用する必要があります。 そうしないと、Alibaba Cloud Elasticsearch クラスターの再起動時に接続エラーが発生する可能性があります。 アプリケーションは、再接続メカニズムも実装する必要があります。 SimpleConnectionPool を使用しても、クラスターの再起動時に「No enabled connection」などの接続エラーが発生することがあります。
-
Elasticsearch Python クライアント: Elasticsearch Python Client。
-
その他の Elasticsearch クライアントの詳細については、「Elasticsearchクライアント」をご参照ください。
-
-
Elasticsearch クラスターの自動インデックス作成機能を有効にします。 詳細については、「YMLパラメーターの設定」をご参照ください。
-
ネットワーク接続を確保するために、Alibaba Cloud Elasticsearch クラスターのホワイトリストを設定します。
-
コードを実行するサーバーと Alibaba Cloud Elasticsearch クラスターが同じ Virtual Private Cloud (VPC) 内にある場合は、クラスターの内部エンドポイントを使用して接続します。 接続する前に、サーバーのプライベート IP アドレスを VPC のプライベート IP アドレスホワイトリスト (デフォルト:0.0.0.0/0) に追加します。
-
コードを実行するサーバーがパブリックネットワーク上にある場合は、クラスターのパブリックエンドポイントを使用して接続します。 パブリックエンドポイントを有効にし、サーバーのパブリック IP アドレスを Alibaba Cloud Elasticsearch クラスターのパブリック IP アドレスホワイトリストに追加します。 詳細については、「Elasticsearchクラスターのパブリックまたはプライベート IP アドレスホワイトリストの設定」をご参照ください。
重要-
Wi-Fi またはブロードバンドネットワークから接続する場合は、パブリック IP アドレスをホワイトリストに追加します。
-
ホワイトリストを 0.0.0.0/0 に設定して、すべての IPv4 アドレスが Elasticsearch クラスターにアクセスできるようにすることもできます。 この設定はクラスターをパブリックネットワークに公開し、セキュリティリスクが高まります。 関連するリスクを理解し、受け入れる場合にのみ、この設定を使用してください。
-
ホワイトリストが設定されていないか、正しく設定されていない場合、
接続タイムアウトエラーが発生します。 -
クライアントから Kibana ノードにアクセスするには、Kibana のホワイトリストも設定する必要があります。 詳細については、「Kibanaを使用したクラスターへの接続」をご参照ください。
-
-
サンプルコード
次の例では、一般的なクライアントを使用して Alibaba Cloud Elasticsearch クラスターに接続する方法を説明します。
// この例では Go 1.19.1 を使用します。
package main
import (
"log"
"github.com/elastic/go-elasticsearch/v7"
)
func main() {
cfg := elasticsearch.Config {
Addresses: []string{
"<YourEsHost>",
},
Username: "<UserName>",
Password: "<YourPassword>",
}
es, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
res, err := es.Info()
if err != nil {
log.Fatalf("Error getting response: %s", err)
}
defer res.Body.Close()
log.Println(res)
}// この例では、高レベル REST クライアント V6.7 を使用します。
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 MB です。この例では、値を 30 MB に変更します。
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
public static void main(String[] args) {
// Alibaba Cloud Elasticsearch クラスターには基本認証が必要です。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
// Alibaba Cloud Elasticsearch クラスターの作成時に設定したユーザー名とパスワードを使用します。これらは Kibana コンソールのログイン認証情報でもあります。
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("<UserName>", "<YourPassword>"));
// ビルダーを使用して REST クライアントを作成し、HTTP クライアントの HttpClientConfigCallback を設定します。
// クラスターエンドポイントを取得するには、Elasticsearch クラスターの ID をクリックして、[基本情報] ページに移動します。
RestClientBuilder builder = RestClient.builder(new HttpHost("<YourEsHost>", 9200, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// RestHighLevelClient インスタンスは、REST 低レベルクライアントビルダーを使用して構築します。
RestHighLevelClient highClient = new RestHighLevelClient(builder);
try {
// リクエストを作成します。
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("<YourEsField1>", "<YourEsFieldValue1>");
jsonMap.put("<YourEsField2>", "<YourEsFieldValue2>");
IndexRequest indexRequest = new IndexRequest("<YourEsIndex>", "<YourEsType>", "<YourEsId>").source(jsonMap);
// リクエストを同期的に実行し、カスタムリクエストオプション (COMMON_OPTIONS) を使用します。
IndexResponse indexResponse = highClient.index(indexRequest, COMMON_OPTIONS);
long version = indexResponse.getVersion();
System.out.println("Index document successfully! " + version);
highClient.close();
} catch (IOException ioException) {
// 例外を処理します。
}
}
}<?php
require 'vendor/autoload.php';
use Elasticsearch\ClientBuilder;
$client = ClientBuilder::create()->setHosts([
[
'host' => '<YourEsHost>',
'port' => '9200',
'scheme' => 'http',
'user' => '<UserName>',
'pass' => '<YourPassword>'
]
])->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
->setRetries(10)->build();
$indexParams = [
'index' => '<YourEsIndex>',
'type' => '<YourEsType>',
'id' => '<YourEsId>',
'body' => ['<YourEsField>' => '<YourEsFieldValue>'],
'client' => [
'timeout' => 10,
'connect_timeout' => 10
]
];
$indexResponse = $client->index($indexParams);
print_r($indexResponse);
$searchParams = [
'index' => '<YourEsIndex>',
'type' => '<YourEsType>',
'body' => [
'query' => [
'match' => [
'<YourEsField>' => '<YourEsFieldValue>'
]
]
],
'client' => [
'timeout' => 10,
'connect_timeout' => 10
]
];
$searchResponse = $client->search($searchParams);
print_r($searchResponse);
?>from elasticsearch import Elasticsearch, RequestsHttpConnection
import certifi
es = Elasticsearch(
['<YourEsHost>'],
http_auth=('<UserName>', '<YourPassword>'),
port=9200,
use_ssl=False
)
res = es.index(index="<YourEsIndex>", doc_type="<YourEsType>", id=<YourEsId>, body={"<YourEsField1>": "<YourEsFieldValue1>", "<YourEsField2>": "<YourEsFieldValue2>"})
res = es.get(index="<YourEsIndex>", doc_type="<YourEsType>", id=<YourEsId>)
print(res['_source'])Elasticsearch クラスターが HTTPS プロトコルを使用している場合は、use_ssl の値を True に設定し、verify_certs=True を追加します。
es = Elasticsearch(
['<YourEsHost>'],
http_auth=('<UserName>', '<YourPassword>'),
port=9200,
use_ssl=True,
verify_certs=True
)
サンプルコードを使用する際は、次のプレースホルダーを実際の値に置き換えてください。
|
パラメーター |
説明 |
|
<YourEsHost> |
Alibaba Cloud Elasticsearch クラスターの内部またはパブリックエンドポイント。 エンドポイントは、クラスターまたはアプリケーション の [基本情報] ページで確認できます。 |
|
<UserName> |
Alibaba Cloud Elasticsearch クラスターのユーザー名は |
|
<YourPassword> |
Alibaba Cloud Elasticsearch クラスターのユーザーのパスワードです。 パスワードを忘れた場合は、リセットできます。 Alibaba Cloud Elasticsearch クラスターの場合、このオプションはクラスター詳細ページの [セキュリティ] ページにあり。 詳細については、「Elasticsearchクラスターのアクセスパスワードのリセット」をご参照ください。 |
|
<YourEsIndex> |
インデックスの名前です。 |
|
<YourEsType> |
ドキュメントタイプです。 重要
7.0 より前の Elasticsearch バージョンでは、ドキュメントタイプをカスタマイズできました。 Elasticsearch 7.0 以降では、ドキュメントタイプは |
|
<YourEsId> |
ドキュメント ID です。 |
|
<YourEsField> |
フィールド名です。 |
|
<YourEsFieldValue> |
指定されたフィールドの値です。 |