Sitecore 7.2中使用Lucene的热插拔索引

时间:2014-07-21 10:08:00

标签: search indexing lucene sitecore sitecore7.2

我正在尝试新的Sitecore 7.2功能 SwitchOnRebuildLuceneIndex

显然,此功能允许我以只读模式访问我的索引,同时我正在重建索引。

有没有办法在我重建索引的同时拥有完整的操作索引(不是只读)?

我正在进行的测试如下:

1)使用30k项目重建自定义索引(需要30秒)

2)同时索引正在重建:添加Sitecore项目(通过代码)

3)同时索引重建:访问自定义索引(通过代码)以获取项目数

4)索引完成重建后:访问自定义索引(通过代码)获取项目数

在步骤3中,它返回原始项目计数30000 在步骤4中,它返回更新的项目计数30001

感谢您的帮助 斯泰利奥

2 个答案:

答案 0 :(得分:1)

我不相信这是可能的。从概念上讲,Sitecore本质上是一种软件,它使数据库更加用户友好,并定义了技术人员和非技术人员都能理解和遵循的结构。您所谈论的内容与ACID,数据库lockstransactions的概念背道而驰。我已经在您的步骤(内联,下面)中注释了更多技术(数据库)注释:

  1. 重建自定义索引... - 锁定数据库中的项目并启动交易
  2. 同时......:添加一个sitecore项目... - 针对这些项目运行的单独事务,但不会影响步骤1中启动的事务所使用的锁定集
  3. 同时......:访问自定义... - 另一个事务在步骤2中的事务之后运行,因此包括所有项目的计数(包括锁定集和新添加的项目)
  4. 索引完成后
  5. ... - 事务1完成并锁定释放;如果没有从索引中计算,从自定义索引中获取项目的计数会返回与项目数不同的计数(后者更大,因为添加了新项目)
  6. 因此,步骤3返回新的项目数,步骤4返回原始项目。

答案 1 :(得分:0)

如果要跟踪索引重建期间发生的更改,可以使用IntervalAsynchronousStrategy作为索引重建策略。

    <strategies hint="list:AddStrategy">
      <intervalAsyncMaster type="Sitecore.ContentSearch.Maintenance.Strategies.IntervalAsynchronousStrategy, Sitecore.ContentSearch">
        <param desc="database">master</param>
        <param desc="interval">00:00:05</param>
        <!-- whether full index rebuild should be triggered if the number of items in history engine exceeds ContentSearch.FullRebuildItemCountThreshold -->
        <CheckForThreshold>true</CheckForThreshold>
      </intervalAsyncMaster>
    </strategies>

这将读取历史记录表并相应地更新您的索引。 如果您检查此类的Sitecore实现,您可以看到它处理重建事件。如果正在运行重建,则它不会执行任何操作并等待下次调度,并且如果重建已完成,则会从历史记录表中收集条目并将其应用于索引。请参阅类的Run方法:

...
    if (IndexCustodian.IsIndexingPaused(this.index))
    {
        CrawlingLog.Log.Debug(string.Format("[Index={0}] IntervalAsynchronousUpdateStrategy triggered but muted. Indexing is paused.", this.index.Name), null);
    }
    else if (IndexCustodian.IsRebuilding(this.index))
    {
        CrawlingLog.Log.Debug(string.Format("[Index={0}] IntervalAsynchronousUpdateStrategy triggered but muted. Index is being built at the moment.", this.index.Name), null);
    }
    else
    {
        CrawlingLog.Log.Debug(string.Format("[Index={0}] IntervalAsynchronousUpdateStrategy executing.", this.index.Name), null);
        HistoryEntry[] history = HistoryReader.GetHistory(this.Database, this.index.Summary.LastUpdated); 

...