PolarSearch は、公式の OpenSearch クライアントと完全な互換性があります。Java や Python などの一般的なプログラミング言語を使用して、インデックスの管理、ドキュメント操作 (作成、読み取り、更新、削除を含む)、複雑な検索の実行、および検索機能のアプリケーションへのシームレスな統合が可能です。
前提条件
PolarSearch ノードを持つクラスターが作成され、ノードの管理者アカウントが設定されていること。
エンドポイントの取得:クラスターの データベースノード セクションで、検索ノード にカーソルを合わせ、ビジネス環境に基づいて 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. 環境のセットアップ
プロジェクトディレクトリに移動します。この例では
/home/PolarSearchTestPythonを使用します。mkdir /home/PolarSearchTestPython cd /home/PolarSearchTestPython/home/PolarSearchTestPythonディレクトリで、仮想環境 (venv) を作成してプロジェクトの依存関係を分離し、グローバルパッケージとの競合を防ぎます。python3 -m venv myenv仮想環境をアクティブ化します。
source myenv/bin/activate必要な 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 バージョン
PolarSearch 3.x バージョン
実行方法
mvn clean compile exec:java -Dexec.mainClass=samples.OpenSearchClientExampleOpenSearch Java 高レベル REST クライアント
サンプルコード
PolarSearch 1.x バージョン
PolarSearch 3.x バージョン
実行方法
mvn clean compile exec:java -Dexec.mainClass=samples.OpenSearchClientExampleElasticsearch Java 高レベル REST クライアント
サンプルコード
低レベル 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)