如何使用Blob容器中的Azure搜索在最新文件中搜索匹配数据C#

时间:2019-02-01 09:16:30

标签: c# asp.net-mvc azure azure-storage-blobs azure-search

我内部有一个名为dataTest的天蓝色blob容器,其中有multiple folders created based on year/ month / date.

dataTest/rawjson/2019/01/25/01/demo1.json

dataTest/rawjson/2018/12/30/02/demo2.json

我想从最新的文件夹路径的文件将是 -

dataTest/rawjson/2019/01/25/01/demo1.json

我如何获得最新的路径(dataTest/rawjson/2019/01/25/01/demo1.json)

当我以dataTest/rawjson的形式传递输入

我想使用azure search读取数据,我们需要通过导入此Blob容器来创建index

我想知道有什么方法可以动态地传递此blob路径并使用azure search获取最新的文件数据吗?

之前azure search我是使用下面的C#代码以获得最新的文件

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("dataTest");

            string directoryreference = "dataTest/rawjson/events";

            var blobDirectory = container.GetDirectoryReference(directoryreference);
            IEnumerable<IListBlobItem> items = blobDirectory.ListBlobs(useFlatBlobListing: true);

            string blobFilePath = String.Empty;
            foreach (var blob in items.OfType<CloudBlob>()

    .OrderByDescending(b => b.Properties.LastModified))
            {
                string blobFileFullPath = Path.GetDirectoryName(blob.Name).Replace("\\", "/");
                blobFilePath = Path.GetDirectoryName(blobFileFullPath).Replace("\\", "/");
                if (blobFilePath != null)
                { break; }

            }
            var blobFileDirectory = container.GetDirectoryReference(blobFilePath);
            IEnumerable<IListBlobItem> fileitems = blobFileDirectory.ListBlobs(useFlatBlobListing: true);

1 个答案:

答案 0 :(得分:0)

blob中没有物理文件夹,“文件夹”只是blob路径的一部分。 。每个IListBlobItem都将是CloudBlockBlob,CloudPageBlob或CloudBlobDirectory。

在强制转换为块或页面blob或它们的共享基类CloudBlob(最好使用as关键字并检查null)之后,您可以通过blockBlob.Properties.LastModified访问修改日期。

请注意,您的实现将对容器中的所有Blob进行O(n)扫描,如果有成千上万个文件,则可能需要一段时间。但是,目前尚无法进行更有效的Blob存储查询(除非您滥用文件命名并以一种新的日期按字母顺序排在第一位的方式对日期进行编码)。实际上,如果您需要更好的查询性能,建议您随手携带一个数据库表,该表将所有文件列表都表示为行,并使用诸如索引的DateModified列作为搜索依据,以及带有Blob路径的列,以便于访问文件。 / p>

更好的方法是将Azure表存储与blob存储一起使用。通过这种方法,在创建Blob时,您将一个条目写入Azure表存储。同样,在更新Blob时,您还要在Azure Table Storage中进行另一个输入。这样您就可以建立审核跟踪。

如果您想保留Blob的历史记录(例如,用户上传了一个文本文件,然后又上传了另一个文本文件,并且您想跟踪两个文本文件的内容),那么您可以做一个快照对其进行更新之前的Blob的值。它将要做的是创建现有Blob的只读副本。创建快照后,该过程将为您返回日期/时间值,您可以将其与更新的条目一起存储在表存储中。