全部產品
Search
文件中心

Object Storage Service:標量檢索(Python SDK V2)

更新時間:Aug 01, 2025

標量檢索是OSS提供的基於Object中繼資料的索引功能,允許您自訂條件,快速篩選並擷取Object列表。可以協助您更好地管理與瞭解資料結構,方便您後續查詢、統計和管理Object。

注意事項

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

範例程式碼

開啟中繼資料管理功能

以下代碼用於為指定Bucket開啟中繼資料管理功能。開啟後,OSS會為Bucket建立中繼資料索引庫並為Bucket中的所有Object建立中繼資料索引。中繼資料索引庫建立完成後,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)

    # 發起開啟元查詢請求
    result = client.open_meta_query(oss.OpenMetaQueryRequest(
            bucket=args.bucket,
    ))

    # 列印請求的結果狀態代碼和請求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,
    ))

    # 列印返回結果中的相關資訊,包括狀態代碼、請求ID、建立時間、更新時間、狀態和階段
    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,並按照指定欄位和排序方式列出Object資訊。

import argparse
import alibabacloud_oss_v2 as oss

# 建立一個命令列參數解析器,用於接收使用者輸入的參數
parser = argparse.ArgumentParser(description="do 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)

    # 執行中繼資料查詢操作
    result = client.do_meta_query(oss.DoMetaQueryRequest(
            bucket=args.bucket,  # 指定要查詢的儲存空間
            meta_query=oss.MetaQuery(  # 定義查詢的具體內容
                aggregations=oss.MetaQueryAggregations(  # 定義彙總操作
                    aggregations=[  # 彙總列表
                        oss.MetaQueryAggregation(  # 第一個彙總:計算總大小
                            field='Size',
                            operation='sum',
                        ),
                        oss.MetaQueryAggregation(  # 第二個彙總:找出最大值
                            field='Size',
                            operation='max',
                        )
                    ],
                ),
                next_token='',  # 分頁標記
                max_results=80369,  # 返回的最大結果數
                query='{"Field": "Size","Value": "1048576","Operation": "gt"}',  # 查詢條件
                sort='Size',  # 排序欄位
                order=oss.MetaQueryOrderType.DESC,  # 排序方式
            ),
    ))

    # 輸出查詢結果的基本資料
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          # 下面這些注釋掉的部分可以根據需要開啟來擷取更詳細的資訊
          # f' files: {result.files},'
          # f' file: {result.files.file},'
          # f' file modified time: {result.files.file.file_modified_time},'
          # f' etag: {result.files.file.etag},'
          # f' server side encryption: {result.files.file.server_side_encryption},'
          # f' oss tagging count: {result.files.file.oss_tagging_count},'
          # f' oss tagging: {result.files.file.oss_tagging},'
          # f' key: {result.files.file.oss_tagging.taggings[0].key},'
          # f' value: {result.files.file.oss_tagging.taggings[0].value},'
          # f' key: {result.files.file.oss_tagging.taggings[1].key},'
          # f' value: {result.files.file.oss_tagging.taggings[1].value},'
          # f' oss user meta: {result.files.file.oss_user_meta},'
          # f' key: {result.files.file.oss_user_meta.user_metas[0].key},'
          # f' value: {result.files.file.oss_user_meta.user_metas[0].value},'
          # f' key: {result.files.file.oss_user_meta.user_metas[1].key},'
          # f' value: {result.files.file.oss_user_meta.user_metas[1].value},'
          # f' filename: {result.files.file.filename},'
          # f' size: {result.files.file.size},'
          # f' oss object type: {result.files.file.oss_object_type},'
          # f' oss storage class: {result.files.file.oss_storage_class},'
          # f' object acl: {result.files.file.object_acl},'
          # f' oss crc64: {result.files.file.oss_crc64},'
          # f' server side encryption customer algorithm: {result.files.file.server_side_encryption_customer_algorithm},'
          # f' aggregations: {result.aggregations},'
          f' field: {result.aggregations.aggregations[0].field},'
          f' operation: {result.aggregations.aggregations[0].operation},'
          f' field: {result.aggregations.aggregations[1].field},'
          f' operation: {result.aggregations.aggregations[1].operation},'
          f' next token: {result.next_token},'
    )

    # 如果存在檔案資訊,則列印標籤和使用者自訂中繼資料
    if result.files:
        if result.files.file.oss_tagging.taggings:
            for r in result.files.file.oss_tagging.taggings:
                print(f'result: key: {r.key}, value: {r.value}')
        if result.files.file.oss_user_meta.user_metas:
            for r in result.files.file.oss_user_meta.user_metas:
                print(f'result: key: {r.key}, value: {r.value}')
    # 列印所有彙總的結果
    if result.aggregations.aggregations:
        for r in result.aggregations.aggregations:
            print(f'result: field: {r.field}, operation: {r.operation}')

if __name__ == "__main__":
    main()

關閉中繼資料管理功能

以下代碼用於關閉指定Bucket的中繼資料管理功能。

import argparse
import alibabacloud_oss_v2 as oss

# 建立一個ArgumentParser對象,用於處理命令列參數
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()

相關文檔

  • 關於開啟中繼資料管理的完整範例程式碼,請參見open_meta_query.py

  • 關於擷取中繼資料索引庫資訊的完整範例程式碼,請參見get_meta_query_status.py

  • 關於查詢滿足指定條件的Object,並按照指定欄位和排序方式列出Object資訊的完整範例程式碼,請參見do_meta_query.py

  • 關於關閉中繼資料管理功能的完整範例程式碼,請參見close_meta_query.py