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

时间:2014-09-05 19:43:27

标签: lucene sitecore sitecore7

我使用默认的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表的条目日期应晚于   index的最后更新时间戳。
  •   

我不确定<param desc="database">web</param>设置,因为CD服务器的发布目标(和数据库ID)是pub1。我尝试将web更改为pub1,但之后两个服务器的索引都没有在发布时更新(因此它已更改回web)。

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

考虑到多个发布目标,EventQueue上的数据库参数是否错误?还有其他我想念的东西,或者是一个CM的工作示例 - &gt; CD环境我可以比较吗?

TIA

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

8 个答案:

答案 0 :(得分:13)

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

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

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

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

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

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

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

答案 1 :(得分:2)

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

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

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

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

我不知道&#34;错误&#34;使用预先存在的站点(我继承了系统,因此我不知道它是如何创建的),但是比较绑定,基本设置和高级设置,它们与功能性新的IIS站点完美匹配。我希望我有真正的&#34;原因&#34;要分享的问题,但至少我找到了一个适合我的解决方案。

感谢所有回复。

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

答案 2 :(得分:2)

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

之下

&#13;
&#13;
<strategies hint="list:AddStrategy">
  <strategy ref="contentSearch/indexUpdateStrategies/remoteRebuild" />
</strategies>
&#13;
&#13;
&#13;

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

答案 3 :(得分: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)再次验证索引已按预期更新。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

以下是我们在我们的应用程序中所做的解决方案,我们已经设置了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

<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>

答案 6 :(得分:0)

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

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

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

由于

答案 7 :(得分:0)

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

您可以在this Sitecore Stack Exchange Q&A中看到完整的文档,但是下面复制了该解决方案。

  

该解决方案需要AppPool回收才能生效:

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

此后,您将要重建CD上的索引,以便   他们获取索引中断时错过的所有更改。