[AzureDirectory]当我们重新启动webrole时,Lucene.NET索引被破坏了

时间:2013-02-09 15:26:16

标签: azure lucene lucene.net

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

有人可以帮忙吗?

由于

卡皮尔西

1 个答案:

答案 0 :(得分:0)

我首先使用进程监视器来验证丢失的文件是否位于您认为的位置 - 在服务器配置更改时升级过程中很容易(至少对我来说)这样的错误来自你的下方。