Object Storage Service (OSS) のメタ検索は、オブジェクト名、ETag、ストレージタイプ、サイズ、最終更新日時などの特定のメタデータ条件に基づいてオブジェクトを迅速に取得できる、データインデックスを活用した検索および取得機能です。
注意事項
メタ検索は、OSS SDK for Java 3.16.0 以降でのみサポートされています。
Scalar retrieval は、中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (深圳)、中国 (広州)、中国 (成都)、中国 (香港)、シンガポール、インドネシア (ジャカルタ)、ドイツ (フランクフルト)、米国 (バージニア)、米国 (シリコンバレー)、英国 (ロンドン) リージョンにあるバケットでのみサポートされています。
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用しています。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報を設定する方法の詳細については、「アクセス認証情報を設定する」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。
デフォルトでは、Alibaba Cloud アカウントには、データインデックス操作を実行するための権限があります。RAM ユーザーまたは STS を使用してデータインデックス操作を実行する場合は、必要な権限を持っていることを確認してください。
メタデータ管理機能を有効にするには、
oss:OpenMetaQuery権限が必要です。メタデータインデックスライブラリの情報を照会するには、
oss:GetMetaQueryStatus権限が必要です。特定の条件を満たすオブジェクトを照会するには、
oss:DoMetaQuery権限が必要です。メタデータ管理機能を無効にするには、
oss:CloseMetaQuery権限が必要です。
メタ検索機能を有効にする
バケットに対してメタ検索機能を有効にすると、OSS はバケットのメタデータインデックスライブラリを作成し、バケット内のすべてのオブジェクトのメタデータインデックスを作成します。メタデータインデックスライブラリが作成されると、OSS はバケット内の増分オブジェクトに対して準リアルタイムスキャンを継続的に実行し、増分オブジェクトのメタデータインデックスを作成します。次のサンプルコードは、バケットに対してメタ検索機能を有効にします。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.MetaQueryMode;
public class OpenMetaQuery {
public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException {
// この例では、中国 (杭州) リージョンのエンドポイントを使用しています。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// 環境変数からアクセス認証情報を取得します。
// サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出して関連付けられているリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// メタ検索機能を有効にします。
ossClient.openMetaQuery(bucketName);
} 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 インスタンスをシャットダウンします。
if(ossClient != null){
ossClient.shutdown();
}
}
}
}
バケットのメタデータインデックスライブラリの情報を照会する
次のサンプルコードは、バケットのメタデータインデックスライブラリの情報を照会します。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GetMetaQueryStatusResult;
public class GetMetaQueryStatus {
public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException {
// この例では、中国 (杭州) リージョンのエンドポイントを使用しています。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// 環境変数からアクセス認証情報を取得します。
// サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出して関連付けられているリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// バケットのメタデータインデックスライブラリの情報を照会します。
GetMetaQueryStatusResult getResult = ossClient.getMetaQueryStatus(bucketName);
// スキャンタイプを照会します。
System.out.println(getResult.getPhase());
// メタデータインデックスライブラリのステータスを照会します。
System.out.println(getResult.getState());
// メタデータインデックスライブラリが作成された時刻を照会します。
System.out.println(getResult.getCreateTime());
// メタデータインデックスライブラリが最後に更新された時刻を照会します。
System.out.println(getResult.getUpdateTime());
} 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 インスタンスをシャットダウンします。
if(ossClient != null){
ossClient.shutdown();
}
}
}
}
特定の条件を満たすオブジェクトを照会する
次のサンプルコードは、特定の条件を満たすオブジェクトを照会し、特定のフィールドに基づいて、指定されたソート順で一致するオブジェクトを返します。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.util.ArrayList;
import java.util.List;
public class DoMetaQuery {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントを使用しています。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// 環境変数からアクセス認証情報を取得します。
// サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出して関連付けられているリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 特定の条件を満たすオブジェクトを照会し、特定のフィールドに基づいて、指定されたソート順でオブジェクトを返します。
int maxResults = 20;
// サイズが 1,048,576 バイト未満のオブジェクトを照会し、一度に最大 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());
// オブジェクトのコンテンツを識別するために使用される 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(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();
}
}
}
メタ検索機能を無効にする
次のサンプルコードは、メタ検索機能を無効にします。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
public class CloseMetaQuery {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントを使用しています。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// 環境変数からアクセス認証情報を取得します。
// サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出して関連付けられているリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// バケットに対してメタ検索機能を無効にします。
ossClient.closeMetaQuery(bucketName);
} 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 インスタンスをシャットダウンします。
if(ossClient != null){
ossClient.shutdown();
}
}
}
}
関連情報
メタデータ管理機能を有効にする API 操作の詳細については、「OpenMetaQuery」をご参照ください。
メタデータインデックスライブラリに関する情報を照会する API 操作の詳細については、「GetMetaQueryStatus」をご参照ください。
特定の条件を満たすオブジェクトを照会し、特定のフィールドとソート順に基づいてオブジェクトをリストする API 操作の詳細については、「DoMetaQuery」をご参照ください。
メタデータ管理機能を無効にする API 操作の詳細については、「CloseMetaQuery」をご参照ください。