数据索引是OSS对外提供的文件(Object)元数据索引能力。您可以利用Object的元数据自定义索引的条件,从而快速获取Object列表。数据索引可以帮助您更好地管理与了解数据结构,方便您后续查询、统计和管理Object。

使用场景

基于数据审计或者数据监管等原因,您可能需要从存放于OSS存储空间(Bucket)内多达上亿的海量Object中查找符合特定条件的Object。Object本身包含大量的元数据,例如Object名称、Object ETag、Object存储类型、Object大小、Object标签、Object最后修改时间等。通过元数据索引功能,您可以在查找目标Object时结合具体的业务场景,通过组合简单查询条件以及聚合操作,提升查找目标Object的效率。

注意事项

  • 支持地域

    仅华东1(杭州)以及澳大利亚(悉尼)地域支持使用数据索引功能。

  • 费用说明

    开启元数据管理会产生一定的费用,但公测期间暂不收费。关于数据索引计费项的更多信息,请参见数据索引费用

  • 建立索引所需时间

    开启元数据管理功能时,建立索引所需时间与Bucket内存量文件数量成正比。文件数量越多,建立索引的时间越长。

  • 分片上传

    对于通过分片上传生成的Object,则查询结果中只显示已通过CompleteMultipartUpload操作将碎片(Part)合成的完整Object,不显示已初始化但未完成(Complete)或者未中止(Abort)的碎片。

使用OSS控制台

  1. 登录OSS管理控制台
  2. 单击Bucket列表,然后单击目标Bucket名称。
  3. 在左侧导航栏, 选择文件管理 > 数据索引
  4. 数据索引页面,打开元数据管理开关。
    开启元数据管理需要等待一定的时间,具体等待时长取决于Bucket中Object的数量。
  5. 设置Object基础过滤条件。
    Object基础过滤条件区域,按需设置以下基础过滤条件。
    过滤条件 说明
    存储类型 默认选中OSS支持的四种存储类型,即标准存储、低频访问存储、归档存储以及冷归档存储。您可以按需选择希望在查询结果中显示的Object存储类型。
    读写权限 默认选中OSS支持的四种读写权限ACL,即继承Bucket、私有、公共读以及公共读写。您可以按需选择希望在查询结果中显示的Object读写权限。
    文件名 支持模糊匹配等于。如果您希望在查询结果中显示某个文件名,例如exampleobject.txt。您可以通过以下两种方式匹配目标文件:
    • 选择等于,然后输入完整的文件名称exampleobject.txt
    • 选择模糊匹配,然后输入文件前缀或者后缀,例如example或者.txt
      重要 模糊匹配可命中Object名称的任意字符,例如输入test,则查询结果中将显示localfolder/test/.example.jpglocalfolder/test.jpg等。
    上传类型 默认选中OSS支持的四种Object类型,您可以按需选择希望在查询结果中显示的Object类型。Object类型说明如下:
    • Normal:通过简单上传方式生成的Object。
    • Multipart:通过分片上传方式生成的Object。
    • Appendable:通过追加上传方式生成的Object。
    • Symlink:为快速访问Object创建的软链接。
    最后修改时间 指定Object被最后修改的起始日期结束日期,时间精确到秒。
    文件大小 支持等于大于大于等于小于小于等于五种筛选条件,文件大小单位为KB。
    对象版本 仅支持查询当前版本Object。
  6. 可选:设置Object其他过滤条件。
    如果您需要对查询结果中的Object进行排序或者使用标签过滤等,请单击展开更多过滤条件
    • 设置Object排序方式。

      对象排序方式区域,结合最后修改时间文件名文件大小的筛选条件,选择查询结果中Object按照这三种筛选条件进行升序降序排列。

    • 设置Object标签过滤条件。

      对象标签过滤区域,输入您希望在查询结果中显示的Object对应的ETag或标签信息。

      • ETag仅支持精确匹配。可输入多个ETag,每行一个。
      • 以键值对(Key-Value)的形式指定对象标签。对象标签的Key和Value均区分大小写。关于标签规则的更多信息,请参见对象标签
    • 设置Object数据聚合方式。

      如果您希望在查询结果中对数据进行分类统计,例如统计所有文件大小、去重统计文件存储类型等,请添加数据聚合方式。

使用阿里云SDK

仅Python SDK以及Go SDK支持通过数据索引功能查询满足指定条件的Object。使用数据索引功能前,您需要为指定Bucket开启元数据管理功能。关于数据索引的代码示例,请参见SDK简介

# -*- coding: utf-8 -*-
import oss2
from oss2.models import MetaQuery, AggregationsRequest
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')

# Endpoint以杭州为例,其它Region请按实际情况填写。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 查询满足指定条件的Object,并按照指定字段和排序方式列举Object信息。
# 指定查询小于1 MB的文件,且最多返回十个结果,返回结果按升序排列。
do_meta_query_request = MetaQuery(max_results=10, query='{"Field": "Size","Value": "1048576","Operation": "lt"}', sort='Size', order='asc')
result = bucket.do_bucket_meta_query(do_meta_query_request)

# 打印Object名称。
print(result.files[0].file_name)
# 打印Object对应的ETag。
print(result.files[0].etag)
# 打印Object类型。
print(result.files[0].oss_object_type)
# 打印Object存储类型。
print(result.files[0].oss_storage_class)
# 打印Object的64位CRC值。
print(result.files[0].oss_crc64)
# 打印Object的访问权限。
print(result.files[0].object_acl)
package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)
func main()  {
    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    // 查询满足指定条件的Object,并按照指定字段和排序方式列举Object信息。
    // 指定查询大于30字节的文件,且最多返回十个结果,返回结果按升序排列。
    query := oss.MetaQuery{
        NextToken: "",
        MaxResults: 10,
        Query: `{"Field": "Size","Value": "30","Operation": "gt"}`,
        Sort: "Size",
        Order: "asc",
    }
    // 填写存储空间名称,例如examplebucket。
    result,err := client.DoMetaQuery("examplebucket",query)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    fmt.Printf("NextToken:%s\n", result.NextToken)
    for _, file := range result.Files {
        fmt.Printf("File name: %s\n", file.Filename)
        fmt.Printf("size: %d\n", file.Size)
        fmt.Printf("File Modified Time:%s\n", file.FileModifiedTime)
        fmt.Printf("Oss Object Type:%s\n", file.OssObjectType)
        fmt.Printf("Oss Storage Class:%s\n", file.OssStorageClass)
        fmt.Printf("Object ACL:%s\n", file.ObjectACL)
        fmt.Printf("ETag:%s\n", file.ETag)
        fmt.Printf("Oss CRC64:%s\n", file.OssCRC64)
        fmt.Printf("Oss Tagging Count:%d\n", file.OssTaggingCount)
        for _, tagging := range  file.OssTagging {
            fmt.Printf("Oss Tagging Key:%s\n", tagging.Key)
            fmt.Printf("Oss Tagging Value:%s\n", tagging.Value)
        }
        for _, userMeta := range  file.OssUserMeta {
            fmt.Printf("Oss User Meta Key:%s\n", userMeta.Key)
            fmt.Printf("Oss User Meta Key Value:%s\n", userMeta.Value)
        }
    }
}

常见问题

Bucket内文件数量达到上亿级别时,为什么很长时间都没有成功建立数据索引?

1秒内大约可以为600个文件建立索引。您可以结合Bucket内的文件数量,预估建立索引所需时间。