標量檢索是OSS提供的基於Object中繼資料的索引功能,允許您自訂條件,快速篩選並擷取Object列表。可以協助您更好地管理與瞭解資料結構,方便您後續查詢、統計和管理Object。
使用情境
資料審計情境
通過標量檢索,您可以快速定位檔案,以滿足資料審計或監管需求。例如,在金融服務行業,您可以通過自訂標籤、存取權限等中繼資料進行篩選,從而找到具有特定敏感性層級或特定許可權的檔案,以提升資料審計的效率。
企業備份與歸檔情境
企業在進行資料備份和歸檔時,可以利用標量檢索,例如根據檔案的建立時間、儲存類型或自訂標籤等中繼資料,迅速檢索到特定日期或類型的檔案,從而快速恢複歷史資料或歸檔記錄。
注意事項
地區限制
華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北3(張家口)、華南1(深圳)、華南3(廣州)、西南1(成都)、中國香港、新加坡、印尼(雅加達)、德國(法蘭克福)、美國(維吉尼亞)、美國(矽谷)、英國(倫敦)地區的Bucket支援使用標量檢索功能。
Bucket限制
預設只支援為檔案數量在100億以下的Bucket開啟標量檢索功能。
費用說明
標量檢索目前是公測階段。使用標量檢索功能會產生Object的中繼資料管理費用以及檢索次數費用,但公測期間暫不收費。關於標量檢索計費項目的更多資訊,請參見資料索引費用。
除標量檢索計費項目外,使用標量檢索還會產生API請求費用,按照API調用次數收費。涉及的API請求如下:
行為
API
次數
為Bucket中的檔案構建索引
HeadObject
每個檔案調用1次
Bucket中檔案存在Tag
GetObjectTag
每個攜帶Tag的檔案調用1次
Bucket中存在軟連結檔案
GetSymlink
每個攜帶軟連結的檔案調用1次
掃描Bucket中的檔案
ListObjects
每掃描1000個檔案調用1次
關於OSS API的請求費用,請參見請求費用。
建立索引所需時間
開啟標量檢索功能時,建立索引所需時間與Bucket記憶體量的檔案數量成正比。檔案數量越多,建立索引的時間越長。 一般來說,1000萬個檔案初次建立索引的時間約為1小時,10億個檔案初次建立索引的時間約為1天,100億個檔案初次建立索引的時間約為2~3 天,該時間僅供參考。
分區上傳
對於通過分區上傳產生的Object,查詢結果中只顯示已通過CompleteMultipartUpload操作將片段(Part)合成的完整Object,不顯示已初始化但未完成(Complete)或者未中止(Abort)的片段。
操作步驟
使用OSS控制台
以尋找所有檔案大小小於500KB,最後更新時間在2024年9月11日0:00至2024年9月12日0:00的檔案,輸出結果按檔案大小升序排列,並按檔案大小統計最大值為例:
Bucket為廣州地區
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列, 選擇文件管理 > 數據索引。
在資料索引頁面,單擊立即開啟。
選擇標量檢索,單擊確認開啟。
說明開啟標量檢索需要等待一定的時間,具體等待時間長度取決於Bucket中Object的數量。
按以下說明設定OSS中繼資料檢索條件,其他參數保留預設設定。
將最後修改時間設定為2024年9月11日0:00至2024年9月12日0:00。
檔案大小設定為小於500KB。
設定輸出方式。
對象排序方式選擇按照檔案大小升序排列。
資料彙總選擇按照檔案大小的最大值彙總輸出。
單擊立即查詢。符合檢索條件的所有檔案共2個,如下圖所示,檔案最大為434KB。
如需瞭解完整的檢索條件和輸出設定,請參見檢索條件及輸出設定。
Bucket為杭州、上海、青島、北京、張家口、深圳、成都、中國香港、新加坡、雅加達、法蘭克福、維吉尼亞、矽谷、倫敦地區
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列, 選擇文件管理 > 數據索引。
開啟中繼資料管理。
說明開啟中繼資料管理需要等待一定的時間,具體等待時間長度取決於Bucket中Object的數量。
按以下說明設定對象基礎過濾條件,其他參數保留預設設定。
將最後修改時間設定為2024年9月11日0:00至2024年9月12日0:00。
檔案大小設定為小於500KB。
展開更多過濾條件。
對象排序方式選擇按照檔案大小升序排列。
資料彙總選擇按照檔案大小的最大值彙總輸出。
單擊查詢。符合檢索條件的所有檔案共2個,如下圖所示,檔案最大為434KB。
如需瞭解完整的檢索條件和輸出設定,請參見檢索條件及輸出設定。
使用阿里雲SDK
僅Java SDK、Python SDK以及Go SDK支援通過標量檢索功能查詢滿足指定條件的Object。使用標量檢索功能前,您需要為指定Bucket開啟中繼資料管理功能。關於標量檢索的程式碼範例,請參見SDK簡介。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.util.ArrayList;
import java.util.List;
public class Demo {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
private static String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫Bucket名稱,例如examplebucket。
private static String bucketName = "examplebucket";
public static void main(String[] args) throws Exception {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 建立OSSClient執行個體。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 查詢滿足指定條件的檔案(Object),並按照指定欄位和排序方式列舉檔案資訊。
int maxResults = 20;
// 指定查詢小於1048576位元組的檔案,且最多返回20個結果,返回結果按升序排列。
String query = "{\"Field\": \"Size\",\"Value\": \"1048576\",\"Operation\": \"lt\"}";
String sort = "Size";
DoMetaQueryRequest doMetaQueryRequest = new DoMetaQueryRequest(bucketName, maxResults, query, sort);
Aggregation aggregationRequest = new Aggregation();
Aggregations aggregations = new Aggregations();
List<Aggregation> aggregationList = new ArrayList<Aggregation>();
// 指定彙總操作的欄位名稱。
aggregationRequest.setField("Size");
// 指定彙總操作的操作符,max表示最大值。
aggregationRequest.setOperation("max");
aggregationList.add(aggregationRequest);
aggregations.setAggregation(aggregationList);
// 設定彙總操作。
doMetaQueryRequest.setAggregations(aggregations);
doMetaQueryRequest.setOrder(SortOrder.ASC);
DoMetaQueryResult doMetaQueryResult = ossClient.doMetaQuery(doMetaQueryRequest);
if(doMetaQueryResult.getFiles() != null){
for(ObjectFile file : doMetaQueryResult.getFiles().getFile()){
System.out.println("Filename: " + file.getFilename());
// 擷取標識Object的內容。
System.out.println("ETag: " + file.getETag());
// 擷取Object的存取權限
System.out.println("ObjectACL: " + file.getObjectACL());
// 擷取Object的類型。
System.out.println("OssObjectType: " + file.getOssObjectType());
// 擷取Object的儲存類型。
System.out.println("OssStorageClass: " + file.getOssStorageClass());
// 擷取Object的標籤個數。
System.out.println("TaggingCount: " + file.getOssTaggingCount());
if(file.getOssTagging() != null){
for(Tagging tag : file.getOssTagging().getTagging()){
System.out.println("Key: " + tag.getKey());
System.out.println("Value: " + tag.getValue());
}
}
if(file.getOssUserMeta() != null){
for(UserMeta meta : file.getOssUserMeta().getUserMeta()){
System.out.println("Key: " + meta.getKey());
System.out.println("Value: " + meta.getValue());
}
}
}
} else if(doMetaQueryResult.getAggregations() != null){
for(Aggregation aggre : doMetaQueryResult.getAggregations().getAggregation()){
// 擷取彙總欄位名稱。
System.out.println("Field: " + aggre.getField());
// 擷取彙總欄位的操作符。
System.out.println("Operation: " + aggre.getOperation());
// 擷取彙總操作的結果值。
System.out.println("Value: " + aggre.getValue());
if(aggre.getGroups() != null && aggre.getGroups().getGroup().size() > 0){
// 擷取分組彙總的值。
System.out.println("Groups value: " + aggre.getGroups().getGroup().get(0).getValue());
// 擷取分組彙總的總個數。
System.out.println("Groups count: " + aggre.getGroups().getGroup().get(0).getCount());
}
}
} else {
System.out.println("NextToken: " + doMetaQueryResult.getNextToken());
}
} catch (OSSException oe) {
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Error Message: " + ce.getMessage());
} finally {
// 關閉OSSClient。
ossClient.shutdown();
}
}
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import MetaQuery, AggregationsRequest
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# examplebucket填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 查詢滿足指定條件的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"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 指定查詢大於30位元組的檔案,且最多返回十個結果,返回結果按升序排列。
query := oss.MetaQuery{
NextToken: "",
MaxResults: 10,
Query: `{"Field": "Size","Value": "30","Operation": "gt"}`,
Sort: "Size",
Order: "asc",
}
// 查詢滿足指定條件的Object,並按照指定欄位和排序方式列舉Object資訊。
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)
}
}
}
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見DoMetaQuery。
檢索條件及輸出設定
檢索條件
以下是完整的檢索條件,您可以根據需要進行單獨或組合設定。
OSS中繼資料檢索條件
檢索條件 | 說明 |
存儲類型 | 預設選中OSS支援的標準、低頻訪問、歸檔、冷歸檔和深度冷歸檔多種儲存類型。您可以按需選擇希望在查詢結果中顯示的Object儲存類型。 |
讀寫權限 | 預設選中OSS支援的四種讀寫權限ACL,即繼承Bucket、私人、公用讀取以及公用讀寫。您可以按需選擇希望在查詢結果中顯示的Object讀寫權限。 |
文件名 | 支援模糊比對和等於。如果您希望在查詢結果中顯示某個檔案名稱,例如exampleobject.txt。您可以通過以下兩種方式匹配目標檔案:
|
上傳類型 | 預設選中OSS支援的四種Object類型,您可以按需選擇希望在查詢結果中顯示的Object類型。Object類型說明如下:
|
最後修改時間 | 指定Object被最後修改的起始日期和結束日期,時間精確到秒。 |
檔案大小 | 支援等於、大於、大於等於、小於和小於等於五種篩選條件,檔案大小單位為KB。 |
對象版本 | 僅支援查詢目前的版本Object。 |
對象Etag及標籤檢索條件
如需根據對象Etag及標籤進行過濾尋找,可輸入您希望在查詢結果中顯示的Object對應的ETag或標籤資訊。
ETag僅支援精確匹配。ETag必須帶引號,樣本值為"5B3C1A2E0563E1B002CC607C6689"。可輸入多個ETag,每行一個。
以索引值對(Key-Value)的形式指定對象標籤。對象標籤的Key和Value均區分大小寫。關於標籤規則的更多資訊,請參見對象標籤。
結果輸出設定
您可對輸出結果進行排序和簡單統計。
對象排序方式:支援根據最後修改時間、檔案名稱和檔案大小進行升序、降序及預設排序。您可以按需選擇並排序檢索結果,便於快速找到所需檔案。
資料彙總:支援多種輸出類型,您可以對檢索結果進行去重統計、分組計數、最大值、最小值、平均值和求和等計算,便於高效分析和管理資料。
常見問題
Bucket內檔案數量達到上億層級時,為什麼很長時間都沒有成功建立資料索引?
1秒內大約可以為600個檔案建立索引。您可以結合Bucket內的檔案數量,預估建立索引所需時間。
相關文檔
標量檢索支援多項過濾條件,例如檔案最後修改時間、儲存類型、讀寫權限、檔案大小等。如果您希望從OSS Bucket的海量Object中篩選出指定時間範圍內的Object,請參見如何篩選OSS指定時間範圍內的檔案?。