スカラー検索は、オブジェクトのメタデータをインデックス化する Object Storage Service (OSS) の機能です。この機能を使用すると、カスタム条件を定義して、オブジェクト名、ETag、ストレージクラス、サイズ、最終更新日時などの指定された基準に一致するバケット内のオブジェクトを迅速に検索できます。
注意事項
Java SDK 3.16.0 以降のバージョンのみがスカラー検索機能をサポートしています。
中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (深圳)、中国 (広州)、中国 (成都)、中国 (香港)、シンガポール、インドネシア (ジャカルタ)、ドイツ (フランクフルト)、米国 (バージニア)、米国 (シリコンバレー)、および英国 (ロンドン) リージョンのバケットは、スカラー取得機能をサポートしています。 詳細については、「データインデックス」をご参照ください。
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。
デフォルトでは、Alibaba Cloud アカウントはデータインデックス操作を実行する権限を持っています。Resource Access Management (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());
// オブジェクトのアクセス権限を取得します。
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」をご参照ください。