我們在我們的項目中使用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);
有人可以請大家幫幫忙嗎?
感謝
卡皮爾