我有一个使用Lucene.net 3.0.3且当前使用x86体系结构的asp.net核心Web应用程序:
<TargetFramework>net461</TargetFramework>
<RuntimeIdentifier>win7-x86</RuntimeIdentifier>
将文档写入索引时,过程很顺利-调用IndexWriter.AddDocument
只需不到一秒钟的时间,并且没有没有记录停滞。
我们尝试移动到win7-x64
,但是我们注意到,进行lucene重新索引需要花费更长的时间。在大多数情况下,在x86
和x64
上调用IndexWriter.AddDocument花费的时间相同。但是,在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时。因此,冲洗需要很长时间。
答案 0 :(得分:0)
由于您的代码看起来还不错,所以这是如何尝试调试的建议。
首先,您必须在所有地方记录来自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没有关系,但是您的计算机出了点问题。也许它无法访问某些内容,某些网络驱动器或代理。该工具将向您显示。