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

问题描述 投票:12回答:8

我使用默认的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事件并触发增量索引重建。使用单独的CM和CD服务器,此事件将通过EventQueue对象触发,这意味着需要启用EventQueue对象才能使此策略在此类环境中工作。

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

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

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

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

我不确定<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服务器现在无法获得更新?

lucene sitecore sitecore7
8个回答
13
投票

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

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

设置此值会立即解决问题,并在发布End Remote事件时恢复索引更新功能。

注意:如果您已在配置中定义了InstanceName,则需要对其进行更改才能使其生效。我只是使用日期增加InstanceName以强制进行更改。

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

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

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


2
投票

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

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

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


2
投票

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

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

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

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

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

感谢大家的回复。

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


0
投票

到目前为止,你似乎走在正确的轨道上。我相信绊倒你的是出版目标。据我所知,您使用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
投票

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

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


0
投票

这是我们在您的应用程序中所做的解决方案,我们已经设置了Web和Pub数据库,并创建了将其指向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
投票

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

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

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

谢谢


0
投票

@ Laver的修复确实对我们有用,但由于我们的InstanceName是通过我们的构建过程生成的,所以我不想改变它。我做了一些挖掘,发现问题的根本原因是数据存储在core数据库的Properties表中。

您可以在this Sitecore Stack Exchange Q&A中查看完整的文档,但解决方案如下所示。

该解决方案需要App Pool循环才能生效:

  1. core数据库执行以下SQL语句 DELETE FROM [Properties] WHERE [Key] LIKE '%_LAST_UPDATED_TIMESTAMP%'
  2. 回收CD的AppPool

在此之后,您将需要重建CD上的索引,以便它们获取在索引被破坏时遗漏的任何更改。

© www.soinside.com 2019 - 2024. All rights reserved.