我正在使用Azure Blob存储。在持久化blob时,我已经持久化了索引标记。当我通过Microsoft Azure存储资源管理器下载blob时,我能够看到索引标记。以编程方式,我正在尝试过滤标签(使用azure-Storage age-blob版本12.15.0)
我正在使用此api从DB获取详细信息-findBlosByTags
这是我正在尝试的代码
FindBlobsOptions findByTags = new FindBlobsOptions(searchExpression));
findByTags.setMaxResultsPerPage(100);
PagedIterable<TaggedBlobItem> blobsByTags = blobContainerClient.findBlobsByTags(findByTags, Duration.ofSeconds(30), Context.NONE);
我尝试了以下查询
1. String searchExpression = "where=@container = 'container-name' AND \"field\" = \'value\'";
2. String searchExpression = "where=field=value";
3. String searchExpression = "where=\"field\" =\'value\'";
String escapeJava = StringEscapeUtils.escapeJava(searchExpression);
4. String searchExpression = "&where=\"trackingId\"=\'TA00965650\'";
我得到了这个例外。
[请求处理失败;嵌套异常com.azure.storage. blob.model.BlobStorageException:状态码400,"
InvalidQueryParameterValue
在字符位置1处或附近解析查询时出错:意外'1'Request estId: 78043a6d-901e-00de-0797-510acf000000时间:2022-04-16T13:42:00.7475672Z其中="field"='value'此查询参数值无效。"]根本原因com.azure.storage.blob.model.BlobStorageException:状态码400,"
InvalidQueryParameterValue
在字符位置1处或附近解析查询时出错:意外的'1'Request estId: 78043a6d-901e-00de-0797-510acf000000时间:2022-04-16T13:42:00.7475672Z其中="trackingId"='TA00965650'此查询参数值无效。"at sun.reect.NativeConstructorAccessorImpl.newInstance0(本机方法)at sun.reect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reect.ConstrucatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.restructor.Constructor.newInstance(Constructor.java:423)atcom.azure.core.http.rest
从异常日志来看,我传递给findBlobsByTags方法的查询在解析中存在问题。请让我知道我做错了什么。如果需要做一些转义/编码
如注释中所述,请从搜索表达式中删除where=
。文档似乎不正确。您可能需要在此处创建一个问题:https://github.com/Azure/azure-sdk-for-java/issues以便可以更正留档。
你可以在这里看到工作代码:https://github.com/Azure/azure-sdk-for-java/blob/azure-storage-blob_12.16.0/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/ContainerAPITest.groovy.
我也遇到了类似的问题。我更新了如下查询,它可以正常工作。
BlobServiceClient blobServiceClient = getBlobServiceClient();
PagedIterable<TaggedBlobItem> findBlobsByTags = blobServiceClient.findBlobsByTags("\"Company\"='ABC'");
for(TaggedBlobItem taggedBlobItem : findBlobsByTags) {
System.out.println("Find Blob, ContainerName - " + taggedBlobItem.getContainerName()+", Name - "+taggedBlobItem.getName());
}