Python数据索引

更新时间:2025-03-07 06:14:56

如果您希望从Bucket存储的海量Object中快速查找与指定的Object名称、ETag、存储类型、大小、最后修改时间等条件匹配的Object,您可以使用数据索引功能。通过数据索引功能,您可以在查找目标Object时指定过滤条件,对查询结果按需选择排序和聚合的方式,提升查找目标Object的效率。

注意事项

  • 本文示例代码以华东1(杭州)的地域IDcn-hangzhou为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的RegionEndpoint的对应关系,请参见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

  • 本页导读 (1)
  • 注意事项
  • 示例代码
  • 开启元数据管理功能
  • 获取元数据索引库信息
  • 查询满足指定条件的Object
  • 关闭元数据管理功能
  • 相关文档