indexing - Sitecore solr索引重建和刷新之间的区别

标签 indexing solr sitecore sitecore7.2

我们想知道Sitecore 完整索引重建索引刷新 之间有什么区别。当我们想要刷新索引中的项目时,大约需要 2 分钟。主索引的完全重建大约需要 10 分钟。为什么索引刷新这么耗时?

我们正在使用此代码刷新项目:

Sitecore.Data.Item item = GetItem();
var masterIndex = ContentSearchManager.GetIndex("sitecore_master_index");
masterIndex.Refresh(new SitecoreIndexableItem(item));

最佳答案

我正在查看 Sitecore.ContentSearch 程序集的反编译源代码,看起来 Refresh 方法最终调用 IndexCustodian< 上的 RefreshTree 方法 类。 RefreshTree 将为要索引的项目创建一个新的对象数组,然后迭代所有可用索引(即使您从特定索引调用它)并为每个索引创建一个刷新作业其中(添加到队列中进行处理):

public static IEnumerable<Job> RefreshTree(IIndexable startItem)
{
    Assert.ArgumentNotNull(startItem, "startItem");
    CrawlingLog.Log.Debug(string.Format("IndexCustodian. RefreshTree triggered on item {0}.", startItem.AbsolutePath), null);
    return 
        from index in ContentSearchManager.Indexes
        select IndexCustodian.Refresh(index, startItem);
}

public static Job Refresh(ISearchIndex index, IIndexable indexable)
{
    Assert.ArgumentNotNull(index, "index");
    Assert.ArgumentNotNull(indexable, "indexable");
    object[] objArray = new object[] { indexable };
    JobOptions jobOptions = IndexCustodian.GetJobOptions(index, "Refresh", objArray, true);
    jobOptions.CustomData = indexable;
    CrawlingLog.Log.Debug(string.Format("IndexCustodian. Refresh triggered on index {0}. Data={1}", index.Name, jobOptions.CustomData), null);
    return JobManager.Start(jobOptions);
}

FullRebuild 方法(也在 IndexCustodian 中)调用 CreateRebuildJob,它直接创建一个要处理的作业:

public static Job FullRebuild(ISearchIndex index, bool start = true)
    {
        return IndexCustodian.CreateRebuildJob(index, new EventHandler<JobStartedEventArgs>(IndexCustodian.RebuildStartedHandler), new EventHandler<JobFinishedEventArgs>(IndexCustodian.RebuildFinishedHandler), start, null);
    }

private static Job CreateRebuildJob(ISearchIndex index, EventHandler<JobStartedEventArgs> startedHandler = null, EventHandler<JobFinishedEventArgs> finishedHandler = null, bool start = true, object[] parameters = null)
    {
        Assert.ArgumentNotNull(index, "index");
        JobOptions jobOptions = IndexCustodian.GetJobOptions(index, "Rebuild", parameters, false);
        Job job = new Job(jobOptions);
        if (startedHandler != null)
        {
            job.Started += startedHandler;
        }
        if (finishedHandler != null)
        {
            job.Finished += finishedHandler;
        }
        if (start)
        {
            CrawlingLog.Log.Warn(string.Format("IndexCustodian. FullRebuild triggered on index {0}.", index.Name), null);
            JobManager.Start(job);
        }
        return job;
    }

因此,Refresh 方法通过迭代索引而产生一些开销,然后依赖于 JobManager 来排队和处理刷新作业(如果找到多个索引,则会有多个开销) )。

关于indexing - Sitecore solr索引重建和刷新之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30255139/

相关文章:

mongodb - 在 Sitecore 8 中重建报告数据库

excel - 匹配 excel 中的 2 列以在第 3 列中显示值

mysql - 如何为具有组合主键的表创建索引?

使用 copyField 突出显示 Solr

sitecore - 在 Sitecore 7.2 中获取页面级测试结果

msbuild - 在 TeamCity 构建中找不到 "TransformXml"任务(错误 MSB4036)

mysql large varchar 或 text - 使用频繁访问的字段进行索引

ruby - 在 Ruby 中的索引位置替换字符

mysql - 将数据导入处理程序添加到 ColdFusion 2016 Solr

java - Solr lucene schema.xml多值条目,请帮助