1

Lucene.Net + カスタム クローラー + Ifilter を使用して、ブロブ内のデータをインデックス化できるようにしています。

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*/

以下のコードは、IFilter を使用するインデクサー関数です。

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;
        }
    }

今私の問題は、インスタンスストレージにファイルをダウンロードしたくないということです..ファイルを直接FilterReaderに渡したいです。ただし、「物理」パスを使用するため、http アドレスを渡すことはできません。誰かが他の回避策を提案できますか? 同じファイルを BLOB から再度ダウンロードしてインデックスを作成するのではなく、ダウンロードしてメイン メモリに保持し、インデックス フィルターを直接使用します。

ここからIFilterを使用しています

4

1 に答える 1

1

とはどういう意味I don't want to download same file again from blob and then index it, instead i will prefer download and keep it in main memory and directly use index filterですか? それは何ですかmain memory- Azure Blob ストレージ、またはローカル インスタンス メモリ。

ただし、IFilter インターフェイスの性質上、直面している問題を回避することはできません。ここで使用しているソースをもう少し詳しく調べると、その裏でIPersistFile COM インターフェイスが使用されていることがわかります。残念ながら、このインターフェイスはローカル ファイルでのみ機能し、ストリームを受け入れません。

私が提案したのは、物理パスの代わりに Stream from Blob を使用して Reader に渡すことです。ただし、既に述べたように、IFilter は物理パスでのみ機能する COM インターフェイスを使用します。したがって、現在のアプローチでは、ブロブのダウンロードをスキップする方法はありません。

BLOB をローカルにダウンロードすることは何も怖いことではありません。ストレージ アカウントがコンピューティングと同じアフィニティ グループにある場合、ダウンロードは非常に高速になり、トラフィックは無料になります。小さなインスタンス サイズを使用すると、ローカル ストレージ用に 165 GB になります。これは十分なストレージです。何がインデックスされ、何がインデックスされていないかを追跡することで、プロセスを少し最適化できます。そのために Azure Table Storage を使用できます。file nameキーと値のペアを-として保存するのに最適な、もう 1 つの非常に高速で安価なストレージ ソリューションetagです。次に、BLOB を列挙するときに、まず BLOB の をフェッチし、etag既にインデックスが作成されているかどうかをテーブルで確認します。インデックスが作成されていない場合にのみダウンロードし、テーブルに新しいレコードを追加して、このファイルをインデックス付きとしてマークします。

または... または IFilter を使用しないでください。Azure で IFilter を使用するメリットはありません。IFilter は、アプリケーションのインストール時にのみ登録されます。たとえば、IFilter を使用して Office ドキュメントを処理する場合は、Microsoft Office を VM にインストールする必要があります (現在、MS Office のライセンス モビリティの制限により、ライセンスを持っていてもインストールできません)。PDF 用の IFilter を取得したい場合は、Adobe Acrobat Reader をインストールする必要があります (スタートアップ タスクを介して実行できます)。などなど - インストールできるアプリケーションもあれば、できないアプリケーションもあります。Windows Azure VM インスタンスは、IFilter がまったくない単純な Windows です。役割も機能も追加されていない、Windows Server 2008 R2 の基本的なインストールを想像してみてください。これがインスタンスです。

于 2012-12-19T08:57:59.890 に答える