プロジェクトで Lucene.NET を使用しており、AzureDirectory ライブラリ ( https://azuredirectory.codeplex.com/ )を通じて使用しています。
1 つの webrole と 1 つの worker ロールがあります。インデックスは、worker ロール スレッドを介して作成および更新されます。IndexSearcher を作成して、webrole から検索します。現在私が直面している問題は、管理コンソールを使用して cspkg をアップグレードし、prodn サーバーのビットをアップグレードすると、作成された lucene インデックスが突然機能しなくなることです。次のようなエラーが表示されます。
ファイル _2c.fdt が見つかりません (FileNotFoundException)
C:\Dev\code\Lucene.Net\Index\SegmentInfos.cs:line 741 の Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run() で Lucene.Net.Index.DirectoryIndexReader.Open(Directory directory, Boolean closeDirectory C:\Dev\code\Lucene.Net\Index\DirectoryIndexReader.cs:C:\Dev\ の Lucene.Net.Index.IndexReader.Open(Directory directory, Boolean closeDirectory, IndexDeletionPolicy RemovalPolicy) の 140 行目code\Lucene.Net\Index\IndexReader.cs: C:\Dev\code\Lucene.Net\Index\IndexReader.cs: Lucene.Net.Index.IndexReader.Open(ディレクトリ ディレクトリ) の 257 行: Lucene の 236 行C:\Dev\code\Lucene.Net\Search\IndexSearcher.cs の .Net.Search.IndexSearcher..ctor(ディレクトリ ディレクトリ):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 Role コード部分 (検索用):
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);
誰かがここで助けてもらえますか?
ありがとう
カピル