すべてのプロダクト
Search
ドキュメントセンター

:画像検索入門

最終更新日:Jan 13, 2025

前提条件

  1. Alibaba Cloudアカウントが作成され、本人確認が完了している。

  2. Alibaba Cloudアカウントを作成して初めてコンソールにログオンすると、後続の操作を実行する前にAccessKeyペアを作成するように求められます。

    1. OpenSearchアプリケーションを作成して使用するときにAccessKeyペアが必要になるため、Alibaba CloudアカウントにAccessKeyペアを指定する必要があります。

    2. Alibaba CloudアカウントのAccessKeyペアを作成した後、RAMユーザーのAccessKeyペアを作成できます。 これにより、RAMユーザーとしてアプリケーションにアクセスできます。 RAMユーザーに権限を付与する方法の詳細については、RAM認証を参照してください。 注:RAMユーザーには、OpenSearchベクトル検索版インスタンスにアクセスするためのAliyunSearchEngineFullAccessおよびAliyunSearchEngineReadOnlyAccess権限が付与されている必要があります。

  1. 仮想プライベートクラウド(VPC)が作成されます。 VPCの詳細については、VPCとはを参照してください。

インスタンスの購入

  1. OpenSearchコンソールにログオンします。 左上隅で、OpenSearchベクトル検索版に切り替えます。image..png

  2. 左側のナビゲーションペインで、[インスタンス管理]をクリックします。 [インスタンス管理]ページで、インスタンスの作成をクリックします。image..png

  3. 購入ページで、サービスエディションとしてベクトル検索版を選択し、インスタンスのリージョンとゾーン、クエリノード数量クエリノードタイプデータノード数量データノードタイプ単一検索ワーカーの合計ストレージ容量VPCvSwitchパラメーターを設定します。 次に、ユーザー名とパスワードを指定し、今すぐ購入をクリックします。 ユーザー名とパスワードは、クエリでの権限検証に使用されます。 Alibaba Cloudアカウントとパスワードをユーザー名とパスワードとして指定しないでください。

説明
  • ビジネス要件に基づいて、購入するクエリ結果検索(QRS)ワーカーと検索ワーカーの数と仕様を指定します。 仕様を指定すると、実際の料金が購入ページに自動的に表示されます。

  • OpenSearchベクトル検索版インスタンスへのアクセスに使用するElastic Compute Service(ECS)インスタンスと同じVPCとvSwitchを指定する必要があります。 そうしないと、OpenSearchベクトル検索版インスタンスにアクセスすると、エラー{'errors':{'code':'403','message':'Forbidden'}}が返されます。

  • 各検索ワーカーには、無料のストレージ容量クォータが提供されます。 クォータは50 GB単位で増やすことができます。 合計ストレージ容量が無料クォータを超える場合、超過したストレージ容量に対して課金されます。

  1. 注文の確認ページで、設定とサービス契約を確認し、今すぐアクティブ化をクリックします。image..png

  2. インスタンスを購入した後、コンソールをクリックします。 インスタンス管理ページで、購入したインスタンスを表示できます。

  3. デフォルトでは、インスタンスの名前は自動的に設定されます。 インスタンスの名前を変更するには、[アクション]列の管理をクリックして、インスタンスの詳細ページに移動します。image..png

[変更]アイコンをクリックし、プロンプトに従ってインスタンス名を変更し、確認をクリックします。image..png

クラスターの構成

購入したインスタンスの詳細ページで、インスタンスが[構成保留中]状態であり、インスタンスに空のクラスターが自動的にデプロイされていることを確認できます。 クラスター内のQRSワーカーと検索ワーカーの数と仕様は、インスタンスの購入時に指定したものです。 検索サービスを使用する前に、クラスターのデータソースとインデックススキーマを構成し、インデックスを再構築する必要があります。 image..png

  1. データソースを構成します。 MaxComputeデータソースまたはAPIデータソースからのデータがサポートされています。 この例では、MaxComputeデータソースを使用します。 クラスターのMaxComputeデータソースを構成するには、次の操作を実行します。[データソースの構成]ステップで、[データソースの追加]をクリックします。 [データソースの追加]パネルで、[データソースタイプ]として[MaxCompute]を選択します。 プロジェクト、AccessKey ID、AccessKeyシークレット、テーブル、パーティションキーパラメーターを構成します。 ビジネス要件に基づいて、自動再インデックス化に[はい]または[いいえ]を選択します。image..png

検証に合格したら、[OK]をクリックしてデータソースを追加します。

  1. データソースを構成した後、次へをクリックしてインデックススキーマを構成します。image..png

2.1. [インデックステーブルの作成]をクリックします。image..png

2.2. インデックステーブルを構成します。 [テンプレートの選択]セクションで、[ベクトル:画像検索]を選択し、[データ]パラメーターを[ベクトルデータあり]に設定します。image..png

  • インデックステーブル:カスタム名を入力します。

  • データソース:手順1で構成したデータソースを選択します。

  • データシャード:購入した検索ワーカーの数以下の値を入力します。

説明

生データをベクトルに変換する方法の詳細については、画像検索のソリューションを参照してください。

2.3. フィールドを構成します。 デフォルトでは、ベクトル:画像検索テンプレートに、主キーフィールド、ベクトルフィールド、カテゴリフィールド、ベクトルベースの画像を格納するフィールドの4つのプリセットフィールドが生成されます。 MaxComputeデータソースを構成すると、データソースから同期されたフィールドがプリセットフィールドの下に表示されます。image..png

属性フィールドとフィールドデータを圧縮するかどうかを指定します

  • 属性フィールド:デフォルトでは、属性フィールドは圧縮されません。 属性フィールドにfile_compressorが選択されている場合、属性フィールドは圧縮されます。

  • フィールドデータ:デフォルトでは、フィールドデータは圧縮されません。 複数値フィールドまたはSTRINGタイプのフィールドの場合、デフォルトでuniqが選択されます。 単一値フィールドの場合、デフォルトでequalが選択されます。

説明
  • ベクトルインデックスを構成する場合は、主キーフィールド、カテゴリフィールド、ベクトルフィールドの順にフィールドを指定する必要があります。 カテゴリフィールドはオプションです。 前の図は例を示しています。

  • データソースがMaxComputeデータソースの場合、データソースから同期されたフィールドがプリセットフィールドの下に表示されます。

  • 主キーフィールドは圧縮できません。

  • 属性フィールドとフィールドデータが圧縮されている場合、ストレージ容量は節約されますが、クエリのパフォーマンスが低下する可能性があります。 詳細については、関連ドキュメントを参照してください。

3. インデックスを構成します。 デフォルトでは、ベクトル:画像検索テンプレートに、主キーインデックスとベクトルインデックスの2つのプリセットインデックスが生成されます。 プリセットインデックスのインデックスフィールドを変更できます。image..png

インデックスフィールドを圧縮するかどうかを指定します

  • デフォルトでは、インデックスフィールドは圧縮されません。 インデックスフィールドにfile_compressorが選択されている場合、インデックスフィールドは圧縮されます。

説明
  • 主キーインデックスは圧縮できません。

  • インデックスが圧縮されている場合、ストレージ容量は節約されますが、クエリのパフォーマンスが低下する可能性があります。 詳細については、関連ドキュメントを参照してください。

3.1. ベクトルインデックスに含まれるフィールドを指定します。

image..png

説明
  • 主キーフィールドとベクトルフィールドは必須です。 カテゴリフィールドはオプションであり、空のままにすることができます。

  • 3つの固定フィールドのみを選択でき、新しいフィールドを追加することはできません。

3.2. 詳細設定の構成。 ベクトルインデックスのパラメーターを構成する必要があります。 次の図は例を示しています。 詳細については、ベクトルインデックスを参照してください。image..png

次の図は、さらに多くのパラメーターを示しています。image..png

次のサンプルコードは、build_index_paramsパラメーターを構成する方法の例を示しています。

{
  "proxima.qc.builder.quantizer_class": "Int8QuantizerConverter",
  "proxima.qc.builder.quantize_by_centroid": true,
  "proxima.qc.builder.optimizer_class": "BruteForceBuilder",
  // スレッド数
  "proxima.qc.builder.thread_count": 10,
  "proxima.qc.builder.optimizer_params": {
    "proxima.linear.builder.column_major_order": true
  },
  "proxima.qc.builder.store_original_features": false,
  // 学習サンプル数
  "proxima.qc.builder.train_sample_count": 3000000,
  // 学習サンプル比率
  "proxima.qc.builder.train_sample_ratio": 0.5
}

次のサンプルコードは、search_index_paramsパラメーターを構成する方法の例を示しています。

{
  "proxima.qc.searcher.scan_ratio": 0.01
}
説明

システムはベクトルインデックスのパラメーターを自動的に構成します。 特定の要件がない場合は、[OK]をクリックして構成を完了します。

  1. 構成が完了したら、[バージョンの保存]をクリックします。 表示されるダイアログボックスで、説明を入力し、公開をクリックします。 説明はオプションです。image..png

インデックスが公開されたら、[次へ]をクリックしてインデックスを再構築します。image..png

  1. インデックスを再構築します。 インデックスの再構築要件に基づいてパラメーターを構成し、[次へ]をクリックします。

  • APIデータソースimage..png

  • MaxComputeデータソースimage..png

  1. 左側のナビゲーションペインで、[O&Mセンター] > [変更履歴]を選択し、[データソースの変更]タブをクリックします。 [データソースの変更]タブで、再インデックスの進行状況を確認できます。 再インデックスが完了したら、クエリテストを実行できます。image..png

  2. クエリテストページでテストを実行します。image..png

構文

  • 通常のクエリの構文

HA3構文

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6...'
// 注:index_nameパラメーターは、ベクトルインデックスの名前を指定します。 コロン(:)の後にクエリするベクトルを指定します。

SQL構文

query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731"]]
// 注:index_nameパラメーターは、ベクトルインデックスの名前を指定します。 kvpair句のdynamic_paramsパラメーターは、クエリするベクトルを指定します。

  • 上位n個のベクトルのクエリの構文

HA3構文

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6&n=10'
// 注:index_nameパラメーターは、ベクトルインデックスの名前を指定します。 コロン(:)の後とアンパサンド(&)の前にクエリするベクトルを指定します。 nパラメーターは、返される上位n個のベクトルを指定します。

SQL構文

query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731&n=10"]]
// 注:index_nameパラメーターは、ベクトルインデックスの名前を指定します。 kvpair句のdynamic_paramsパラメーターは、クエリするベクトルを指定します。 nパラメーターは、返される上位n個のベクトルを指定します。

  • 特定のしきい値を含むクエリの構文

HA3構文

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6&n=10&sf=0.8'
// 注:index_nameパラメーターは、ベクトルインデックスの名前を指定します。 コロン(:)の後と最初のアンパサンド(&)の前にクエリするベクトルを指定します。 sfパラメーターは、システムがドキュメントをフィルタリングする基準となるしきい値を指定します。

SQL構文

query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731&n=10&sf=0.8"]]
// 注:index_nameパラメーターは、ベクトルインデックスの名前を指定します。 kvpair句のdynamic_paramsパラメーターは、クエリするベクトルを指定します。 sfパラメーターは、システムがドキュメントをフィルタリングする基準となるしきい値を指定します。

  • 検索パラメーターを含むクエリの構文

HA3構文

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6&n=10&sf=0.8&search_params={"proxima.qc.searcher.scan_ratio":0.001,"proxima.general.searcher.scan_count":10000}'
// 注:search_paramsパラメーターは、ベクトル検索用に構成するパラメーターを指定します。 値はJSON形式である必要があります。 proxima.qc.searcher.scan_ratioパラメーターの詳細については、「ベクトルインデックス」トピックの「パラメーターの説明」セクションを参照してください。 proxima.general.searcher.scan_countパラメーターは、min_scan_doc_cntパラメーターと同等です。
// 注:n、sf、およびsearch_paramsパラメーターの順序は変更できません。

SQL構文

query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731&n=10&sf=0.8&search_params={"proxima.qc.searcher.scan_ratio":0.001,"proxima.general.searcher.scan_count":10000}"]]

// 注:index_nameパラメーターは、ベクトルインデックスの名前を指定します。 kvpair句のdynamic_paramsパラメーターは、クエリするベクトルを指定します。 search_paramsパラメーターは、ベクトル検索用に構成するパラメーターを指定します。 値はJSON形式である必要があります。 proxima.qc.searcher.scan_ratioパラメーターの詳細については、「ベクトルインデックス」トピックの「パラメーターの説明」セクションを参照してください。 proxima.general.searcher.scan_countパラメーターは、min_scan_doc_cntパラメーターと同等です。
// 注:n、sf、およびsearch_paramsパラメーターの順序は変更できません。

説明

ベクトルインデックスにカテゴリフィールドが構成されている場合、クエリ構文にカテゴリフィールドを含める必要があります。 そうしないと、データを取得できません。 例:

query=select proxima_score('vector_index_name') as score, cate_id from table_name where MATCHINDEX('vector_index_name', ?) &&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;trace:INFO;formatType:json;dynamic_params:[["168#0.01747940666973591,-0.03125246614217758,-0.03254068270325661..."]]

dynamic_paramsパラメーターでは、168はカテゴリフィールドの値を示します。 カテゴリフィールドの値と値の後のコンテンツを番号記号(#)で区切ります。

SDKを使用してベクトルベースの検索を実行する

次の依存関係を追加します。

pip install alibabacloud-ha3engine

検索デモ:

from alibabacloud_ha3engine import models, client
from alibabacloud_tea_util import models as util_models
from Tea.exceptions import TeaException, RetryError

def search():
    Config = models.Config(
        endpoint="",
        instance_id="",
        protocol="http",
        access_user_name="",
        access_pass_word=""
    )

    # リクエストに時間がかかる場合は、このパラメーターを構成して、リクエスト前の待機時間を増やすことができます。 単位:ミリ秒。
    # このパラメーターは、search_with_optionsメソッドで使用できます。
    runtime = util_models.RuntimeOptions(
        connect_timeout=5000,
        read_timeout=10000,
        autoretry=False,
        ignore_ssl=False,
        max_idle_conns=50
    )
    # OpenSearchベクトル検索版クライアントを初期化します。
    ha3EngineClient = client.Client(Config)
    optionsHeaders = {}
    try:
        # 例3:OpenSearchベクトル検索版でSQLクエリ文字列を使用してデータをクエリします。
        # =====================================================
        sql_str = '''query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731&n=10"]]'''
        sqlsearchQuery = models.SearchQuery(sql=sql_str)
        sqlSearchRequestModel = models.SearchRequestModel(optionsHeaders, sqlsearchQuery)
        sqlstrSearchResponseModel = ha3EngineClient.search(sqlSearchRequestModel)
        print(sqlstrSearchResponseModel)

    except TeaException as e:
        print(f"send request with TeaException : {e}")
    except RetryError as e:
        print(f"send request with Connection Exception  : {e}")


if(__name__  == "__main__"):
    search()