Lucene.net - 索引期间崩溃

问题描述 投票:0回答:3

我的索引器使用 Lucene,在写入大约 16GB 大小的索引文件后,在索引操作期间似乎崩溃了。

出于我不知道的原因,写入控制台的堆栈跟踪重复了三次。为了简洁起见,我只提供了重复的单个部分。这是 Lucene 写入控制台的堆栈跟踪:

Lucene.Net.Index.MergePolicy+MergeException: Exception of type 'Lucene.Net.Index.MergePolicy+MergeException' was thrown. --->

System.IO.FileNotFoundException: Could not find file 'PATH_TO_MY_INDEX_DIRECTORY\_xx.cfs'.

File name: 'PATH_TO_MY_INDEX_DIRECTORY\_xx.cfs'
at Lucene.Net.Index.IndexWriter.HandleMergeException(Exception t, OneMerge merge)
at Lucene.Net.Index.IndexWriter.Merge(OneMerge merge)
at Lucene.Net.Index.ConcurrentMergeScheduler.MergeThread.Run()
--- End of inner exception stack trace ---
at Lucene.Net.Index.ConcurrentMergeScheduler.HandleMergeException(Exception exc)
at Lucene.Net.Index.ConcurrentMergeScheduler.MergeThread.Run()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

当我使用 Luke 的 Java 版本打开生成的日志时,索引被删除(可能是因为它已损坏,例如“write.lock”文件仍然存在),但这可能是 Luke 的错误或配置错误。

创建此索引大约需要 36 小时,而且我不想第三次再次执行此操作(这不是第一次发生)。

我不知道是什么原因造成的。我能做什么?

我使用的是 Lucene.net 2.9.2,因为它是为 .NET 3.5 构建的最后一个版本。

lucene lucene.net luke
3个回答
4
投票

我意识到这是由于在没有调用

Commit
的情况下向索引写入了太多内容造成的。我修改了代码,在写入大约 10MB 的数据后调用
Commit
。从那以后我就再没有遇到过异常 - 当它崩溃时,这意味着我不需要重建整个 36GB 索引,只需重建最后 10MB。


1
投票

花了一段时间才找到,但结果(就我而言)是本地硬盘已满造成的。更有用的异常消息会很有帮助。


0
投票

对了,参加聚会很晚了,但我在这个例外中遇到了同样的问题:

Exception Info: Lucene.Net.Index.CorruptIndexException
   at Lucene.Net.Index.IndexWriter.HandleMergeException(System.Exception, 
OneMerge)
   at Lucene.Net.Index.IndexWriter.Merge(OneMerge)
   at Lucene.Net.Index.ConcurrentMergeScheduler+MergeThread.Run()

Exception Info: Lucene.Net.Index.MergePolicy+MergeException
   at Lucene.Net.Index.ConcurrentMergeScheduler.HandleMergeException(System.Exception)

    at Lucene.Net.Index.ConcurrentMergeScheduler+MergeThread.Run()
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
    at System.Threading.ThreadHelper.ThreadStart()

我通过删除所有索引并重建它们解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.