PolarSearch は、PolarDB の分散検索サービスで、全文検索とベクトル検索の両方をサポートしています。OpenSearch をベースに構築されており、Elasticsearch エコシステムと互換性があり、PolarDB データベースと緊密に統合されています。PolarSearch は、データ検索を簡素化するワンストップソリューションを提供します。
このガイドは、Elasticsearch または OpenSearch の基本的な知識があることを前提としています。詳細については、「OpenSearch ドキュメント」をご参照ください。
前提条件
クラスター構成の要件
製品エディション:Enterprise Edition。
シリーズ:Cluster Edition。
データベースエンジン:MySQL 8.0.1 または MySQL 8.0.2。
説明上記のデータベースエンジンには、特定のマイナーバージョン要件はありません。詳細については、「バージョン番号のクエリ」をご参照ください。
サポート対象のリージョンとアベイラビリティーゾーン
PolarSearch は、以下のアベイラビリティーゾーンで利用できます:
リージョン | アベイラビリティーゾーン |
中国 (杭州) | ゾーン K、ゾーン J |
中国 (上海) | ゾーン E、ゾーン F、ゾーン L、ゾーン N |
中国 (深圳) | ゾーン C、ゾーン D、ゾーン F |
中国 (北京) | ゾーン F、ゾーン L、ゾーン I、ゾーン K |
中国 (張家口) | ゾーン B |
中国 (ウランチャブ) | ゾーン B、ゾーン C |
中国 (香港) | ゾーン B、ゾーン D |
シンガポール | ゾーン A、ゾーン B |
日本 (東京) | ゾーン A、ゾーン C |
韓国 (ソウル) | ゾーン A、ゾーン B |
ドイツ (フランクフルト) | ゾーン A |
米国 (シリコンバレー) | ゾーン B |
フィリピン (マニラ) | ゾーン A |
追加のアベイラビリティーゾーンのサポートが必要な場合は、チケットを送信してください。
課金
PolarSearch は、専用の検索ノードを使用して検索機能を提供し、これらのノードに対して料金が発生します。検索ノードは、通常のコンピューティングノードの課金に基づいて課金されます。さらに、検索ノード内のインデックスとデータはストレージ領域を消費するため、対応するストレージ料金とも適用されます。
PolarSearch 検索ノードの追加
前提条件を満たす既存のクラスターに検索ノードを追加できます。
PolarDB コンソールにログインします。 左側のナビゲーションペインで、クラスター をクリックします。 次に、クラスターの リージョン を選択し、ターゲットクラスターを見つけます。
クラスター ID をクリックすると、基本情報 ページが開きます。
データベースノード セクションで、ノードの追加/削除 をクリックします。

ノードの追加/削除 ウィザードで、検索ノードの追加を選択します。
検索ノードアカウントの作成
管理者アカウントの設定
追加するアカウントは標準アカウントです。
この標準アカウントは、PolarSearch の管理者アカウントとして機能します。
[PolarDB コンソール] にログインします。左側のナビゲーションペインで クラスター をクリックします。次に、クラスターの [リージョン] を選択し、目的のクラスターを見つけます。
クラスター ID をクリックすると、基本情報 ページが開きます。
データベースノード セクションで、検索ノード にカーソルを合わせ、データベースに接続するためのアカウントの設定 をクリックします。

表示されるダイアログボックスで、既存の標準アカウントを選択するか、新しいアカウントを作成し、アカウントのパスワードを入力します。
重要データベースアカウント名は、そのパスワードの部分文字列にすることはできません。チェックでは大文字と小文字は区別されません。たとえば、
search_testという名前のデータベースアカウントの場合、パスワードをSEARCH_test@123にすることはできませんが、SEARCHtest@123またはSEARCH@_testにすることはできます。
標準アカウントの設定
標準アカウントの権限は、インデックスごとに設定できます。ダッシュボードまたは REST API を使用して、2 つの方法で設定できます。
ダッシュボードでの設定
アカウントには security_rest_api_access ロールが必要です。そうでない場合、セキュリティページは表示されません。
ユーザーの作成:
左側のナビゲーションペインで、 ページに移動し、[内部ユーザー] を選択して、[内部ユーザーの作成] をクリックします。

ユーザー作成ページで、ユーザー名とパスワードを入力してユーザーを作成します。 たとえば、ユーザー名
testuser、パスワードUSER@test123でユーザーを作成し、[作成] をクリックします。
ロールの作成:
左側のナビゲーションペインで、 ページに移動し、[ロール] を選択し、[ロールの作成] をクリックします。

ロール権限にはクラスター権限とインデックス権限が含まれ、アクショングループを追加して設定できます。[インデックス] フィールドで、インデックス名を指定するか、
*ワイルドカードを使用して一連のインデックス名に一致させます。[インデックス権限] セクションで、読み取り専用や読み取り/書き込みなどの特定の権限を選択します。例:
onlyreadroleという名前のロールを作成します。このロールには、クラスターの完全な権限 (unlimited は完全な権限と同等) と、indextestで始まるすべてのインデックスに対する読み取り専用権限が付与されます。
ロールをユーザーにマッピング:
左側のナビゲーションペインで、 ページに移動し、[ロール] を選択して、対象のロールをクリックします。
[マッピングされたユーザー] タブで、ユーザーマッピングを追加します。ユーザーは複数のロールにマッピングでき、マッピングされたすべてのロールの権限を継承します。
例:
onlyreadroleロールをtestuserユーザーに割り当てます。これにより、testuserユーザーにはonlyreadroleロールの権限が付与されます。
REST API での設定
検索ノードは、API による完全なアクセス制御をサポートしています。詳細については、「OpenSearch API ドキュメント」をご参照ください。
ユーザーの作成
curl -X PUT "http://<endpoint>:<port>/_plugins/_security/api/internalusers/<new_user>" \ --user "<user_name>:<passwd>" \ -H "Content-Type: application/json" \ -d '{ "password": "<new_password>", "backend_roles": [], "attributes": {} }'例:ユーザー名が
testuser、パスワードがUSER@test123のユーザーを作成します。curl -X PUT "http://<endpoint>:<port>/_plugins/_security/api/internalusers/testuser" \ --user "<user_name>:<passwd>" \ -H "Content-Type: application/json" \ -d '{ "password": "USER@test123", "backend_roles": [], "attributes": {} }'ロールの作成
curl -X PUT "http://<endpoint>:<port>/_plugins/_security/api/roles/<role_name>" \ --user "<user_name>:<passwd>" \ -H "Content-Type: application/json" \ -d '{ "cluster_permissions": ["*"], "index_permissions": [ { "index_patterns": ["*"], "allowed_actions": ["*"] } ] }'index_patternsは、設定するインデックスを指定します。*ワイルドカードを使用して、一度に複数のインデックスを設定できます。allowed_actions:readやwriteなど、付与する権限を指定します。
例:
onlyreadroleという名前でロールを作成し、クラスターの完全な権限と、indextestというプレフィックスが付いたすべてのインデックスに対する読み取り専用権限を付与します。curl -X PUT "http://<endpoint>:<port>/_plugins/_security/api/roles/onlyreadrole" \ --user "<user_name>:<passwd>" \ -H "Content-Type: application/json" \ -d '{ "cluster_permissions": ["*"], "index_permissions": [ { "index_patterns": ["indextest*"], "allowed_actions": ["read"] } ] }'ロールのマッピング
curl -X PUT "http://<endpoint>:<port>/_plugins/_security/api/rolesmapping/<role_name>" \ --user "<user_name>:<passwd>" \ -H "Content-Type: application/json" \ -d '{ "backend_roles": [], "hosts": [], "users": ["<new_user>"] }'例:
onlyreadroleロールをtestuserユーザーにマッピングします。 これにより、testuserユーザーにはonlyreadroleロールの権限が付与されます。curl -X PUT "http://<endpoint>:<port>/_plugins/_security/api/rolesmapping/onlyreadrole" \ --user "<user_name>:<passwd>" \ -H "Content-Type: application/json" \ -d '{ "backend_roles": [], "hosts": [], "users": ["testuser"] }'
接続エンドポイントの取得
検索エンドポイント
データベースノード セクションで、検索ノード にカーソルを合わせると、ご使用の環境に対応するプライベートエンドポイントまたはパブリックエンドポイントを取得できます。

ダッシュボードエンドポイント
データベースノード セクションで、検索ノード にカーソルを合わせると、お使いの環境に対応するプライベートまたはパブリックのダッシュボードエンドポイントを取得できます。
PolarSearch への接続
検索エンドポイント経由での接続
API を使用してインデックスとデータを管理する場合は、検索エンドポイント経由で PolarSearch に接続できます。次の例は、ECS インスタンスから接続する方法を示しています。
クラスターホワイトリストの設定:ECS インスタンスの IP アドレスを PolarDB クラスターホワイトリストに追加します。
説明ECS インスタンスと PolarDB クラスターが同じ仮想プライベートクラウド (VPC) にある場合は、ECS インスタンスのプライベート IP アドレスをホワイトリストに追加します。
ECS インスタンスと PolarDB クラスターが同じ VPC にない場合は、ECS インスタンスのパブリック IP アドレスをホワイトリストに追加します。
PolarSearch への接続:次のコマンドを実行します。コマンドがクラスター情報を返す場合、接続は成功です。
<endpoint>:<port>を PolarSearch 検索エンドポイントに、<user_name>:<passwd>を PolarSearch 管理者アカウントに置き換えます。curl http://<endpoint>:<port>/ -u <user_name>:<passwd>
ダッシュボード経由での接続
GUI を使用して PolarSearch を管理する場合は、ダッシュボード経でアクセスできます。次の例では、ローカル環境のブラウザを使用します:
クラスターホワイトリストの設定:ローカルマシンのパブリック IP アドレスを PolarDB クラスターホワイトリストに追加します。
ブラウザで PolarSearch コンソールにログインします:
ブラウザのアドレスバーに
http://<endpoint>:<port>を入力し、Enter キーを押します。<endpoint>:<port>を PolarSearch の パブリックダッシュボードエンドポイント に置き換えます。ログインページで、PolarSearch の管理者アカウントの認証情報を入力して、Kibana 互換の PolarSearch コンソールにアクセスします。
例
このセクションのすべての例は、ECS インスタンスのコマンドラインから実行されます。
PolarSearch は、OpenSearch 2.19.0 SDK および REST API と完全に互換性があります。他のバージョンを使用すると、互換性の問題が発生する可能性があります。詳細については、「OpenSearch」をご参照ください。
インデックスの作成
検索ノードのインデックスは、リレーショナルデータベースのテーブルに似ています。Elasticsearch 互換の REST API を使用するか、ダッシュボードでコマンドを直接実行することで、インデックスを作成できます。以下に例を示します:
CLI
curl -XPUT "http://<endpoint>:<port>/articles" \
--user "<user_name>:<passwd>" \
-H 'Content-Type: application/json' \
-d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"author": {
"type": "keyword"
}
}
}
}'ダッシュボード
PUT articles
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"author": {
"type": "keyword"
}
}
}
}データのインポート
CLI
curl -XPOST "http://<endpoint>:<port>/articles/_bulk" \
--user "<user_name>:<passwd>" \
-H 'Content-Type: application/json' \
-d '
{"index": {}}
{"title": "Introduction to PolarSearch", "content": "PolarSearch is a powerful search engine.", "author": "田中"}
{"index": {}}
{"title": "Advanced Search Techniques", "content": "Learn how to use full-text search and filters in PolarDB.", "author": "鈴木"}
{"index": {}}
{"title": "Elasticsearch vs PolarSearch", "content": "A comparison of Elasticsearch and PolarSearch features.", "author": "佐藤"}
'ダッシュボード
POST articles/_bulk
{"index": {}}
{"title": "Introduction to PolarSearch", "content": "PolarSearch is a powerful search engine.", "author": "田中"}
{"index": {}}
{"title": "Advanced Search Techniques", "content": "Learn how to use full-text search and filters in PolarDB.", "author": "鈴木"}
{"index": {}}
{"title": "Elasticsearch vs PolarSearch", "content": "A comparison of Elasticsearch and PolarSearch features.", "author": "佐藤"}検索クエリの実行
データがインポートされた後、SDK、REST API、またはダッシュボードを使用して全文検索を実行できます。次の例は、その方法を示しています:
CLI
curl -XGET "http://<endpoint>:<port>/articles/_search" \
--user "<user_name>:<passwd>" \
-H 'Content-Type: application/json' \
-d '
{
"query": {
"match": {
"content": "PolarSearch"
}
}
}'ダッシュボード
GET articles/_search
{
"query": {
"match": {
"content": "PolarSearch"
}
}
}検索クエリ構文の詳細については、「OpenSearch ドキュメント」をご参照ください。
ベクトルインデックスの作成
CLI
curl -XPUT "http://<endpoint>:<port>/my-vector-index" \
--user "<user_name>:<passwd>" \
-H "Content-Type:application/json" \
-d '
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"vector_field": {
"type": "knn_vector",
"dimension": 4
},
"metadata": {
"type": "text"
}
}
}
}
'ダッシュボード
PUT my-vector-index
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"vector_field": {
"type": "knn_vector",
"dimension": 4
},
"metadata": {
"type": "text"
}
}
}
}ベクトルデータの挿入
CLI
curl -XPOST "http://<endpoint>:<port>/my-vector-index/_bulk" \
--user "<user_name>:<passwd>" \
-H "Content-Type:application/json" \
-d '
{"index": {}}
{"vector_field": [0.1, 0.5, -0.3, 0.8], "metadata": "Document 1"}
{"index": {}}
{"vector_field": [-0.2, 0.7, 0.4, -0.1], "metadata": "Document 2"}
'ダッシュボード
POST my-vector-index/_bulk
{"index": {}}
{"vector_field": [0.1, 0.5, -0.3, 0.8], "metadata": "Document 1"}
{"index": {}}
{"vector_field": [-0.2, 0.7, 0.4, -0.1], "metadata": "Document 2"}ベクトル検索
CLI
curl -XGET "http://<endpoint>:<port>/my-vector-index/_search" \
--user "<user_name>:<passwd>" \
-H "Content-Type:application/json" \
-d '
{
"size": 2,
"query": {
"knn": {
"vector_field": {
"vector": [0.1, 0.5, -0.3, 0.8],
"k": 2
}
}
}
}
'ダッシュボード
GET my-vector-index/_search
{
"size": 2,
"query": {
"knn": {
"vector_field": {
"vector": [0.1, 0.5, -0.3, 0.8],
"k": 2
}
}
}
}