2013-02-09 40 views
1

我們在我們的項目中使用Lucene.NET,並用它通過AzureDirectory庫(https://azuredirectory.codeplex.com/[AzureDirectory]當我們重新啓動webrole

我們有一個webrole和一個輔助角色Lucene.NET指數得到損壞。索引通過工作者角色線程創建和更新。我們通過創建IndexSearcher從網頁搜索。現在我面臨的問題是 - 當我們使用管理控制檯升級cspkg以升級prodn服務器上的位時,突然創建的lucene索引停止工作。我們得到這樣一個錯誤:

文件_2c.fdt用C未找到(FileNotFoundException異常)

在Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run():\開發\代碼\ Lucene.Net \指標\ SegmentInfos.cs:第741行 位於C:\ Dev \ code \ Lucene.Net \ Index \ DirectoryIndexReader.cs中的Lucene.Net.Index.DirectoryIndexReader.Open(目錄目錄,Boolean closeDirectory,IndexDeletionPolicy deletionPolicy):行140 Lucene.Net.Index.IndexReader.Open(目錄目錄,Boolean closeDirectory,IndexDeletionPolicy deletionPolicy)位於C:\ Dev \ code \ Lucene.Net \ Index \ IndexReader.cs中:第257行 位於Lucene.Net.Index.IndexReader.Open (目錄目錄)在C:\ Dev \ code \ Lucene.Net \ Index \ IndexReader.cs中:第23行6 位於C:\ Dev \ code \ Lucene.Net \ Search \ IndexSearcher.cs中的Lucene.Net.Search.IndexSearcher..ctor(目錄目錄):line 91

但是,當我在lucene blob容器,特定的.fdt文件確實存在。事實上,在升級之前,搜索工作已經完美無缺。我甚至確保在升級這些位之前關閉了webrole以及worker角色(只是爲了確保在升級過程中索引沒有更新) - 但這也導致了這種損壞。

請注意,我確信AzureDirectory將RAMDirectory用作緩存。

工人角色一段代碼:

public static void CreateNewEntities(List<string> smids) 
    { 
     AzureDirectory azureDirectory = GetAzureDir(); 
     IndexWriter indexWriter = new IndexWriter(azureDirectory, CommonAnalyzer.getAnalyzer()); 
     indexWriter.SetUseCompoundFile(false); 

     foreach (string smid in smids) 
     { 
      List<Document> docs = GetDocs(smid); // Gets docs for this entity 
      foreach (Document d in docs) 
      { 
       indexWriter.AddDocument(d); 
      } 
     } 

     indexWriter.Close(); 
    } 

    public static void EditEntityInIndex(List<string> smids) 
    { 
     // delete this surfmark from the index, and recreate the same 
     AzureDirectory azureDirectory = GetAzureDir(); 
     IndexWriter indexWriter = new IndexWriter(azureDirectory, CommonAnalyzer.getAnalyzer()); 
     indexWriter.SetUseCompoundFile(false); 

     foreach (string smid in smids) 
     { 
      indexWriter.DeleteDocuments(new Term(IndexingFields.ID, smid)); 
      List<Document> docs = GetDocs(smid); 
      foreach (Document d in docs) 
      { 
       indexWriter.AddDocument(d); 
      } 
     } 
     indexWriter.Flush(); 
     indexWriter.Close(); 
    } 

Web角色代碼塊(搜索):

public static IndexSearcher GetIndexSearcher() 
    {//Method to get the indexsearcher obj which is refreshed every 10 mins 
     long ctime = DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond; 
     if (_srchr == null || ctime - _srchrTime > 600000) // refresh every 10 mins 
     { 

     _srchr = new IndexSearcher(GetAzureDir()); 
     _srchrTime = DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond; 

     } 

     return _srchr; 
    } 





     string[] fields = { /*list of fields to be searched on*/}; 
     IndexSearcher searcher = GetIndexSearcher(); 
     Hits hits = searcher.Search(mainQuery); 

有人可以請大家幫幫忙嗎?

感謝

卡皮爾

回答

0

我會首先使用進程監視器來驗證丟失的文件是在該位置你認爲它是 - 它很容易(至少對我來說)的誤差得到位在升級過程中,當服務器配置從您下面更改時,就像這樣。