PolarSearch は、PolarDB が提供する分散型検索サービスであり、フルテキスト検索およびベクトル検索をサポートします。OpenSearch を基盤とし、Elasticsearch エコシステムと互換性があるため、PolarDB との緊密な統合により、ワンストップのデータ検索ニーズに対応します。
本ガイドでは、Elasticsearch または OpenSearch に関する事前知識があることを前提としています。詳細については、「OpenSearch ドキュメント」をご参照ください。
適用範囲
クラスター要件
製品エディション:Enterprise Edition。
PolarDB エディション:Cluster Edition。
データベースエンジン:MySQL 8.0.1 または MySQL 8.0.2。
説明上記データベースエンジンバージョンにはマイナーバージョンの制限はありません。詳細については、「バージョン番号の確認方法」をご参照ください。
Serverless クラスターでは PolarSearch はサポートされていません。詳細については、「Serverless」「」をご参照ください。
サポート対象リージョンおよび可用性ゾーン
PolarSearch は、以下の可用性ゾーンでご利用いただけます。
リージョン | ゾーン |
中国 (杭州) | ゾーン K、ゾーン J |
中国 (上海) | ゾーン E、ゾーン F、ゾーン L、ゾーン N |
中国 (深セン) | ゾーン C、ゾーン D、ゾーン F |
中国 (北京) | ゾーン F、ゾーン L、ゾーン I |
中国 (香港) | ゾーン B、ゾーン D |
シンガポール | ゾーン B |
その他の可用性ゾーンへの対応を希望される場合は、チケットを送信してください。
課金
PolarSearch は専用の検索ノードを使用して検索機能を提供しており、課金対象となります。検索ノードの料金は、通常のコンピュートノードと同一の料金体系で計算されます。また、検索ノード上に格納されるインデックスおよびデータはストレージ容量を消費し、ストレージ料金が適用されます。
PolarSearch 検索ノードの追加
適用範囲を満たす既存のクラスターに検索ノードを追加するには、以下の手順を実行します。
PolarDB コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。クラスターがデプロイされている リージョン を選択し、対象のクラスターを検索します。
クラスター ID をクリックして、基本情報 ページに移動します。
データベースノード セクションで、ノードの追加/削除 をクリックします。

ノードの追加/削除 ダイアログボックスで、検索ノードの追加を選択します。
検索ノードアカウントの作成
管理者アカウントの設定
追加するアカウントは、標準のデータベースアカウントです。
この標準データベースアカウントは、PolarSearch の管理者アカウントとして機能します。
PolarDB コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。クラスターがデプロイされている リージョン を選択し、対象のクラスターを検索します。
クラスター ID をクリックして、基本情報 ページに移動します。
データベースノードセクションで、検索ノードにマウスを合わせて、データベースに接続するためのアカウントの設定をクリックします。

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

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

ロールの権限には、クラスターレベルの権限およびインデックスレベルの権限が含まれます。アクショングループを介して権限を追加できます。インデックス フィールドでは、インデックス名を指定するか、
*ワイルドカードを使用して複数のインデックスをマッチさせることができます。インデックス権限 では、読み取り専用や読み書き可能など、必要な権限を選択します。例:クラスターレベルの権限を無制限に付与し、
indextestで始まるすべてのインデックスに対して読み取り専用アクセスを許可するロールonlyreadroleを作成します。
ロールとユーザーのマッピング
左側のナビゲーションウィンドウで、 に移動し、ロール を選択して、対象のロールをクリックします。
マップ済みユーザー タブで、ユーザーのマッピングを追加します。1 人のユーザーは複数のロールにマップでき、マップされたすべてのロールの権限を継承します。
例:ロール
onlyreadroleをユーザーtestuserにマップします。これにより、ユーザーtestuserはロールonlyreadroleのすべての権限を継承します。
REST API
REST 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 for MySQL クラスターのホワイトリストに追加します。
説明ECS インスタンスと PolarDB for MySQL クラスターが同一の VPC 内にある場合は、ECS インスタンスのプライベート IP アドレスを使用します。
ECS インスタンスと PolarDB for MySQL クラスターが異なる VPC 内にある場合は、ECS インスタンスのパブリック IP アドレスを使用します。
PolarSearch への接続:以下のコマンドを実行します。クラスターの情報を返す場合は、クラスターが利用可能であることを意味します。
<endpoint>:<port>を PolarSearch の検索エンドポイントに置き換え、<user_name>:<passwd>を PolarSearch の管理者アカウントに置き換えます。curl http://<endpoint>:<port>/ -u <user_name>:<passwd>
ダッシュボード経由でのアクセス
グラフィカルインターフェイスを使用して PolarSearch を管理するには、ダッシュボード経由で PolarSearch にアクセスします。以下の例ではローカルブラウザを使用します。
クラスターのホワイトリストの設定:ローカル環境の IP アドレスを PolarDB for MySQL クラスターのホワイトリストに追加します。
PolarSearch ダッシュボードへのログイン:
ブラウザのアドレスバーに
http://<endpoint>:<port>を入力して Enter キーを押します。<endpoint>:<port>を PolarSearch のダッシュボードパブリックエンドポイントに置き換えます。ログインページで、PolarSearch の管理者アカウントの認証情報を入力して、Kibana 互換の PolarSearch ダッシュボードにログインします。
使用例
このセクションのすべての例は、ECS インスタンスからコマンドラインで実行されます。
PolarSearch は OpenSearch 2.19.0 SDK および REST API と完全互換です。他のバージョンでは互換性の問題が発生する可能性があります。詳細については、「OpenSearch」をご参照ください。
インデックスの作成
PolarSearch のインデックスは、リレーショナルデータベースにおけるテーブルに相当します。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": "PolarSearch の概要", "content": "PolarSearch は強力な検索エンジンです。", "author": "田中一郎"}
{"index": {}}
{"title": "高度な検索テクニック", "content": "PolarDB におけるフルテキスト検索およびフィルターの使い方を学びます。", "author": "佐藤次郎"}
{"index": {}}
{"title": "Elasticsearch と PolarSearch の比較", "content": "Elasticsearch と PolarSearch の機能を比較します。", "author": "鈴木三郎"}
'ダッシュボード
POST articles/_bulk
{"index": {}}
{"title": "PolarSearch の概要", "content": "PolarSearch は強力な検索エンジンです。", "author": "田中一郎"}
{"index": {}}
{"title": "高度な検索テクニック", "content": "PolarDB におけるフルテキスト検索およびフィルターの使い方を学びます。", "author": "佐藤次郎"}
{"index": {}}
{"title": "Elasticsearch と PolarSearch の比較", "content": "Elasticsearch と PolarSearch の機能を比較します。", "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": "ドキュメント 1"}
{"index": {}}
{"vector_field": [-0.2, 0.7, 0.4, -0.1], "metadata": "ドキュメント 2"}
'ダッシュボード
POST my-vector-index/_bulk
{"index": {}}
{"vector_field": [0.1, 0.5, -0.3, 0.8], "metadata": "ドキュメント 1"}
{"index": {}}
{"vector_field": [-0.2, 0.7, 0.4, -0.1], "metadata": "ドキュメント 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
}
}
}
}