将架构更改为x64后,Lucene IndexWriter.AddDocument变慢

时间:2019-03-29 17:33:03

标签: c# asp.net-core .net-core lucene lucene.net

我有一个使用Lucene.net 3.0.3且当前使用x86体系结构的asp.net核心Web应用程序:

<TargetFramework>net461</TargetFramework>
<RuntimeIdentifier>win7-x86</RuntimeIdentifier>

将文档写入索引时,过程很顺利-调用IndexWriter.AddDocument只需不到一秒钟的时间,并且没有没有记录停滞。

我们尝试移动到win7-x64,但是我们注意到,进行lucene重新索引需要花费更长的时间。在大多数情况下,在x86x64上调用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时。因此,冲洗需要很长时间。

1 个答案:

答案 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没有关系,但是您的计算机出了点问题。也许它无法访问某些内容,某些网络驱动器或代理。该工具将向您显示。