Azure Powershell:如何快速搜索 BLOB 存储中的文件?

Azure Powershell: How Do I search for files in a BLOB storage quickly?

我们将日志文件存储在 Azure 存储帐户中,按日期和客户在目录中排序,如下所示:

YYYY/MM/DD/customerNo/.../.../somestring.customerNo.applicatoinID.log

我需要每天自动解析其中一些文件,效果很好。但是,我只知道上面提到的前缀和后缀,它们可能在不同的子目录中。

所以我是这样做的:

$files = (Get-AzStorageBlob -Container logfiles -Context $context) | Where-Object { $_.Name -like "$customerId.$appID.txt" }

在没有任何日志文件的情况下速度很快,但现在一年后此搜索需要很长时间。我读到 somewhere 按前缀搜索比按后缀搜索更快。不幸的是,我必须使用后缀,但我现在也使用日期作为前缀。我试图通过这样做来改进它:

$date = Get-Date -UFormat "%Y/%m/%d"
$prefix = "$date/$customerId/"
$files = (Get-AzStorageBlob -Container logfiles -Context $context) | Where-Object { $_.Name -like "$prefix*$customerId.$appID.txt" }

但是,没有任何改善,只是和以前一样长。而且感觉搜索的时间随着日志文件的数量呈指数级增长(几十 GB 中的几十万)

我收到一条状态消息,它在那里停留了半个小时:

据我了解,Azure 的 BLOB 存储没有支持文件夹的分层文件系统,因此“/”是 BLOB 名称的一部分,并被客户端软件解释为文件夹。

但是,这并不能帮助我加快搜索速度。关于如何改善这种情况有什么建议吗?

Azure Blob 存储支持 server-side 按前缀过滤 blob,但是您的代码没有利用它。

$files = (Get-AzStorageBlob -Container logfiles -Context $context) | Where-Object { $_.Name -like "$prefix*$customerId.$appID.txt" }

基本上上面的代码是列出所有 blob,然后在客户端进行过滤。

为了加快搜索速度,请将您的代码修改为:

$files = (Get-AzStorageBlob -Container logfiles -Prefix $prefix -Context $context) | Where-Object { $_.Name -like "$prefix*$customerId.$appID.txt" }

我只是在Prefix参数中传递了前缀。现在您只会收到以前缀 .

开头的 blob 名称