我有一个使用Lucene.net 3.0.3的asp.net核心Web应用程序,目前正在使用x86架构:
<TargetFramework>net461</TargetFramework>
<RuntimeIdentifier>win7-x86</RuntimeIdentifier>
在将文档写入索引时,过程非常顺利 - 调用IndexWriter.AddDocument
只需不到一秒钟,并且没有记录停止。
我们尝试转移到win7-x64
,但我们注意到我们的lucene重建索引需要更长的时间。在大多数情况下,调用IndexWriter.AddDocument在x86
和x64
上花费的时间相同。然而,在x64
上,每隔几千条记录 - 会有一个文件在IndexWriter.AddDocument
上需要15秒!
有关为什么会发生这种情况和/或如何调试和修复它的任何想法?
这就是代码的样子:
private void AddItemToIndex(TInput indexItem, IndexWriter writer)
{
var searchQuery = new TermQuery(new Term("Id", NumericUtils.IntToPrefixCoded(indexItem.Id)));
writer.DeleteDocuments(searchQuery);
var document = GetDocumentsFromIndexItem(indexItem);
//this is the line that will sometimes take 15 seconds
writer.AddDocument(document);
}
private Document GetDocumentsFromIndexItem(LuceneIndexItemDto item)
{
var indexDocument = new Document();
indexDocument.Add(new NumericField(nameof(item.Id), Field.Store.YES, true).SetIntValue(item.Id));
indexDocument.Add(new Field($"{nameof(item.Id)}String", item.Id.ToString(), Field.Store.YES, Field.Index.ANALYZED));
indexDocument.Add(new Field(nameof(item.Title), item.Title ?? "", Field.Store.YES, Field.Index.ANALYZED));
indexDocument.Add(new Field(nameof(item.Description), item.Description ?? "", Field.Store.YES, Field.Index.ANALYZED));
foreach (var note in item.Notes)
{
indexDocument.Add(new Field(nameof(item.Notes), note ?? "", Field.Store.YES, Field.Index.ANALYZED));
}
return indexDocument;
}
更新1:我开始通过Lucene.net进行调试,我发现当Lucene调用Flush时会发生失速。因此,它的冲洗需要很长一段时间。
由于你的代码看起来不错,这是建议如何尝试和调试它。
首先,你必须在某处记录Lucene的所有信息,这样你就会知道发生了什么。编写自己的Lucene.Net.Util.InfoStream,并将所有信息写入数据库。这是一个示例,如何使用log4net编写它:
public class Log4NetInfoStream : InfoStream
{
private readonly ILog _log;
public Log4NetInfoStream()
{
_log = LogManager.GetLogger(GetType());
}
public override bool IsEnabled(string component)
{
return true;
}
public override void Message(string component, string message)
{
_log.DebugFormat("{0} :: {1}", component, message);
}
}
然后当您的程序启动时,将其设置为:
Lucene.Net.Util.InfoStream.Default = new Log4NetInfoStream();
之后,您将能够检查您的应用程序中发生了什么。
如果这没有帮助,请安装Process Monitor,并检查这15秒延迟的确切位置。我有一种感觉,这与Lucene无关,但是你的机器有问题。也许它无法访问某些东西,某些网络驱动器或代理。这个工具会告诉你。