我们在我们的项目中使用 Lucene.NET,并通过 AzureDirectory 库 ( https://azuredirectory.codeplex.com/ )使用它
我们有一个 webrole 和一个 worker 角色。索引是通过工作角色线程创建和更新的。我们通过创建一个 IndexSearcher 从 webrole 进行搜索。现在我面临的问题是 - 当我们使用管理控制台升级 cspkg 以升级 prodn 服务器上的位时,已创建的 lucene 索引突然停止工作。我们收到如下错误:
未找到文件 _2c.fdt (FileNotFoundException)
在 Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run() 在 C:\Dev\code\Lucene.Net\Index\SegmentInfos.cs: Lucene.Net.Index.DirectoryIndexReader.Open 的第 741 行(目录目录,布尔值 closeDirectory , IndexDeletionPolicy deletePolicy) in C:\Dev\code\Lucene.Net\Index\DirectoryIndexReader.cs: Lucene.Net.Index.IndexReader.Open(Directory directory, Boolean closeDirectory, IndexDeletionPolicy deletePolicy) in C:\Dev\ 中的第 140 行code\Lucene.Net\Index\IndexReader.cs:Lucene.Net.Index.IndexReader.Open(目录)的第 257 行在 C:\Dev\code\Lucene.Net\Index\IndexReader.cs:Lucene 的第 236 行.Net.Search.IndexSearcher..ctor(目录目录)在 C:\Dev\code\Lucene.Net\Search\IndexSearcher.cs:line 91
但是,当我重新检查 lucene blob 容器时,确实存在特定的 .fdt 文件。事实上,在升级之前,搜索工作得非常好。我什至确保在升级位之前关闭 webrole 和 worker 角色(只是为了确保在升级发生时索引没有得到更新)——但这也导致了这种损坏。
请注意,我确信使用 RAMDirectory 作为缓存的 AzureDirectory。
工人角色代码片段:
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);
有人可以在这里帮忙吗?
谢谢
卡皮尔