Please tell me a quick way to search for an object by user metadata. My current method takes about 20 seconds to do this on a sample of 200 objects.
public List<String> findObjectKeysByMetaKey(String metaKey, String keyValue) {
try {
ListObjectsV2Request request = new ListObjectsV2Request().withBucketName(bucketName);
ListObjectsV2Result result;
List<String> keys = new ArrayList<>();
do {
result = amazonS3Client.listObjectsV2(request);
keys.addAll(result
.getObjectSummaries()
.stream()
.map(S3ObjectSummary::getKey)
.filter(key -> keyValue.equals(getValueByMetaKey(bucketName, key, metaKey)))
.collect(Collectors.toList()));
request.setContinuationToken(result.getNextContinuationToken());
} while (result.isTruncated());
return keys;
} catch (S3Exception e) {
log.error("Exception when get keys by meta key {} with value {} from bucket {}. Message: {}",
metaKey, keyValue, bucketName, e.getMessage());
throw new S3ServiceException(
String.format("Exception when list all objects in bucket %s. Message: %s",
bucketName, e.getMessage()));
}
}
private String getValueByMetaKey(String bucket, String key, String metaKey) {
return amazonS3Client.getObjectMetadata(bucket, key).getUserMetadata().get(metaKey);
}