1

我们在我们的项目中使用 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);

有人可以在这里帮忙吗?

谢谢

卡皮尔

4

1 回答 1

0

我将首先使用 Process Monitor 来验证丢失的文件是否位于您认为的位置 - 当服务器配置从您下方更改时,在升级期间很容易(至少对我而言)遇到这样的错误.

于 2013-02-10T17:00:05.377 回答