全部產品
Search
文件中心

Object Storage Service:向量索引(Python SDK V2)

更新時間:Aug 01, 2025

通過OSS向量檢索,您可以基於語義內容、OSS中繼資料、多媒體中繼資料、對象ETag及標籤和自訂中繼資料等條件,快速定位海量Object中的目標檔案,最佳化檢索效率。本文介紹如何使用Python SDK V2進行向量檢索。

注意事項

  • 本文範例程式碼以華東1(杭州)的地區IDcn-hangzhou為例,預設使用外網Endpoint,如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱

  • 本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證

範例程式碼

開啟向量檢索功能

以下代碼用於為指定Bucket開啟向量檢索功能。

import argparse
import alibabacloud_oss_v2 as oss

# 建立命令列參數解析器,並添加描述資訊
parser = argparse.ArgumentParser(description="open meta query sample")
# 添加必需的命令列參數 --region,用於指定儲存空間所在的地區
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# 添加必需的命令列參數 --bucket,用於指定要操作的儲存空間名稱
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 添加可選的命令列參數 --endpoint,用於指定訪問OSS時使用的網域名稱
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

def main():
    # 解析命令列參數
    args = parser.parse_args()

    # 從環境變數中載入認證資訊
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK提供的預設配置
    cfg = oss.config.load_default()
    # 設定認證資訊提供者
    cfg.credentials_provider = credentials_provider
    # 根據命令列參數設定地區
    cfg.region = args.region
    # 如果提供了endpoint,則更新配置中的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 建立OSS用戶端
    client = oss.Client(cfg)

    # 構建一個OpenMetaQuery請求,,用於開啟儲存空間的向量檢索功能
    result = client.open_meta_query(oss.OpenMetaQueryRequest(
            bucket=args.bucket,
            mode='semantic',# 設定為"semantic",表示選擇向量檢索
    ))

    # 列印請求的結果狀態代碼和請求ID
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          )

# 當作為主程式運行時調用main函數
if __name__ == "__main__":
    main()

擷取中繼資料索引庫資訊

以下代碼用於擷取指定Bucket的中繼資料索引庫資訊。

import argparse
import alibabacloud_oss_v2 as oss

# 建立一個命令列參數解析器,並添加必要的參數
parser = argparse.ArgumentParser(description="get meta query status sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

def main():
    # 解析命令列參數
    args = parser.parse_args()

    # 從環境變數中載入憑據資訊
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK的預設配置
    cfg = oss.config.load_default()
    # 設定憑據提供者為從環境變數擷取的憑據
    cfg.credentials_provider = credentials_provider
    # 設定OSS服務所在的地區
    cfg.region = args.region
    # 如果提供了endpoint,則設定自訂的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 建立OSS用戶端
    client = oss.Client(cfg)

    # 調用get_meta_query_status方法來擷取指定儲存空間的中繼資料索引庫資訊
    result = client.get_meta_query_status(oss.GetMetaQueryStatusRequest(
            bucket=args.bucket,
    ))

    # 列印返回結果中的相關資訊
    print(f'status code: {result.status_code},'
            f' request id: {result.request_id},'
            f' create time: {result.meta_query_status.create_time},'
            f' update time: {result.meta_query_status.update_time},'
            f' state: {result.meta_query_status.state},'
            f' phase: {result.meta_query_status.phase},'
    )

# 當指令碼被直接運行時,調用main函數
if __name__ == "__main__":
    main()

查詢滿足指定條件的Object

以下代碼通過向量檢索功能查詢滿足指定語義檢索內容的Object。

import argparse
import alibabacloud_oss_v2 as oss

# 建立命令列參數解析器,用於處理命令列輸入
parser = argparse.ArgumentParser(description="do meta query semantic sample")
# 添加必要的命令列參數
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)  # 儲存空間所在地區
parser.add_argument('--bucket', help='The name of the bucket.', required=True)  # 儲存空間名稱
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')  # OSS訪問網域名稱,可選

def main():
    # 解析命令列參數
    args = parser.parse_args()

    # 從環境變數中載入訪問憑證
    # 運行前需要設定環境變數:OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 載入SDK預設配置
    cfg = oss.config.load_default()
    # 設定憑證提供者
    cfg.credentials_provider = credentials_provider
    # 設定地區
    cfg.region = args.region
    # 如果提供了endpoint,則更新配置中的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 建立OSS用戶端執行個體
    client = oss.Client(cfg)

    # 發起中繼資料查詢請求 - 向量檢索模式
    result = client.do_meta_query(oss.DoMetaQueryRequest(
            bucket=args.bucket,
            mode='semantic',
            meta_query=oss.MetaQuery(
                max_results=1000,
                query='俯瞰白雪覆蓋的森林',
                order='desc',
                media_types=oss.MetaQueryMediaTypes(
                    media_type=['image']
                ),
                simple_query='{"Operation":"gt", "Field": "Size", "Value": "30"}',
            ),
    ))

    # 列印檢索結果
    print(vars(result))

if __name__ == "__main__":
    main()

關閉向量檢索功能

以下代碼用於關閉指定Bucket的向量檢索功能。

import argparse
import alibabacloud_oss_v2 as oss

# 建立一個命令列參數解析器,用於處理命令列參數
parser = argparse.ArgumentParser(description="close meta query sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

def main():
    # 解析命令列參數
    args = parser.parse_args()

    # 從環境變數中載入憑據資訊
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK的預設配置
    cfg = oss.config.load_default()
    # 設定憑據提供者為從環境變數擷取的憑據
    cfg.credentials_provider = credentials_provider
    # 設定配置中的地區資訊
    cfg.region = args.region
    # 如果提供了endpoint,則設定配置中的endpoint
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 建立OSS用戶端
    client = oss.Client(cfg)

    # 調用close_meta_query方法關閉儲存空間的檢索功能
    result = client.close_meta_query(oss.CloseMetaQueryRequest(
            bucket=args.bucket,
    ))

    # 列印響應的狀態代碼和請求ID
    print(f'status code: {result.status_code}, request id: {result.request_id}')

# 當此指令碼直接運行時執行main函數
if __name__ == "__main__":
    main()

相關文檔