Sitecore检查索引是否完整

时间:2015-06-29 08:13:16

标签: c# lucene sitecore

在Sitecore中是否有代码可以检查lucene索引是否存在或完整?

我们正在制定一种机制,以检查索引是否存在或是否完整。如果不是,则需要重建。

编辑:我们使用Sitecore版本7.2

2 个答案:

答案 0 :(得分:5)

一般情况下,您有OnPublishEndAsyncIntervalAsynchronous等策略来保持您的索引最新,并且应该注意它的完整性。

在推出期间的现实世界中,更长的停机时间,网络问题等等,索引可能与Sitecore树或服务器场中的其他索引不一致。为了确定索引是否完整,您必须将Sitecore树与Web场中每个索引的内容进行比较。这需要扫描树,查询索引并进行双向比较。

鉴于该任务的难度,我会考虑手动策略和RemoteRebuildStrategy的组合,并进行夜间重建(如果可用性要求允许的话)。

答案 1 :(得分:2)

确定索引是否已完成并因此索引所有适当项目的最佳方法是检查索引的作业并获取其状态。 Sitecore Marketplace上有一个官方模块,其中包含一个aspx,供您查看当前正在运行的作业。

https://marketplace.sitecore.net/Modules/S/Sitecore_Support_Toolbox.aspx?sc_lang=en

如果您在模块中访问Jobs.aspx,您可以看到检索作业的代码,因此选择与索引相关的代码以获取其状态。这是您在代码中确定所有项目是否已编入索引并且索引已完成的最佳选项。我已经为您提供了以下代码段。

var jobs = JobManager.GetJobs();
var sb = new StringBuilder();
var type = typeof(Sitecore.Jobs.JobManager);
ShowJobs(sb, "Running jobs", ((SafeDictionary<Handle, Job>)type.GetField("_runningJobs", bindingFlags).GetValue(null)).Values.ToArray());
private void ShowJobs(StringBuilder sb, string name, Job[] enumerable)
    {
        sb.AppendLine(name);
        if (enumerable.Length > 0)
        {
            foreach (var job in enumerable)
            {
                long total = job.Status.Total;
                var span = now - job.QueueTime;
                sb.AppendLine(GetColor(job.Handle.ToString()) + job.QueueTime.ToLongTimeString() + If(() => span.Hours.ToString() == "0", () => string.Empty, () => span.Hours.ToString() + "h ") + If(() => span.Minutes == 0, () => string.Empty, () => span.Minutes.ToString() + "m ") + span.Seconds + "s ago)" + job.Name + job.Status.Processed + (total > 0 ? " of " + total : string.Empty) + job.Options.Priority);
            }
        }
        else
        {
            sb.AppendLine("No jobs");
        }
    }