问题 Sitecore Lucene:内容传送服务器索引未在发布时更新


我使用默认设置创建了自定义搜索页面 sitecore_web_index 在我迁移到具有单独的内容管理和内容交付服务器的测试环境之前,一切似乎都有效。 CD服务器上的索引没有在发布时更新(CM服务器确实如此),如果我从控制面板重建索引,我会看到更新。所以我相信索引和搜索页面正常工作。

该索引正在使用 onPublishEndAsync 战略。 Sitecore搜索和索引指南(http://sdn.sitecore.net/upload/sitecore7/70/sitecore_search_and_indexing_guide_sc70-usletter.pdf)第4.4.2节规定:

这个策略完全符合顾名思义。在初始化期间,它订阅了    OnPublishEnd event并触发增量索引重建。使用单独的CM和CD服务器   事件将通过。触发 EventQueue 对象,意思是 EventQueue 对象需要   使此策略能够在此类环境中工作。

我的web.config有 <setting name="EnableEventQueues" value="true"/>

同样来自搜索和索引指南:

处理
  该策略将使用 EventQueue 来自数据库的对象初始化为:        <param desc="database">web</param>
  这意味着该策略成功执行有多个标准:

  • 必须在中指定此数据库 <databases /> 配置文件的一部分。
  • EnableEventQueues 设置必须设置为true。
  • EventQueue 预配置数据库中的表应具有日期晚于的条目   index的最后更新时间戳。

我不确定 <param desc="database">web</param> 设置,因为CD服务器的发布目标(和数据库ID)是 pub1。我试过改变 web 至 pub1,但后来两个服务器的索引都没有在发布上更新(所以它改回了 web)。

该系统最近从Sitecore 6.5升级到7.2,因此有几个索引使用 Sitecore.Search API和这些索引在发布时更新。

是数据库参数吗? EventQueue 考虑到多个出版目标,错了吗?还有其他我想念的东西,或者可能是CM的一个实际例子 - >我能比较的CD环境吗?

TIA

编辑: 如果我不想在周五和今天坐在我旁边的同事可以确认,我会认为我会发疯。但现在,CD服务器正在获取索引的更新,但CM服务器没有获得更新。是什么让CM服务器现在无法获得更新?


8986
2017-09-05 19:43


起源

您是否在CM和CD上的include文件夹中包含ScalabilitySettings.config文件? - Ahmed Okour
@AhmedOkour是的,包括ScalabilitySettings.config。 - thadmiller
那么SwitchMasterToWeb.config怎么样?是否包含在CD环境中? - Ahmed Okour
未使用SwitchMasterToWeb.config,CD服务器具有单独维护的web.config,其中包含对已移除主数据库的引用。 - thadmiller
在这种情况下,您需要打开sitecore支持的票证 - Ahmed Okour


答案:


昨晚我遇到了同样的问题,并且比创建一个新的IIS站点具有更可预测的解决方案:

解决方法是在每个CD服务器的ScalabilitySettings.config中设置不同的InstanceName,而不是依赖于自动生成的名称。

设置此值 立即 解决了问题并在发布结束远程事件时恢复了索引更新功能。

注意:如果你已经  在您的配置中定义的InstanceName,然后您需要 更改 为了这个工作。我只是使用日期增加InstanceName以强制进行更改。

这通过更改为新的IIS站点以与原始海报相同的方式有效地修复了同一问题,因为OP的修复将根据新的IIS站点名称修改自动生成的实例名称。

我认为OP(以及我的实例)的核心问题与EventQueue数据库与CD实例不同步有关,并且没有服务器能够确定是否已生成事件/需要更新哪些内容在索引中。通过更改实例名称(使用任一方法),服务器似乎是新实例,并从头开始使用其EventQueue跟踪。

每次我在过去看过这样的问题时,都与Sitecore数据库的主要操作有关。例如,由于部署问题,还原,备份/还原到新数据库名称或数据库回滚。我相信上述操作中的某些内容会导致EventQueues不同步,服务器会停止响应预期的事件。


10
2018-02-01 16:42



这对我们来说也很有效。谢谢发帖。 - robertpateii
我正在将此解决方案更改为已接受的答案,因为它更正确,当然更详细。谢谢你搞清楚这一点。 - thadmiller


我有这个问题,它让我疯了几个月。我发现答案在Lucene指数的重建策略中撒谎。当CM和CD位于IIS的单独实例中时,Lucene知道重建自身的唯一方法是让lucene观察EventQueue表,并认识到某个项目发生了变化,该项目位于根目录或子目录您在爬网程序节点中指定的root。您需要指定为保证此行为的重建策略的策略如下所示

<strategies hint="list:AddStrategy">
  <strategy ref="contentSearch/indexUpdateStrategies/remoteRebuild" />
</strategies>

如果对内容传递服务器的远程实例使用任何其他重建策略,则只能在CM实例的文件系统中重建索引。


2
2018-03-18 21:58



直截了当没有绒毛,这是我喜欢它的方式! - Egli Becerra


如果将来有人遇到这种情况,那对我有用的解决方案是在IIS管理器中创建一个新站点。

我向Sitecore支持提交了一张票,但在一周没有收到回复之后,我试图在我的测试服务器上重新创建我的开发环境。我将本地/ dev文件复制到测试CM服务器,在IIS中创建了一个新站点和AppPool,指向新复制的文件,并更新了connectionstrings.config以指向测试环境数据库。这工作(发布更新了CM Web索引)。

尝试将现有IIS站点指向我的新文件并使用新的AppPool后,从此站点发布将不会更新CM Web索引。

然后我将我的新网站指向预先存在的文件和预先存在的AppPool,它仍然有效。我禁用了预先存在的IIS站点,编辑了新站点上的绑定以匹配预先存在的站点,并且一切正常。

我不知道预先存在的网站有什么“错误”(我继承了系统,因此我不知道它是如何创建的),但比较绑定,基本设置和高级设置,它们是完美的匹配功能新的IIS站点。我希望我能分享这个问题的真正“原因”,但至少我发现了一个对我有用的解决方案。

感谢大家的回复。

[编辑]虽然这个解决方案对我有用,但请使用Laver的答案作为此问题的正确解决方案。


1
2017-09-22 20:04



这个修复程序也适用于Sitecore 7.2,虽然在我的情况下我们使用的是Solr而不是Lucene。 - dthrasher


到目前为止,你似乎走在正确的轨道上。我相信绊倒你的是出版目标。据我所知,您使用pub1作为内容交付(CD)数据库。最佳做法是为每个数据库定义单独的索引。所以你真的应该配置你的CD服务器指向sitecore_pub1_index而不是sitecore_web_index。

您的CM和CD服务器应配置您的pub1数据库。看起来像这样的Sitecore包括补丁配置。如果可能的话,最好不要直接编辑web.config,而是使用include config patches。此示例显示将在\ App_Config \ Include目录中的修补配置:

<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<databases>
  <database id="pub1" singleInstance="true" type="Sitecore.Data.Database, Sitecore.Kernel">
    <param desc="name">$(id)</param>
    <icon>Network/16x16/earth.png</icon>
    <securityEnabled>true</securityEnabled>
    <dataProviders hint="list:AddDataProvider">
      <dataProvider ref="dataProviders/main" param1="$(id)">
        <disableGroup>publishing</disableGroup>
        <prefetch hint="raw:AddPrefetch">
          <sc.include file="/App_Config/Prefetch/Common.config"/>
          <sc.include file="/App_Config/Prefetch/Webdb.config"/>
        </prefetch>
      </dataProvider>
    </dataProviders>
    <proxiesEnabled>false</proxiesEnabled>
    <proxyDataProvider ref="proxyDataProviders/main" param1="$(id)"/>
    <archives hint="raw:AddArchive">
      <archive name="archive"/>
      <archive name="recyclebin"/>
    </archives>
    <cacheSizes hint="setting">
      <data>20MB</data>
      <items>10MB</items>
      <paths>500KB</paths>
      <itempaths>10MB</itempaths>
      <standardValues>500KB</standardValues>
    </cacheSizes>
  </database>
</databases>
</sitecore>
</configuration>

然后,您将需要在CM和CD服务器上配置pub1搜索索引。假设您正在使用lucene,那么补丁配置将如下所示:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<contentSearch>
  <configuration type="Sitecore.ContentSearch.ContentSearchConfiguration, Sitecore.ContentSearch">
    <indexes hint="list:AddIndex">
      <index id="sitecore_pub1_index" type="Sitecore.ContentSearch.LuceneProvider.LuceneIndex, Sitecore.ContentSearch.LuceneProvider">
        <param desc="name">$(id)</param>
        <param desc="folder">$(id)</param>
        <!-- This initializes index property store. Id has to be set to the index id -->
        <param desc="propertyStore" ref="contentSearch/databasePropertyStore" param1="$(id)" />
        <configuration ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration" />
        <strategies hint="list:AddStrategy">
          <!-- NOTE: order of these is controls the execution order -->
          <strategy ref="contentSearch/indexUpdateStrategies/onPublishEndAsync" />
        </strategies>
        <commitPolicyExecutor type="Sitecore.ContentSearch.CommitPolicyExecutor, Sitecore.ContentSearch">
          <policies hint="list:AddCommitPolicy">
            <policy type="Sitecore.ContentSearch.TimeIntervalCommitPolicy, Sitecore.ContentSearch" />
          </policies>
        </commitPolicyExecutor>
        <locations hint="list:AddCrawler">
          <crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">
            <Database>pub1</Database>
            <Root>/sitecore</Root>
          </crawler>
        </locations>
      </index>
    </indexes>
  </configuration>
</contentSearch>
</sitecore>
</configuration>

您现在有一个pub1数据库和搜索索引设置。您应该已将pub1设置为Sitecore中的远程发布目标。您还声明在CM和CD服务器上将EnableEventQueues设置配置为true。

这就是你应该需要的。 onPublishEndAsync将密切关注pub1数据库中的EventQueue表。当您发布到pub1发布目标时,您应该在CD服务器的Sitecore日志* .txt文件中看到与此类似的条目:

ManagedPoolThread #7 23:21:00 INFO  Job started: Index_Update_IndexName=sitecore_pub1_index
ManagedPoolThread #7 23:21:00 INFO  Job ended: Index_Update_IndexName=sitecore_pub1_index (units processed: )

注意:处理的单位似乎从未准确更新,通常为空白。我认为这是一个Sitecore错误,但从来没有挖到足以确定为什么它没有正确显示在日志中。您可以使用Luke(如果您使用的是Lucene)再次验证索引是否已按预期更新。


0
2017-09-06 03:34



(真正的问题)为什么我想在CD服务器上使用pub1? CM服务器上的pub1数据库是CD服务器上的Web数据库。 - thadmiller
@thadmiller你在原始问题中提到“......因为CD服务器的发布目标(和数据库ID)是pub1 ...”所以我只是根据你提供的信息做出答案。如果您的CD服务器指向“Web”,则同样适用,您需要确保为发布目标(数据库)提供索引,并确保这些索引策略与相应的数据库绑定。 - Matt Gartman


看看你的 publish:end:remote 事件,看看那里是否有任何处理程序。如果是这样,请尝试删除所有处理程序以确保它们不会导致任何错误。

从Sitecore 6迁移到7时,我遇到了类似的问题 EventArgs 对于Sitecore 7中的远程发布是不同的。新类型是 PublishEndRemoteEventArgs


0
2017-09-06 19:06



唯一的处理程序 publish:end:remote 是 Sitecore.Publishing.HtmlCacheClearer。我尝试删除它,但没有解决问题,然后我的缓存未在CD服务器上清除。 - thadmiller


这是我们在我们的应用程序中所做的解决方案,我们已经设置了Web和Pub数据库,并创建了另外的publishStrategy,将其指向了pub

<onPublishEndAsyncPub       type="Sitecore.ContentSearch.Maintenance.Strategies.OnPublishEndAsynchronousStrategy, 

Sitecore.ContentSearch">
          <param desc="database">pub</param>
          <!-- whether full index rebuild should be triggered if the number of items in Event Queue exceeds 

Config.FullRebuildItemCountThreshold -->
          <CheckForThreshold>true</CheckForThreshold>
        </onPublishEndAsyncPub>

在索引部分中将新创建的策略设置为pub索引

<index id="sitecore_pub_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider">
            <param desc="name">$(id)</param>
            <param desc="core">itembuckets</param>
            <param desc="propertyStore" ref="contentSearch/databasePropertyStore" param1="$(id)" />
            <strategies hint="list:AddStrategy">
              <strategy ref="contentSearch/indexUpdateStrategies/onPublishEndAsyncPub" />
          <!--<strategy ref="contentSearch/indexUpdateStrategies/remoteRebuild" />-->
            </strategies>
            <locations hint="list:AddCrawler">
              <crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">
                <Database>pub</Database>
                <Root>/sitecore</Root>
              </crawler>
            </locations>
          </index>

0
2018-03-10 00:02





如果您使用Sitecore可伸缩性设置,请确保这是正确的。

不在CD服务器上触发索引的原因主要是由于您的事件队列。您可以执行的一项快速检查是查看Core数据库的EventQueue表中是否存在发布已完成的事件。

另外,检查一下 Sitecore.ContentSearch.config,因为发布结束时,它将触发重建索引。

谢谢


0
2018-03-20 09:14