如何在Azure Blob上实现快速搜索?

时间:2014-06-06 13:06:05

标签: c# azure azure-storage

我完成了编写代码以将文件(文本文件)上传到azure blob存储。现在我想提供基于文本文件内容的搜索。对于前者如果我搜索"你好"那么包含" Hello"的文件的名称单词应出现在搜索结果中。这是我的搜索代码

class BlobSearch
{
    static void Main(string[] args)
    {
        string searchText = "Hello";
        CloudStorageAccount account = CloudStorageAccount.Parse(azureConString);
        CloudBlobClient blobClient = account.CreateCloudBlobClient();
        CloudBlobContainer blobContainer = blobClient.GetContainerReference("MyBlobContainer");

        blobContainer.FetchAttributes();

        var blobItemList = blobContainer.ListBlobs();

        foreach (var item in blobItemList)
        {
            string line = string.Empty;
            CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(item.Uri.ToString());

            if(blockBlob.Name.Contains(".txt"))
            {
                int lineno = 1;                    
                using (var stream = blockBlob.OpenRead())
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        while ((line = reader.ReadLine()) != null)
                        {
                            if (line.IndexOf(searchText) != -1)
                            {                                    
                                Console.WriteLine("Line : " + lineno  +" => "+ blockBlob.Name);
                            }
                            lineno++;
                        }
                    }
                }                  
            }                
        }
        Console.WriteLine("SEARCH COMPLETE");
        Console.ReadLine();
    }
}

上面的代码正在运行,但速度太慢了。有没有办法更快地完成它或者可以改进上面的代码。

3 个答案:

答案 0 :(得分:1)

// get blob data
CloudBlob cloudBlob = blobContainer.GetBlobReference(blobName);
string text = cloudBlob.DownloadText();

也许一次下载它比在循环中逐行读取更快?

答案 1 :(得分:1)

这是一个非常糟糕的方法。这将是非常缓慢的。最好的选择是Azure Search。搜索现在可以自动索引您的blob!

答案 2 :(得分:0)

你的代码还不错。找出大部分时间花在哪里。可能是网络或CPU。对于网络,你运气不好。对于CPU,您可以并行化。

您正在使用特定于文化的字符串处理。 StringComparison.Ordinal远不如CPU密集(如10x)。但它有不同的语义。