Java AWS SDK S3. Find object by metadata

Viewed 76

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);
}
0 Answers
Related