我们在项目中使用Lucene.NET并通过AzureDirectory库(https://azuredirectory.codeplex.com/)
使用它我们有一个webrole和一个worker角色。索引是通过辅助角色线程创建和更新的。我们通过创建IndexSearcher从webrole进行搜索。现在我面临的问题是 - 当我们使用管理控制台升级cspkg以升级prodn服务器上的位时,已创建的lucene索引突然停止工作。我们收到如下错误:
找不到文件_2c.fdt(FileNotFoundException)
位于C:\ Dev \ code \ Lucene.Net \ Index \ SegmentInfos.cs中的Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run():第741行 在Lucene.Net.Index.DirectoryIndexReader.Open(目录目录,Boolean closeDirectory,IndexDeletionPolicy deletionPolicy)中的C:\ Dev \ code \ Lucene.Net \ Index \ DirectoryIndexReader.cs:第140行 在Lucene.Net.Index.IndexReader.Open(目录目录,Boolean closeDirectory,IndexDeletionPolicy deletionPolicy)中的C:\ Dev \ code \ Lucene.Net \ Index \ IndexReader.cs:第257行 在C:\ Dev \ code \ Lucene.Net \ Index \ IndexReader.cs中的Lucene.Net.Index.IndexReader.Open(目录目录):第236行 在C:\ Dev \ code \ Lucene.Net \ Search \ IndexSearcher.cs中的Lucene.Net.Search.IndexSearcher..ctor(目录目录):第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 :(得分:0)
我首先使用进程监视器来验证丢失的文件是否位于您认为的位置 - 在服务器配置更改时升级过程中很容易(至少对我来说)这样的错误来自你的下方。