Go数据索引

更新时间:2025-01-15 03:27:15

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

注意事项

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

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

示例代码

开启元数据管理功能

以下代码用于为指定Bucket开启元数据管理功能。开启后,OSS会为Bucket创建元数据索引库并为Bucket中的所有Object建立元数据索引。元数据索引库创建完成后,OSS会继续对Bucket中新增文件进行准实时的增量追踪扫描并为增量文件建立元数据索引。

package main

import (
	"context"
	"flag"   
	"log"     

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"          
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" 
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required") // 记录错误并终止程序
	}

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required") // 记录错误并终止程序
	}

	// 创建客户端配置,并使用环境变量作为凭证提供者
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端实例

	// 构建一个OpenMetaQuery请求,用于开启特定存储空间的元数据管理功能
	request := &oss.OpenMetaQueryRequest{
		Bucket: oss.Ptr(bucketName), // 指定要操作的存储空间名称
	}
	result, err := client.OpenMetaQuery(context.TODO(), request) // 执行请求以开启存储空间的元数据管理功能
	if err != nil {
		log.Fatalf("failed to open meta query %v", err) // 如果有错误发生,记录错误信息并终止程序
	}

	log.Printf("open meta query result:%#v\n", result) // 打印开启元数据管理的结果
}

获取元数据索引库信息

以下代码用于获取指定Bucket的元数据索引库信息。

package main

import (
	"context" 
	"flag"   
	"log"   

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required") // 记录错误并终止程序
	}

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required") // 记录错误并终止程序
	}

	// 创建客户端配置,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) //创建一个新的OSS客户端实例

	// 构建一个GetMetaQueryStatus请求,用于获取特定存储空间的元数据索引库信息
	request := &oss.GetMetaQueryStatusRequest{
		Bucket: oss.Ptr(bucketName), // 指定要查询的存储空间名称
	}
	result, err := client.GetMetaQueryStatus(context.TODO(), request) // 执行请求以获取存储空间的元数据索引库信息
	if err != nil {
		log.Fatalf("failed to get meta query status %v", err) // 如果有错误发生,记录错误信息并终止程序
	}

	log.Printf("get meta query status result:%#v\n", result)
}

查询满足指定条件的Object

以下代码通过标量检索功能查询满足指定条件Object,并按照指定字段和排序方式列出Object信息。

package main

import (
	"context"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region,默认为空字符串
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称,默认为空字符串
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 创建客户端配置,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端实例

	// 构建一个DoMetaQuery请求,用于执行元数据查询满足指定条件Object
	request := &oss.DoMetaQueryRequest{
		Bucket: oss.Ptr(bucketName), // 指定要查询的存储空间名称
		MetaQuery: &oss.MetaQuery{
			Query: oss.Ptr(`{"Field": "Size","Value": "1048576","Operation": "gt"}`), // 查询条件:大小大于1MB的对象
			Sort:  oss.Ptr("Size"),                                                   // 排序字段:按对象大小排序
			Order: oss.MetaQueryOrderAsc,                                             // 排序顺序:升序
		},
	}
	result, err := client.DoMetaQuery(context.TODO(), request) // 发送请求以执行元数据查询
	if err != nil {
		log.Fatalf("failed to do meta query %v", err)
	}

	// 打印NextToken,用于分页查询下一页的数据
	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)
		if file.OSSTaggingCount != nil {
			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的元数据管理功能。

package main

import (
	"context"
	"flag"    
	"log"    

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"          
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" 
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}


func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required") // 记录错误并终止程序
	}

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required") // 记录错误并终止程序
	}

	// 创建客户端配置,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 创建一个新的OSS客户端实例

	// 构建一个CloseMetaQuery请求,用于关闭特定存储空间的元数据管理功能
	request := &oss.CloseMetaQueryRequest{
		Bucket: oss.Ptr(bucketName), // 指定要操作的存储空间名称
	}
	result, err := client.CloseMetaQuery(context.TODO(), request) // 执行请求以关闭存储空间的元数据管理功能
	if err != nil {
		log.Fatalf("failed to close meta query %v", err) // 如果有错误发生,记录错误信息并终止程序
	}

	log.Printf("close meta query result:%#v\n", result)
}

相关文档

  • 关于开启元数据管理的API接口,请参见OpenMetaQuery.

  • 关于获取元数据索引库信息的API接口,请参见GetMetaQueryStatus

  • 关于查询满足指定条件的Object,并按照指定字段和排序方式列出Object信息的API接口说明,请参见DoMetaQuery

  • 关于关闭元数据管理功能的API接口,请参见CloseMetaQuery

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

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等