Lucene.NET并在Azure Blob存储上存储数据

时间:2012-12-11 11:50:25

标签: azure lucene.net azure-storage-blobs

我问的问题是因为我不想使用AzureDirectory项目。我只是在自己尝试一些东西。

cloudStorageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=http;AccountName=xxxx;AccountKey=xxxxx");

        blobClient=cloudStorageAccount.CreateCloudBlobClient();


        List<CloudBlobContainer> containerList = new List<CloudBlobContainer>();
        IEnumerable<CloudBlobContainer> containers = blobClient.ListContainers();
        if (containers != null)
        {
        foreach (var item in containers)
        {
            Console.WriteLine(item.Uri);
        }
        }
        /* Used to test connectivity 
        */
        //state the file location of the index

        string indexLocation = containers.Last().Name.ToString();
        Lucene.Net.Store.Directory dir =
            Lucene.Net.Store.FSDirectory.Open(indexLocation);

        //create an analyzer to process the text
        Lucene.Net.Analysis.Analyzer analyzer = new
        Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

        //create the index writer with the directory and analyzer defined.

        bool findexExists = Lucene.Net.Index.IndexReader.IndexExists(dir);

        Lucene.Net.Index.IndexWriter indexWritr = new Lucene.Net.Index.IndexWriter(dir, analyzer,!findexExists, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
        //create a document, add in a single field
        Lucene.Net.Documents.Document doc = new  Lucene.Net.Documents.Document();
        string path="D:\\try.html";
        TextReader reader = new FilterReader("D:\\try.html");
        doc.Add(new Lucene.Net.Documents.Field("url",path,Lucene.Net.Documents.Field.Store.YES,Lucene.Net.Documents.Field.Index.NOT_ANALYZED));
        doc.Add(new Lucene.Net.Documents.Field("content",reader.ReadToEnd().ToString(),Lucene.Net.Documents.Field.Store.YES,Lucene.Net.Documents.Field.Index.ANALYZED));
        indexWritr.AddDocument(doc);
        indexWritr.Optimize();
        indexWritr.Commit();
        indexWritr.Close();

现在问题是索引完成后我无法看到容器内创建的任何文件。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:6)

你正在那里使用FSDirectory,它将把文件写入本地磁盘。

你在blob存储中传递了一个容器列表。 Blob存储是通过REST API提供的服务,无法直接从文件系统进行寻址。因此,FSDirectory无法将索引写入存储。

您的选择是:

  1. 在机器上安装VHD磁盘,并将VHD存储在blob存储中。这里有一些关于如何执行此操作的说明:http://blogs.msdn.com/b/avkashchauhan/archive/2011/04/15/mount-a-page-blob-vhd-in-any-windows-azure-vm-outside-any-web-worker-or-vm-role.aspx
  2. 使用您在问题中引用的Azure目录。我已针对最新的存储SDK重新构建了AzureDirectory:https://github.com/richorama/AzureDirectory

答案 1 :(得分:0)

环顾四周的人的另一种选择 - 我编写了一个使用azure共享缓存(预览)的目录,该目录可以替代AzureDirectory(尽管是有界搜索集)

https://github.com/ajorkowski/AzureDataCacheDirectory