Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Lucene.NET和C对blob中的数据进行索引#_C#_Asp.net_Azure_Lucene.net_Azure Storage Blobs - Fatal编程技术网

C# 使用Lucene.NET和C对blob中的数据进行索引#

C# 使用Lucene.NET和C对blob中的数据进行索引#,c#,asp.net,azure,lucene.net,azure-storage-blobs,C#,Asp.net,Azure,Lucene.net,Azure Storage Blobs,我正在使用Lucene.Net+自定义爬虫+Ifilter,这样我就可以在blob中索引数据 foreach (var item in containerList) { CloudBlobContainer container = BlobClient.GetContainerReference(item.Name); if (container.Name != "indexes")

我正在使用Lucene.Net+自定义爬虫+Ifilter,这样我就可以在blob中索引数据

foreach (var item in containerList)
            {
                CloudBlobContainer container = BlobClient.GetContainerReference(item.Name);
                if (container.Name != "indexes")
                {
                    IEnumerable<IListBlobItem> blobs = container.ListBlobs();
                    foreach (CloudBlob blob in blobs)
                    {
                        CloudBlobContainer blobContainer = blob.Container;
                        CloudBlob blobToDownload = blobContainer.GetBlobReference(blob.Name);

                        blob.DownloadToFile(path+blob.Name);
                        indexer.IndexBlobData(path,blob);
                        System.IO.File.Delete(path+blob.Name);
                    }
                }
            }
/*Code for crawling which downloads file Locally on azure instance storage*/
现在我的问题是我不想在实例存储上下载文件。。我直接想把文件传递给FilterReader。但它采用“物理”路径,传递http地址不起作用。有人能提出其他解决办法吗?我不想再次从blob下载同一个文件,然后对其编制索引,相反,我更喜欢下载并将其保存在主内存中,并直接使用索引过滤器


我正在使用IFilter

您所说的
是什么意思还不是很清楚。我不想再次从blob下载同一个文件,然后对其进行索引,相反,我更喜欢下载并将其保存在主内存中,并直接使用索引过滤器?主内存是什么?Azure Blob存储,或本地实例内存

但是,由于IFilter接口的性质,您面临的问题无法解决。如果你更深入地研究你正在使用的源代码,你会发现在它使用的封面下。不幸的是,此接口仅适用于本地文件,不接受流

我建议使用Blob中的流并将其传递给阅读器,而不是物理路径。但是,正如前面所说的,IFilter使用COM接口,这些接口只与物理路径一起工作。因此,使用当前的方法无法跳过blob下载

本地下载blob没有什么可怕的。如果存储帐户与计算帐户位于同一关联组中,则下载速度将非常快,流量将是免费的。如果使用a,本地存储将有165GB。这是充足的存储空间。通过跟踪索引内容和未索引内容,可以稍微优化流程。您可以使用Azure表存储进行此操作。另一种速度极快且价格低廉的存储解决方案,非常适合将键值对存储为
文件名
-
etag
。然后,当您枚举blob时,首先获取blob的
etag
,并使用表检查它是否已被索引。仅在未编制索引时下载该文件,然后向表中添加新记录以将该文件标记为已编制索引


或者。。。或者不要使用IFilter。我认为在Azure上使用IFilter没有任何好处。iFilter仅在安装应用程序时注册。例如,如果您想使用IFilter处理Office文档,则必须在VM上安装Microsoft Office(由于MS Office的许可证移动限制,即使您拥有许可证,目前也无法安装)。如果你想获得PDF格式的IFilter,你必须安装AdobeAcrobatReader(你可以通过启动任务来完成)。等等,等等——有些应用程序你可以安装,有些你不能。您的Windows Azure VM实例是完全没有iFilter的普通Windows。想象一下Windows Server 2008 R2的基本安装,没有添加任何角色和功能-这就是您的实例。

您所说的
是什么意思还不太清楚。我不想再次从blob下载同一个文件,然后对其进行索引,相反,我更喜欢下载并将其保存在主内存中,并直接使用索引过滤器?主内存是什么?Azure Blob存储,或本地实例内存

但是,由于IFilter接口的性质,您面临的问题无法解决。如果你更深入地研究你正在使用的源代码,你会发现在它使用的封面下。不幸的是,此接口仅适用于本地文件,不接受流

我建议使用Blob中的流并将其传递给阅读器,而不是物理路径。但是,正如前面所说的,IFilter使用COM接口,这些接口只与物理路径一起工作。因此,使用当前的方法无法跳过blob下载

本地下载blob没有什么可怕的。如果存储帐户与计算帐户位于同一关联组中,则下载速度将非常快,流量将是免费的。如果使用a,本地存储将有165GB。这是充足的存储空间。通过跟踪索引内容和未索引内容,可以稍微优化流程。您可以使用Azure表存储进行此操作。另一种速度极快且价格低廉的存储解决方案,非常适合将键值对存储为
文件名
-
etag
。然后,当您枚举blob时,首先获取blob的
etag
,并使用表检查它是否已被索引。仅在未编制索引时下载该文件,然后向表中添加新记录以将该文件标记为已编制索引


或者。。。或者不要使用IFilter。我认为在Azure上使用IFilter没有任何好处。iFilter仅在安装应用程序时注册。例如,如果您想使用IFilter处理Office文档,则必须在VM上安装Microsoft Office(由于MS Office的许可证移动限制,即使您拥有许可证,目前也无法安装)。如果你想获得PDF格式的IFilter,你必须安装AdobeAcrobatReader(你可以通过启动任务来完成)。等等,等等——有些应用程序你可以安装,有些你不能。您的Windows Azure VM实例是完全没有iFilter的普通Windows。想象一下Windows Server 2008 R2的基本安装,没有添加任何角色和功能-这就是您的实例。

我不想再次从blob下载相同的文件,然后对其进行索引,相反,我更希望下载并将其保存在主内存中,并直接使用索引过滤器?主存储器是什么
对不起,我不太清楚。。我的意思是不把它存储到本地存储器中,我能不能用其他方法,比如把它保存在RAM(主存储器)中,或者可能在缓存中。。但正如你所说的,我认为不可能使用IFilter。我的要求是我想索引PDF和Office文档中的数据。有其他选择吗
public bool IndexBlobData(string path, CloudBlob blob)
    {
        Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();
        try
        {
            TextReader reader = new FilterReader(path + blob.Name);
            doc.Add(new Lucene.Net.Documents.Field("url", blob.Uri.ToString(), 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));
            indexWriter.AddDocument(doc);
            reader.Close();
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }