【问题标题】:[AzureDirectory]Lucene.NET indexes get corrupted when we restart webrole[AzureDirectory] ​​Lucene.NET 索引在我们重新启动 webrole 时损坏
【发布时间】:2013-02-09 15:26:15
【问题描述】:

我们在项目中使用 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:line 741 中的 Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run() 在 C:\Dev\code\Lucene.Net\Index\DirectoryIndexReader.cs:line 140 中的 Lucene.Net.Index.DirectoryIndexReader.Open(Directory directory, Boolean closeDirectory, IndexDeletionPolicy deletePolicy) 在 C:\Dev\code\Lucene.Net\Index\IndexReader.cs:line 257 中的 Lucene.Net.Index.IndexReader.Open(Directory directory, Boolean closeDirectory, IndexDeletionPolicy deletePolicy) 在 C:\Dev\code\Lucene.Net\Index\IndexReader.cs:line 236 中的 Lucene.Net.Index.IndexReader.Open(目录目录) 在 C:\Dev\code\Lucene.Net\Search\IndexSearcher.cs:line 91 中的 Lucene.Net.Search.IndexSearcher..ctor(目录目录)

但是,当我重新检查 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);

有人可以帮忙吗?

谢谢

卡皮尔

【问题讨论】:

    标签: azure lucene lucene.net


    【解决方案1】:

    我会首先使用 Process Monitor 来验证丢失的文件是否位于您认为的位置 - 当服务器配置发生更改时,在升级过程中很容易(至少对我而言)遇到这样的错误从你下面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多