Object Storage Service (OSS) は、オブジェクトのメタデータにインデックスを付加するためのデータインデックス作成機能を備えています。 オブジェクトのメタデータをインデックス条件として指定して、オブジェクトをクエリできます。 データインデックス作成は、データ構造をより効率的に理解および管理するのに役立ちます。 データインデックス作成は、オブジェクトクエリ、統計、および管理も容易にします。
シナリオ
データ監査またはデータ管理の要件を満たすには、数億のオブジェクトが格納されているOSSバケットから特定のオブジェクトをクエリする必要があります。 オブジェクトには、名前、ETag値、ストレージクラス、サイズ、タグ、最終変更時刻など、大量のメタデータが含まれています。 データインデックス機能を使用すると、ビジネス要件に基づいて単純なクエリ条件とデータ集計方法を組み合わせて、クエリのパフォーマンスを向上させることができます。
使用上の注意
サポートされるリージョン
データインデックス機能は、中国 (杭州) およびオーストラリア (シドニー) リージョンでのみサポートされています。
オブジェクト量
既定では、メタデータ管理機能は、100,000,000未満のオブジェクトを含むバケットに対してのみサポートされます。
課金ルール
パブリックプレビュー中は、メタデータ管理に対して課金されません。 データインデックス作成機能の請求可能項目の詳細については、「データインデックス作成料金」をご参照ください。
インデックス作成に必要な時間
メタデータ管理を有効にすると、OSSはインデックスを作成します。 インデックスの作成に必要な時間は、バケットに保存されているオブジェクトの数に正比例します。 バケット内のオブジェクトの数が多いほど、インデックスの作成にかかる時間が長くなります。
マルチパートアップロード
バケットにマルチパートアップロードを使用してアップロードされたオブジェクトが含まれている場合、クエリ結果には、CompleteMultipartUpload操作を呼び出して結合された完全なオブジェクトのみが含まれます。 開始されたが完了していない、またはキャンセルされていないマルチパートアップロードタスクによってアップロードされたパーツは、クエリ結果には含まれません。
手順
OSSコンソールの使用
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、ファイル > データのインデックス作成 を選択します。
データのインデックス作成 ページで、メタデータ管理 をオンにします。
メタデータ管理が有効になるのに必要な時間は、バケット内のオブジェクトの数によって異なります。
オブジェクトをフィルタリングする基本条件を指定します。
[基本的なフィルタリング条件] セクションで、ビジネス要件に基づいて基本的なフィルタリング条件を指定します。 次の表に、基本的なフィルタリング条件を示します。
フィルタリング条件
説明
ストレージクラス
デフォルトでは、OSSでサポートされている次のストレージクラスが選択されています: 標準、IA、アーカイブ、コールドアーカイブ、およびディープコールドアーカイブ。 ビジネス要件に基づいてストレージクラスを指定できます。
ACL (アクセス制御リスト)
デフォルトでは、OSSでサポートされている次のアクセス制御リスト (ACL) が選択されています。バケット、プライベート、パブリック読み取り、およびパブリック読み取り /書き込みから継承されます。 ビジネス要件に基づいてACLを指定できます。
ファイル名
あいまい一致または等しいを選択できます。 exampleobject.txtなど、クエリ結果にオブジェクトの名前を表示する場合は、次のいずれかの方法を使用してオブジェクト名を一致させることができます。
等しい を選択し、オブジェクトのフルネームを入力します。 例: exampleobject.txt
あいまい一致 を選択し、オブジェクト名のプレフィックスまたはサフィックスを入力します。 例: Exampleまたは. txt
重要あいまい一致は、指定された文字を含むすべてのオブジェクト名と一致します。 たとえば、Fuzzy Matchの横にtestと入力した場合、localfolder/test/.example.jpgとlocalfolder/test.jpgがクエリ条件を満たし、クエリ結果に表示されます。
アップロードの種類
デフォルトでは、次のアップロードタイプが選択されています。 ビジネス要件に基づいてアップロードタイプを指定できます。
Normal: クエリ結果でシンプルアップロードを使用してアップロードされたオブジェクトを返します。
マルチパート: クエリ結果でマルチパートアップロードを使用してアップロードされたオブジェクトを返します。
Appendable: クエリ結果で追加アップロードを使用してアップロードされたオブジェクトを返します。
Symlink: シンボリックリンクを返します。
最終更新日時
最終変更日時には、開始日 と [終了日] を指定できます。 開始日と終了日の値は秒単位で正確です。
オブジェクトサイズ
オブジェクトサイズは、等しい 、次の値より大きい: 、指定の値以上 、指定の値より小さい 、または 指定の値以下 を選択できます。 オブジェクトサイズはKB単位です。
オブジェクトバージョン
データインデックスを使用して、現在のバージョンのオブジェクトのみをクエリできます。
(オプション) その他のフィルタリング条件を指定します。
クエリ結果でオブジェクトを並べ替えたり、タグを使用してオブジェクトをフィルタリングする場合は、表示されるフィルタリング条件を増やす をクリックします。
クエリ結果でオブジェクトをソートする順序を指定します。
オブジェクトのソート順 セクションで、昇順 または 降順 を選択して、最終更新日時 、ファイル名 、または オブジェクトサイズ でオブジェクトを並べ替えます。
タグベースのフィルタ条件の指定
タグに基づくフィルタリング条件 セクションで、オブジェクトのフィルタリングに使用するETagsまたはタグを指定します。
ETagsは完全一致のみをサポートします。 複数のETagsを指定する必要がある場合は、改行で区切ります。
キーと値のペアを使用してオブジェクトのタグを指定します。 オブジェクトタグのキーと値は大文字と小文字を区別します。 タグルールの詳細については、「オブジェクトのタグ付け」をご参照ください。
オブジェクトデータの集計に使用するメソッドを指定する
クエリ結果を分類し、各カテゴリの統計を収集する場合は、データ集計方法を指定できます。 たとえば、データ集計メソッドを指定して、すべてのオブジェクトのサイズに関する統計を収集し、クエリ結果でオブジェクトの個別のストレージクラスの数を取得できます。
OSS SDKの使用
データインデックス機能を使用して、指定された条件を満たすオブジェクトをクエリできるのは、OSS SDK for Java、OSS SDK for Python、およびOSS SDK for Goのみです。 データインデックス機能を使用してバケット内のオブジェクトをクエリする前に、バケットのメタデータ管理機能を有効にする必要があります。 データインデックスのサンプルコードについては、「概要」をご参照ください。
com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo delをインポートします。*;
java.util.ArrayListをインポートします。java.util.Listをインポートします。public classデモ {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
プライベート静的文字列エンドポイント="https://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。 例: examplebucket.
プライベート静的文字列bucketName = "examplebucket";
public static void main(String[] args) throws Exception {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 特定の条件を満たすオブジェクトを照会し、特定のフィールドとソート方法に基づいてオブジェクトに関する情報を一覧表示します。
int maxResults = 20;
// サイズが1,048,576バイト未満のオブジェクトを照会し、一度に最大20個のオブジェクトを返し、オブジェクトを昇順に並べ替えます。
String query = "{\" Field\": \" Size\",\" Value\": \" 1048576\",\" Operation\": \" lt\"}";
文字列ソート="サイズ";
DoMetaQueryRequest doMetaQueryRequest=新しいDoMetaQueryRequest(bucketName、maxResults、query、sort);
Aggregation aggregationRequest = new Aggregation();
Aggregations aggregations = new Aggregations();
List<Aggregation> aggregationList = new ArrayList<Aggregation>();
// 集計操作で使用されるフィールドの名前を指定します。
aggregationRequest.setField("サイズ");
// 集計操作で使用する演算子を指定します。 maxは最大値を示す。
aggregationRequest.setOperation("max");
aggregationList.add(aggregationRequest);
aggregations.setAggregation(aggregationList);
// 集計操作を指定します。
doMetaQueryRequest.setAggregations (集計);
doMetaQueryRequest.setOrder(SortOrder.ASC);
DoMetaQueryResult doMetaQueryResult = ossClient.doMetaQuery(doMetaQueryRequest);
if(doMetaQueryResult.getFiles() ! =null){
for(ObjectFileファイル: doMetaQueryResult.getFiles().getFile()){
System.out.println("Filename: " + file.getFilename());
// オブジェクトのコンテンツを識別するために使用されるETag値を照会します。
System.out.println("ETag: " + file.getETag());
// オブジェクトのアクセス制御リスト (ACL) を照会します。
System.out.println("ObjectACL: " + file.getObjectACL());
// オブジェクトのタイプを照会します。
System.out.println("OssObjectType: " + file.getOssObjectType());
// オブジェクトのストレージクラスを照会します。
System.out.println("OssStorageClass: " + file.getOssStorageClass());
// オブジェクトのタグ数を照会します。
System.out.println("TaggingCount: " + file.getOssTaggingCount());
if(file.getOssTagging() !) =null){
for (タグ: 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 (Exception e) {
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエストID:" + oe.getRequestId());
System.out.println("ホストID:" + oe.getHostId());
} catch (ClientException e) {
System.out.println("Error Message: " + ce.getMessage());
} 最後に{
// Shut down the OSSClient instance.
ossClient.shutdown();
}
}
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
oss2.modelsからMetaQuery、AggregationsRequestをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
# バケットの名前を指定します。 例: examplebucket.
bucket = oss2.Bucket(auth, 'http:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# 特定の条件を満たすオブジェクトを照会し、特定のフィールドとソート方法に基づいてオブジェクト情報を一覧表示します。
#1 MB未満のオブジェクトを照会し、一度に最大10個のオブジェクトを返し、オブジェクトを昇順で並べ替えます。
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)
# オブジェクト名を表示します。
print(result.files[0].file_name)
# オブジェクトのETagsを表示します。
print(result.files[0].etag)
# オブジェクトのタイプを表示します。
print(result.files[0].oss_object_type)
# オブジェクトのストレージクラスを表示します。
print(result.files[0].oss_storage_class)
# オブジェクトのCRC-64値を表示します。
print(result.files[0].oss_crc64)
# オブジェクトのアクセス制御リスト (ACL) を表示します。
プリント (result.files[0].object_acl)
パッケージメイン
import (import (import)
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// サイズが30バイトを超えるオブジェクトを照会し、同時に最大10個のオブジェクトを返し、オブジェクトを昇順に並べ替えます。
query := oss.MetaQuery {
NextToken: "" 、
MaxResults: 10,
クエリ: '{"Field": "Size","Value": "30","Operation": "gt"}',
並べ替え: 「サイズ」、
注文: "asc" 、
}
// 指定された条件に一致するオブジェクトを照会し、指定されたフィールドとソート方法に基づいてオブジェクト情報を一覧表示します。
result,err := client.DoMetaQuery("examplebucket",query)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("NextToken:% s\n", result.NextToken)
_, file := range result.Files {
fmt.Printf("ファイル名: % 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)
}
_, 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)
}
}
}
OSS APIの使用
ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「DoMetaQuery」をご参照ください。
よくある質問
何億ものオブジェクトがバケットに保存されている場合、データインデックスが長期間作成されないのはなぜですか?
インデックスは、約1秒で600のオブジェクトに対して作成できます。 バケット内のオブジェクトの数に基づいて、インデックスの作成に必要な時間を見積もることができます。